Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Автоматическая установка приложений (http://forum.oszone.net/forumdisplay.php?f=61)
-   -   Скрипты Inno Setup. Помощь и советы [часть 5] (http://forum.oszone.net/showthread.php?t=235078)

El Sanchez 21-05-2012 03:49 1919574

Скрипты Inno Setup. Помощь и советы [часть 5]
 
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]
Скрипты Inno Setup. Помощь и советы [часть 4]

Gnom_aka_Lexander 21-05-2012 10:58 1919709

Цитата:

Цитата LinkOFF
Всем доброй ночи. У меня вопрос: а можно ли сделать так чтоб если рядом с сетапом нет нужного архива фриарк то инсталл показывал его отсутствие? »

Очень просто :
Код:

  if not FileExist('твой файл')  then
      if MsgBox('Файл не найден, прервать установку?',mbError, MB_OKCANCEL) = IDOK then // тут прерываем установку, если нажата кнопка ОК


Johny777 21-05-2012 12:48 1919796

Что- то у меня не получается создать ярлык в меню "Пуск"
вылетает с ошибкой
читать дальше »

---------------------------
Ошибка запуска
---------------------------
Строка 6653:

Exception: IPersistFile::Save: сбой; код 0x80070003.

Системе не удается найти указанный путь.
---------------------------
ОК
---------------------------
на строке (выделил жирным)

Код:


 if CurStep = ssPostInstall then
    begin
      //CreateDir(ExpandConstant('{group}\Source Engine 15'));
      CreateShellLink(ExpandConstant('{group}\Source Engine 15\SAVE.lnk'), 'Описание', ExpandConstant('{app}\uninstall\SAVE.exe'), '', ExpandConstant('{app}\uninstall'), ExpandConstant('{app}\combine_icon.ico'), 0, SW_SHOWNORMAL);

Секции [Icons] нет. Значки на рабочем столе создаются (таким же макаром) нормально, а этот не хочет!
Скажите пожалуйста где я опять накосячил :(
прикладываю скрипт с файлом иконки

Gnom_aka_Lexander 21-05-2012 14:39 1919872

Johny777, могу посоветовать создать все-таки, секцию [Icons] и просто скрыть страницу выбора папки в меню пуск. Сам сталкивался с засадой именно с иконками в пуск из кода. сейчас не вспомню точно, но вроде так и пришлось из [Icons] делать.

Edison007 21-05-2012 17:13 1919960

Johny777
Попробуй так:
Код:

CreateDir(ExpandConstant('{userprograms}\Source Engine 15'));
CreateShellLink(ExpandConstant('{userprograms}\Source Engine 15\SAVE.lnk'), 'Описание', ExpandConstant('{app}\uninstall\SAVE.exe'), '', ExpandConstant('{app}\uninstall'), ExpandConstant('{app}\combine_icon.ico'), 0, SW_SHOWNORMAL);


Ivan_009 22-05-2012 10:43 1920273

Как в инсталляторе вместо bmp картинок использовать png картинки... :search: Заранее спасибо.

Johny777 22-05-2012 10:51 1920276

Ivan_009,
ботвой в окне инсталла
http://ifolder.ru/22008153
а в сплэше через isgsg.dll, которая идёт в комплекте с GameScript Generator
http://forum.csmania.ru/viewtopic.php?t=4688
этой же библиотекой и фон и слайдшоу (png Jpeg и прочие)

LinkOFF 22-05-2012 20:46 1920697

Лександер, а в какую процедуру вставлять

Gnom_aka_Lexander 22-05-2012 20:58 1920702

LinkOFF, что именно?

Ivan_009 23-05-2012 13:28 1921007

Как сделать, чтобы эта функция; SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) or $2000000); работала вместе со слайдшоу...А то эфекты слишком тормозят... :beta:

Johny777 23-05-2012 14:34 1921049

Ivan_009,
её нужно отключать во время работы той, что отвечает за эффекты
в этом сообщении El Sanchez в первом "читать далее" показано как это сделать (отключить стиль)
http://forum.oszone.net/post-1904450.html#post1904450

ASheff 23-05-2012 19:32 1921219

Доброго времени суток всем, помогите с проблемой:

---------------------------
Ошибка
---------------------------
Runtime Error (at -1:0):


Cannot Import dll:<utf8>C:\Users\usrname\AppData\Local\Temp\is-8C3H3.tmp\mydll.dll.
---------------------------
ОК
---------------------------





в скрипте:

--------------------------------------------------
[Files]
Source: "D:\Projects\mycomp\prod\Utils\mydll\Release\mydll.dll"; DestDir: "{app}"; Flags: ignoreversion

[code]
function somefunc(str: string): Integer; external 'somefunc@files:mydll.dll stdcall';
--------------------------------------------------






Mydll написана как unicode с++ проект, экспорт ф-ции происходит вот так:

Код:

__declspec(dllexport) int somefunc(LPCTSTR szInstLocation);
В чем может быть проблема? Пол дня уже бьюсь..

Ivan_009 23-05-2012 20:07 1921239

Johny777 можно поподробней ато все равно эфекты почемуто глючат :o

Serega 23-05-2012 20:51 1921266

Цитата:

Цитата ASheff
В чем может быть проблема? Пол дня уже бьюсь.. »

LPCTSTR = PAnsiChar;
Одним словом, надо так:
Код:

[Files]
Source: "D:\Projects\mycomp\prod\Utils\mydll\Release\mydll.dll"; Flags: dontcopy

[Code]
function somefunc(str: PAnsiChar): Integer; external 'somefunc@files:mydll.dll stdcall';


El Sanchez 23-05-2012 20:57 1921268

Цитата:

Цитата Ivan_009
все равно эфекты почемуто глючат »

Ivan_009, отключайте стиль, прежде чем начнутся эффекты. Код покажите.

Ivan_009 23-05-2012 21:22 1921287

Вот

El Sanchez 23-05-2012 22:05 1921306

Ivan_009, ок. В процедуре CurPageChanged2 перед InitializeSlideShow отключаете стиль, а после DeinitializeSlideShow включаете назад.
Код:

procedure CurPageChanged2(CurPageID: Integer);
begin
 If CurPageID=wpInstalling then
  begin
  SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) xor $2000000);
  InitializeSlideShow(WizardForm.Handle, 0, 100, scaleX(778), ScaleY(358), {#Animation}, {#Stretch});
  ...
  if CurPageID=wpFinished then
  begin
  ...
  DeinitializeSlideShow;
  SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) or $2000000);
  ...
end;


LinkOFF 24-05-2012 03:07 1921459

Лександер,
Цитата:

Цитата Лександер
if not FileExist('твой файл') then
if MsgBox('Файл не найден, прервать установку?',mbError, MB_OKCANCEL) = IDOK then // тут прерываем установку, если нажата кнопка ОК »


Gnom_aka_Lexander 24-05-2012 09:31 1921536

LinkOFF, ну так. Это нужно писать туда, где ты распаковываешь архивы. теоретически можно вообще на запуске проверить их все на наличие, и если хоть одного не хватает - можно смело полностью отменять установку.

ASheff 24-05-2012 12:13 1921648

Цитата:

Цитата Serega
LPCTSTR = PAnsiChar;
Одним словом, надо так:
Код:
[Files]
Source: "D:\Projects\mycomp\prod\Utils\mydll\Release\mydll.dll"; Flags: dontcopy
[code]
function somefunc(str: PAnsiChar): Integer; external 'somefunc@files:mydll.dll stdcall';

В общем докладываю: поменял на PAnsiChar вместо string - ничего не изменилось.. Может это тоже внесло конечно свою лепту..

Далее начал ковырять свою dll: вместо _declspec(dllexport) сделал экспорт через .def-файл - всё заработало! :rupor:
в Depends пропал знак вопроса перед именем моей экспортируемой функции, не силен, не знаю, с чем это связано..

Как то так :)

ASheff 24-05-2012 15:26 1921733

Еще вопрос - как получить hwnd окна деинсталлятора?
пробую в CurUninstallStepChanged (usUninstall) использовать MainForm, при запуске деинсталлятора пишет:

---------------------------
Ошибка
---------------------------
Runtime Error (at 21:566):

Внутренняя ошибка: An attempt was made to access MainForm before it has been created.
---------------------------
ОК
---------------------------

alert30 24-05-2012 15:49 1921747

Как сделать инсталлятор, что до подготовленной установки, распаковался шрифт (всего лишь 1 штук, к пути: C:\WINDOWS\Fonts) и сделать в подготовленном инсталляторе, чтоб все страницы изменялись шрифты.

Johny777 24-05-2012 16:48 1921811

ASheff,
в деинсталятре не основная форма инсталла (MainForm), а
Код:

procedure InitializeUninstallProgressForm;
begin
  UninstallProgressForm.AutoScroll := False;
...

то бишь другая


alert30,

в шапке классный пример El Sanchez
"Свой шрифт в инсталляторе"
сам использую
пока инсталл делаю сбоев не обнаружил :) !

alert30 24-05-2012 17:04 1921829

Johny777, а как же распаковка файлов до начала подготовительной установки?

Johny777 24-05-2012 17:20 1921843

Цитата:

Цитата alert30
до начала подготовительной установки »

Я, если честно, не совсем понимаю что ты имеешь в виду под "подготовительной установкой" :(
схему установки пожалуйста (или кусок скрипта, где всё тобой описанное происходит)
и на каком этапе должен быть задействован шрифт?

alert30 24-05-2012 17:26 1921847

Схема такая через стрелки: запуск программы -> распаковка файлов, ну например шрифт MyriadPro Regular: C:\WINDOWS\Fonts -> начало подготовительной установки ("Вас приветствует Мастер установки...").

Вообще, надо сделать так, чтоб пользователи навсегда увидели инсталлятор со шрифтом типа MyriadPro Regular, а не стандартные. Хоть даже, что шрифт типа MyriadPro Regular не установлен.

ASheff 24-05-2012 17:28 1921849

Цитата:

Цитата Johny777
в деинсталятре не основная форма инсталла (MainForm), а
Код:
procedure InitializeUninstallProgressForm;
begin
UninstallProgressForm.AutoScroll := False;
...
то бишь другая »

Ага, спасибо! Работает :)

Johny777 24-05-2012 17:32 1921852

alert30,
не вижу проблем
в начале процедуры InitializeWizard ставишь шрифт а потом создаёшь всё остальное (лейблы, чекбоксы...), которое этот шрифт использует
шрифт всего инсталла ставишь так:
Код:

procedure InitializeWizard;
begin

  /// ставим временный шрифт

  WizardForm.Font.Name:= 'Tahoma';  /// или другое название

Цитата:

Цитата alert30
начало подготовительной установки »

у тебя часом не форма(что-то вроде подготовительной) перед появлением основного окна?
если да значит до создания формы
в самом начале

alert30 24-05-2012 17:37 1921855

Johny777, а если например пользователь не установит этот шрифт (возьмем Arial). Шрифт же поменяется на стандартный (Tahoma), как обычно.

Johny777 24-05-2012 17:40 1921858

Цитата:

Цитата alert30
а если например пользователь не установит этот шрифт (возьмем Arial) »

так ты его ставишь (а точнее инсталл в начале своей инициализации), а не пользователь
в том коде проверка есть или нет шрифта в системе пользователя, а если нет, то тут же будет!
а при деинициализации (отмена, установка завершена) шрифт слетает, если был установлен

alert30 24-05-2012 17:41 1921861

Johny777, это да, но как автоматически установить шрифт до начала "Вас приветствует...". В деинсталляции пусть останется, вдруг кому может сделать документ в этой шрифте.

Johny777 24-05-2012 17:45 1921863

Ты об этом
Цитата:

Цитата alert30
"Вас приветствует...". »

-


-?

alert30 24-05-2012 17:46 1921864

Цитата:

Цитата Johny777
Ты об этом »

Не только, всю страницу.

Цитата:

Цитата Johny777
если да значит до создания формы »

Вот это я имел ввиду до появлении этих "форм".

Johny777 24-05-2012 18:00 1921876

вот как ты хотел, с Ариалом (в качестве примера)
оно?
главное в самом начале секции ставь установку шрифта

Dark_Delphin 24-05-2012 18:29 1921902

Всем привет.
Подскажите пример наложения логотипа.PNG на инсатллятор без Fairy.dll
Заранее спасибо.

Gnom_aka_Lexander 24-05-2012 18:37 1921906

Dark_Delphin, на ботве - кнопку делашь, со всеми 4-мя положениями одинаковыми и кладешь ее на стекло. а может и картинка прокатит, хотя вроде раньше не ложилась.

Dark_Delphin 24-05-2012 18:51 1921918

Лександер, мне не на стекло.

Gnom_aka_Lexander 24-05-2012 18:53 1921921

Dark_Delphin, тем более. но лучше кнопкой - ее кликабельной проще сделать и параметры удобные, курсор можно вкорячить одной строчкой и т.п.

Dark_Delphin 24-05-2012 18:54 1921923

Лександер, а где пример можно посмотреть?

Johny777 24-05-2012 18:58 1921925

Dark_Delphin,
в твоём случае проще обойтись без ботвы
тебе поможет наш друг "Image Button" и фотошоп
(другой пример, который я укорачивал это Inno Setup 5\Examples\Example_MouseEvent_ImgBtn.iss)
прикладываю архив с укороченный под свои нужды кодом (думаю тебе в самый раз. При желании можно добавить состояние "при наведении") .

Dark_Delphin 24-05-2012 19:02 1921927

Johny777, у BMP фон есть...

Johny777 24-05-2012 19:03 1921929

Dark_Delphin,
ну есть
тебе ж не на стекло
сделай тот фон на который кладёшь (цвет)

Dark_Delphin 24-05-2012 19:08 1921933

Johny777, у меня в инсатлляторе фоновая картинка.
Вот почему нужно *PNG

Johny777 24-05-2012 19:19 1921943

Dark_Delphin,
ну так возьми кусок картинки как фон
дай мне свою картинку и пнг нужного размера
я тебе сейчас пример текстур сделаю
а пнг это ботва
по другому фиг знает

Dark_Delphin 24-05-2012 19:30 1921956

Спасибо всем за помощь)
Вот, что получилось:

Creator000 24-05-2012 19:33 1921960

code

[Components]
Name: "rus"; Description: "Русская версия"; Types: rus
Name: "eng"; Description: "Английская версия"; Types: eng

[Types]
Name: "rus"; Description: "На русском языке";
Name: "eng"; Description: "На английском языке";

[Files]
Source: "D:\HL2EP1\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Components: rus; Source: "{src}\Rus\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs external

Этот код Я понимаю будет копировать файлы из определенной папки? А можно эту папку засунуть в инстал и копировать файлы от туда?

Dark_Delphin 24-05-2012 19:41 1921969

Creator000, так он не копирует файлы из папки.. Он в инсатлл компилируется и потом при установке устанавливается в папку (в вашем случае в корневую папку.)

Creator000 24-05-2012 20:14 1921992

Dark_Delphin, то есть файлы будут просто копироваться из инстала?

Dark_Delphin 24-05-2012 20:26 1922000

Creator000, да.

Creator000 24-05-2012 20:54 1922019

Dark_Delphin, файлы копируются, только почему деинсталлятор создается? мне он не нужен. это просто набор файлов.

Dark_Delphin 24-05-2012 20:56 1922020

Creator000, причём здесь компоненты и деинсталлятор?

Creator000 24-05-2012 21:06 1922023

Dark_Delphin, можно IS заставить копировать файлы из своего инстала без всяких деинсталляторов?

nik1967 24-05-2012 22:52 1922071

Creator000, тебе же ответили на Кринкельсе:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp
DisableReadyPage=yes
DisableProgramGroupPage=true
ShowComponentSizes=no
Uninstallable=not IsComponentSelected('port')

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: norm; Description: Установка; Flags: exclusive
Name: port; Description: Распаковка; Flags: exclusive

[Files]
Source: твой файл; DestDir: {app}\; Components: norm
Source: твой файл; DestDir: {app}\; Components: port

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


Creator000 24-05-2012 23:02 1922080

nik1967, Я тут недавно, так что не знаю кто тут мне отвечал .

Devils Night 25-05-2012 04:47 1922156

Creator000, Почитай от сюда.

Go_Ram 25-05-2012 11:56 1922309

Заказ создание установщика на Inno
 
Всем привет, совсем недавно я начал работать с яндекс и тут же возникла такая проблемма. Нужно в инстляторе сделать при установке возможность выбора пользователя на установку яндекс бар и других параметров, но в скриптах тем более на паскаль я не силен. Помогите пожалуйста создать скрипт инстлятора или инстлятор для программ моих, конечно не за бесплатно. БОлее подробно при личной переписке. Прошу ответить как можно скорее так как сроки поджимают.
--
Контактные данные удалены модератором - ОПК п. 3.16
Для связи на форуме существует личная переписка

Go_Ram 25-05-2012 12:32 1922331

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

Iska 25-05-2012 17:20 1922552

Go_Ram, кто восхочет и возжаждет — тот всегда может написать Вам через систему персональных сообщений на форуме, либо непосредственно на почтовый адрес (который Вы указывали при регистрации). А нарушать правила не след.

Creator000 25-05-2012 18:07 1922576

все не так как Я хочу.

Gnom_aka_Lexander 25-05-2012 23:22 1922757

Скрипты инсталляторов для игр от Krinkels Team


Krinkels Team занимается написанием оформительских скриптов.
Ниже приведены скрипты и описания к ним



"Batman: Arkham City [i]" v.0.1.8.0 (IsDone v.06f)
Описание:
Скрипт посвящён одноименной игре от © Rocksteady Studios, Batman: Arkham City.

Особенности:
  1. Для более удобного использования, скрипт "Batman: Arkham City [i]" был разделен на отдельные модули (папка Modules: botva2, botva2u, Header, IsDone, Messages, PB);
  2. В качестве модуля распаковки используется "IsDone v.06f" © Profrager, 2011;
  3. В "Batman: Arkham City [i]" есть скрытое меню, по нажатии на которое вы активируете появление логотипа;
  4. В скрипт включена расширенная версия модуля о свободном месте на ЖД;
  5. Дизайн "Batman: Arkham City [i]" достаточно гибко поддается изменениям и при желании и наличии базовых навыков работы в Photoshop вы сможете кардинально изменить стиль и дизайн вашего проекта;
  6. Для удобства использования "Batman: Arkham City [i]", в начале скрипта вынесено множество опций.
Скриншоты:





"Batman: Arkham City [II]" v.1.0
Описание:
Это ещё один скрипт от нашей команды, посвящённый одноименной игре от © Rocksteady Studios, Batman: Arkham City.

Особенности:
  1. В "Batman: Arkham City [II]" объеденины страницы каталогов;
  2. В скрипт включена расширенная версия модуля о свободном месте на ЖД;
  3. Есть возможность задать каждой странице собственную фоновую картинку;
  4. Поддерживается текстурированние кнопок и чекбосков;
  5. В скрипт включено "isSlideShow" © ExpeditoR, 2010;
Скриншоты:





"Split Second" v.1.0.1 (IsDone v.0.6 Final)
Описание:
Скрипт по одноименной игре. Присутствует вертикальная панель навигации по страницам инсталлятора.

Особенности:
  1. В "Split/Second" включена возможность использования скина для инсталлятора;
  2. Для более удобного использования, скрипт "Split/Second" был разделен на отдельные модули (папка Modules: botva, Header, IsDone, Messages, PB);
  3. В качестве модуля распаковки используется "IsDone v.0.6 Final" © Profrager, 2011;
  4. В качестве модуля по защите графики используется "b2p v.0.3.9.2" © VoLT, 2011;
  5. В скрипт включена расширенная версия модуля о свободном месте на ЖД.
Скриншоты:





"FIFA 12" v.1.01 (IsDone v.0.6 Final)
Описание:
Скрипт по одноименной игре. Присутствует вертикальная панель навигации по страницам инсталлятора.

Особенности:
  1. Скрипт "FIFA 12" универсален и при желании его можно использовать для многих игр;
  2. В "FIFA 12" объеденины страницы каталогов, а так же Компонентов и Дополнительных задач;
  3. Для более удобного использования, скрипт "FIFA 12" был разделен на отдельные модули (папка Modules: Header, ISDoneHeader);
  4. В качестве модуля распаковки используется "IsDone v.0.6 Final" © Profrager, 2011;
Скриншоты:





"L.A. Noire" (IsDone v.0.6 Final)
Описание:
Универсальный скрипт. Его можно легко настроить под любую игру.

Особенности:
  1. Для более удобного использования, скрипт "L.A. Noire" был разделен на отдельные модули (папка Modules).
  2. В качестве модуля распаковки используется "IsDone" © ProFrager (Ne0N) 2011.
  3. В качестве модуля для работы с панелью задач (В Windows Vista/7/8) используется "WinTB" © David.D.Rocco 2012.
  4. В качестве модуля для работы с графикой используется "botva2" © South 2011.
  5. В качестве модуля по защите графики используется "b2p" © VoLT 2011.
  6. Требуется расширенная [Enhanced] версия Inno Setup. - http://restools.hanzify.org/
  7. Проверка необходимого места на жёстком диске.
  8. Для удобства использования, в начале скрипта вынесено множество опций.
  9. Включён полный набор psd-исходников (папка PSD_source);
  10. Деинсталлятор выполнен в стиле инсталлятора.
  11. Ну и многое другое
Скриншоты:


LinkOFF 26-05-2012 03:22 1922826

Здравствуйте. Как сделать чтоб файл распаковывался в C:\Users\имя пользователя\AppData\Local\ ?. Я ставлю {userappdata}, но он распаковывает в C:\Users\имя пользователя\AppData\Roaming\ . Пробовал еще {userprofile}, но с ним вообще ошибку выдает.

YURSHAT 26-05-2012 06:19 1922835

Цитата:

Цитата Неадекватный
А сайт http://krinkels.org/ чему посвящён? »

Создавлся как сайт посвященный Inno Setup, это и является основным направлением :)

Gnom_aka_Lexander 26-05-2012 15:39 1922975

Johny777, честно - лень искать, а вообще - помоему ближе к концу 3-й части или начале 4-й части видел подобные примеры того, как создать собственные параметры для инсталлятора.
Цитата:

Цитата Johny777
и другой вопрос вопрос »

очень важный. и правильно тебе инсталл говорит - ты не просто укорачиваешь, ты изменяешь путь - текст DirEdit и есть путь установки, и спользован он будет именно так, как там написано, никак иначе.

El Sanchez 26-05-2012 21:54 1923094

Цитата:

Цитата Johny777
А можно ли в инсталл добавить свои параметры запуска?
как /LANG=English например, но другие. »

Johny777, используй константу {param}. Подробности в справке.

Creator000 26-05-2012 22:48 1923119

тогда такой вопрос. в установщике 3 компонента. 1 это программа. остальные 2 скины и темы. как последние 2 компонентов просто скопировать из установщика в папку назначения?

Ivan_009 26-05-2012 23:10 1923133

При использовании ISVideo как сделать так чтобы видео отображалось только на странице установки а на финишной закрывалось...Зараннее спасибо... :search:

Johny777 26-05-2012 23:58 1923163

Ваня,
насчёт ISVideo не знаю (ты бы скрипт с минимумом файлов дал)
вот тебе пример на основе xvid.dll
http://rghost.ru/private/38303460/fa...06bff122ee5155
делается легко во встроенной процедуре

читать дальше »
Код:

procedure CurPageChanged(CurPageID: Integer);
begin

    if CurPageID=wpInstalling then /// если страница установки
    begin
        запускаем видео
    end;

    if CurPageID=wpFinished then /// на странице завершения
    begin
      выключаем видео
    end;

end;



______________________________________________________

El Sanchez,
спасибо!
очень привлекательный вариант
но если честно не пойму как правильно использовать :(
мне нужно для чекбоксов
сделал так:

читать дальше »
Код:

[Setup]
AppName=Name
AppVerName=Name
DefaultDirName={pf}\Name
compression=none

[ Code]

procedure InitializeWizard;
var
  CheckBox: TNewCheckBox;
 
begin

  CheckBox := TNewCheckBox.Create(WizardForm);
  with CheckBox do
  begin
    Caption := 'Test';
    if ExpandConstant('{param:Check|1}') then Checked := true else Checked := false;
    Parent := WizardForm;
    SetBounds(ScaleX(64), ScaleY(328), ScaleX(97), ScaleY(17));
  end;

end;



даже не компилится
ошибка
читать дальше »


---------------------------
Ошибка компиляции
---------------------------
Строка 18:

Column 42:

Type mismatch.
---------------------------
ОК
---------------------------


можно мне пожалуйста живой пример?

El Sanchez 27-05-2012 11:09 1923276

Цитата:

Цитата Johny777
if ExpandConstant('{param:Check|1}') then Checked := true else Checked := false; »

Johny777, ну и с чем ты сравниваешь результат ExpandConstant? Это ж строка. Нужно так:
Код:

case ExpandConstant('{param:Check|}') of
  '1': Checked := True;
  '0': Checked := False;
end;


Serkap 27-05-2012 15:10 1923380

Вложений: 1
Serkap Forever & Курский Город Друзей - скрипт писался для чата Bimoid

Для чего его писал я, у меня есть большая локальная сеть которая состоит из несколько подсетей, у каждой подсети есть свой шлюз, а у меня 7 под сетей (7 шлюзов) и также есть доступ через интернет.
Один сервер обрабатывает эти 7 шлюзов и 1 подключение через интернет! На этом сервере стоит сервер чата.

Пользователь запускает этот инсталлятар, инсталлятар определяет автоматически шлюз, пользователь тока указывает свой логин, после этого запись этих данных происходит в 2 INI файла автоматически.
После завершения установки, чат автоматически логинится и запускается с предустановленным профилем. Это хорошо помагает для сис админов в особенности у кого поднят Домен.
не надо бегать, настраивать для каждого пользователя профиль и т.д.!!!! достаточно запустить и указать тока логин зарегистрированого пользователя!!!
awatch.exe - для определение IP адреса или Шлюза!

Код:


#define MyAppName "Чат КГД"
#define MyAppVersion "05.2012"
#define MyAppPublisher "Курский Город Друзей"
#define MyAppURL "http://www.kursk-gd.ru/"
#define MyAppExeName "Bimoid.exe"

[Setup]
; Serkap Forever & Курский Город Друзей - скрипт писался для чата Bimoid
; Для чего его писал я,  у меня есть большая локальная сеть которая состоит из несколько подсетей, у каждой подсети есть свой шлюз, а у меня 7 под сетей (7 шлюзов) и также есть доступ через интернет.
; Один сервер  обрабатывает эти 7 шлюзов и 1 подключение через интернет! На этом сервере стоит сервер чата.
; Пользователь запускает этот инсталлятар, инсталлятар определяет автоматически шлюз, пользователь тока указывает свой логин, после этого запись этих данных происходит в 2 INI файла автоматически.
; После завершения установки, чат автоматически логинится и запускается с предустановленным профилем. Это хорошо помагает для сис админов в особенности у кого поднят Домен.
; не надо бегать, настраивать для каждого пользователя профиль и т.д.!!!! достаточно запустить и указать тока логин зарегистрированого пользователя!!!
; awatch.exe - для определение IP адреса или Шлюза!


AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DisableDirPage=yes
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
OutputBaseFilename=chat katk
Compression=lzma
SolidCompression=yes

[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"
 
[Files]
Source: "awatch.exe"; Flags: dontcopy noencryption nocompression
Source: "C:\111\чат\Bimoid.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\111\чат\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[INI]
Filename: "{app}\Bimoid.ini"; Section: "Main"; Flags: uninsdeletesection
Filename: "{app}\Bimoid.ini"; Section: "Main"; Key: "CurLang"; String: "Russian.oln";
Filename: "{app}\Bimoid.ini"; Section: "Main"; Key: "CurSkin"; String: "SnowySky.osk";
Filename: "{app}\Bimoid.ini"; Section: "Main"; Key: "CurUser"; String: "{code:GetUser|Names}";
Filename: "{app}\Bimoid.ini"; Section: "Main"; Key: "CurServer"; String: "{code:MyConst}";
Filename: "{app}\Bimoid.ini"; Section: "Main"; Key: "DefaultServer"; String: "{code:MyConst}";
Filename: "{app}\Bimoid.ini"; Section: "Main"; Key: "Port"; String: "7023";
Filename: "{app}\Bimoid.ini"; Section: "Main"; Key: "TranspResVer"; String: "0";
Filename: "{app}\Users\User0001\ObimpUser.ini"; Section: "User"; Flags: uninsdeletesection;
Filename: "{app}\Users\User0001\ObimpUser.ini"; Section: "User"; Key: "Username"; String: "{code:GetUser|Names}";
Filename: "{app}\Users\User0001\ObimpUser.ini"; Section: "User"; Key: "Server"; String: "{code:MyConst}";

[C*o*de]
var
 Page: TInputOptionWizardPage;
 UserPage: TInputQueryWizardPage;
 ip : string;

Procedure GetIPAdress();
var S: TArrayOfString; i,res : Integer; st : string;
begin
  ExtractTemporaryFile('awatch.exe');
  Exec(ExpandConstant('{tmp}\awatch.exe'), ' /stab tab1.txt 1 ',ExpandConstant('{tmp}'),SW_HIDE,ewWaitUntilTerminated,res);
  LoadStringsFromFile(ExpandConstant('{tmp}\tab1.txt'), S);
  for i:= 0 to GetArrayLength(S)-1 do begin
    if (Pos(AnsiUpperCase('Default Gateway'), AnsiUpperCase(S[i])) > 0) then begin
      st:=S[i];
      break;
    end;
  end;
  StringChangeEx(st, 'Default Gateway', '', True);
  st:=TrimLeft(st);
  st:=copy(st,0,Length(st)-pos('(',st)-1);
  StringChangeEx(st, '(', '', True);
  st:=TrimRight(st);
  ip:=st;
end;


function Checked: Boolean;
begin
  Result := Page.Values[0];
end;
 
function Checked2: Boolean;
begin
  Result := Page.Values[1]; 
end;


function Checked3: Boolean;
begin
  if (Page.Values[1]) then
    // компонент 'helpfiles' выбран
    MsgBox('ok', mbInformation, MB_OK);
end; 

function MyConst(Param: String): String;
begin

if Checked then 
GetIPAdress; 
Result := ip;
   
if (Checked2) then ;   
end;

procedure InitializeWizard();
begin

  UserPage := CreateInputQueryPage(wpWelcome,
    'Информация для входа!', 'Ваш логин:',
    'Укажите логин, который Вам выдал админисратор.');
  UserPage.Add('Name:', False);

  UserPage.Values[0] := GetPreviousData('Name', GetPreviousData('Name', ExpandConstant('{sysuserinfoname}')));
  ip := 'icq.kursk-gd.ru'; // тут указываете свой сервер подключения через интернет

  Page := CreateInputOptionPage(wpSelectTasks,'New Page', 'New Page Description.', 'Please check the box below, then click Next.', True, False);
  Page.Add('Локальная Сеть КАТК');
  Page.Values[0] := True;
  Page.Add('Если устанавливаете дома');
  Page.Values[1] := False;
end;
 
function GetUser(Param: String): String;
begin
  if Param = 'Names' then  Result := UserPage.Values[0];
end;

 [Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}";
Name: "{userstartup}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

[Run]
Filename: "{app}\Bimoid.exe"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Parameters: "/id={code:GetUser|Names} /srv={code:MyConst} /port=7023 /pwd=123456789 /savepwd /login"; Flags: nowait


Serega 27-05-2012 19:23 1923497

Цитата:

Цитата El Sanchez
Это ж строка. Нужно так: »

Можно проще ;) :
Код:

  Checked := ExpandConstant('{param:Check|}') = '1';

El Sanchez 27-05-2012 20:00 1923515

Цитата:

Цитата Serega
Можно проще »

Serega, не пойдет. Свойство Checked будет False при любых значениях параметра Check, кроме 1. Зависимость состояния чекбокса от значения параметра Check должна быть однозначной.

Serega 27-05-2012 20:21 1923524

Цитата:

Цитата El Sanchez
Свойство Checked будет False при любых значениях параметра Check, кроме 1 »

El Sanchez, а в приведённом тобой коде будет что-то другое ;) ?
Просто свойство Checked, по умолчанию := False...

Ivan_009 27-05-2012 20:29 1923530

Как в ISVideo сделать кнопки Пауза,Старт,Стоп на if CurPageID=wpInstalling then :unsure: вот скрипт

alert30 27-05-2012 21:42 1923566

У кого остался скрипт, чтобы маскировать установщик в NSIS? Благодарю заранее.

Creator000 28-05-2012 00:12 1923681

как проследить что и куда копирует установщик?

PS
что дает команда •ArchitecturesInstallIn64BitMode*? а то ваша справка глючит.

bear! 28-05-2012 14:12 1923897

Как сделать так, чтобы путь к установки брался из файла .reg?
Прописываю
Код:

DefaultDirName={reg:HKLM\SOFTWARE\Microsoft,InstallLocation|{pf}\Pariah}
и
Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\RADAR\HeapLeakDetection\DiagnosedApplications\CivilizationV.exe; ValueType: string; ValueName: LastDetectionTime; ValueData: {app}; Flags: uninsdeletekey

Но в итоге установку предлагает в C:\Program Files\Pariah
Да и кстати, как найти правильный файл реестра? Просто нужно русификатор сделать, но какую именно директорию экспортировать? Верней как она должна выглядеть.

Gnom_aka_Lexander 28-05-2012 14:20 1923901

bear!, ты все правильно делаешь, в принцыпе.
Идеальный вариант - ищешь в разделе реестра Uninstall путь к папке с программой, которую хочешь русифицировать. Наиболее вероятно, что в пути будет подпапка с большим количеством букво-цифер, заключенная в фигурные скобки - это будет AppID программы - все официальные пачи на нем и базируются обычно. далее указываешь именно этот ключ и параметр, в котором находится путь к программе - все должно получиться.

FrozenProtector 28-05-2012 17:11 1924021

Добрый день!

Подскажите пожалуйста, список компонентов для установки выводится обычно в виде чекбоксов или радиокнопок.
Но мне необходимо, чтобы компоненты первого уровня были просто текстом.
т.е. как то так:

+Уровень1 (обычный текст)
- Уровень 2 (чекбокс)
- Уровень 2 (чекбокс)
- Уровень 2 (чекбокс)
+Уровень1 (обычный текст)
- Уровень 2 (чекбокс)
- Уровень 2 (чекбокс)
- Уровень 2 (чекбокс)

Пробовал так через свойство ItemObject, не получилось (паскаль уже плохо помню)

Код:

var
label : TLabel;
begin
 label := TLabel.Create(nil);
 WizardForm.ComponentsList.ItemObject[0] := label;
end;


Gnom_aka_Lexander 28-05-2012 21:41 1924137

С помощью задач можно это решить. Посмотрите в справке GroupDescription

FrozenProtector 29-05-2012 09:40 1924293

Цитата:

Цитата Gnom_aka_Lexander
С помощью задач можно это решить. Посмотрите в справке GroupDescription »

Уточню, что использую расширенную версию Inno Setup, где компоненты отображаются в виде сворачивающегося дерева (ComponentsListTVStyle = true).
Предложенный вами вариант позволяет группировать задачи на странице задач. Мне же таким образом нужно группировать компоненты на странице компонентов.

Попробовал просто очистить список компонентов, добавить туда из кода группу, а чуть ниже чекбокс.

Код:

WizardForm.ComponentsList.Clear;
 WizardForm.ComponentsList.AddGroup('УРОВЕНЬ1','',0,nil);
 WizardForm.ComponentsList.AddCheckBox('УРОВЕНЬ2','',1,false,true,false,false,nil);

Получилось так

+Уровень1 (текст)
-Уровень2(чекбокс)

Но при попытке поставить галочку в чекбокс возникает ошибка "Access violation at address 0048BF49. Read of address 00000000"

Gnom_aka_Lexander 29-05-2012 09:48 1924296

FrozenProtector, Вы на правильном пути. Но, не стоит чистить компонент-лист - инсталл на него рассчитывает, и не найдя того, что ожидал там увидеть - естественно, расстроится. Можно создать свой чеклистбокс и там уже делать все, что душе угодно.

bear! 29-05-2012 11:34 1924360

Цитата:

Цитата Gnom_aka_Lexander
bear!, ты все правильно делаешь, в принцыпе.
Идеальный вариант - ищешь в разделе реестра Uninstall путь к папке с программой, которую хочешь русифицировать. Наиболее вероятно, что в пути будет подпапка с большим количеством букво-цифер, заключенная в фигурные скобки - это будет AppID программы - все официальные пачи на нем и базируются обычно. далее указываешь именно этот ключ и параметр, в котором находится путь к программе - все должно получиться »

Ничего не получается, установку предлагает в C:\Program Files\CivilizationV

GoshaPolo 29-05-2012 11:40 1924365

Подскажите как решить три ниже перечисленных вопроса:

1. Как поменять заголовок окна Windows? Желательно для каждой страницы установки свой индивидуальный заголовок.
2. Как поменять сообщение, которое вылазит при закрытии программы установки с уведомлением о подтверждении закрытия, на свое?
3. Как убрать определенную страницу программы установки, если я не хочу, чтобы она вылазила?

Заранее спасибо за ответы или ссылки на ответы :)

Johny777 29-05-2012 12:16 1924389

GoshaPolo,
1.
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[  Code]
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpWelcome then
  begin
    WizardForm.Caption := 'Я страница приветствия';
  end;
    ////////////////////////////////////////
  if CurPageID=wpSelectDir then
  begin
    WizardForm.Caption := 'Я страница выбоа директории установки';
  end;
    //////////////////////////////////////////////////
  if CurPageID=wpInstalling then  /// страница установки
  begin
    WizardForm.Caption := 'Я страница установки';
  end;
    ///////////////////////////////////////////////////////
  if CurPageID=wpFinished then /// завершающая страница
  begin
      WizardForm.Caption := 'Я страница завершения';
  end;
end;


2.
а) форма (выдрал у себя из скрипта, только без картинки :)):
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.



[  Code]
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord; external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: LongWord; uPosition, uFlags: UINT): BOOL; external 'DeleteMenu@user32.dll stdcall';
function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLongA@user32.dll stdcall';
function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLongA@user32.dll stdcall';

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
var
  NoButton, YesButton: TButton;
  MyExit: TSetupForm;
 
begin
  Confirm := False;

  begin
    MyExit := CreateCustomForm();
    with MyExit do
    begin
      Position := poScreenCenter;
      ClientWidth := ScaleX(154);
      ClientHeight := ScaleY(65);
      Caption := 'Уверен*(а)?';
      Color := clBtnFace;
      DeleteMenu(GetSystemMenu(MyExit.Handle,False), $F060,0); /// сделать кнопку "закрыть" неактивной
      SetClassLong(MyExit.Handle, -26, GetClassLong(Wizardform.Handle, -26) or $200);
    end;

    NoButton := TButton.Create(MyExit);
    with NoButton do
    begin
      Parent := MyExit;
      Caption := ExpandConstant(SetupMessage(msgButtonNo));
      SetBounds(ScaleX(3), ScaleY(20), ScaleX(71), ScaleY(25));
      ModalResult:= mrNo;
    end;

    YesButton := TButton.Create(MyExit);
    with YesButton do
    begin
      Caption := ExpandConstant(SetupMessage(msgButtonYes));
      Parent := MyExit;
      SetBounds(NoButton.Left + ScaleX(77), NoButton.Top, NoButton.Width, NoButton.Height);
      ModalResult := mrYes;
    end;
  end;

  if MyExit.ShowModal() = mrNo then Cancel := False;
end;


б) месседжбокс:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppverName=MyApp
DefaultDirName={pf}\MyApp
 
[  code]
 
procedure WizardClose(Sender: TObject; var Action: TCloseAction);
Begin
  Action:= caNone;
  If MsgBox('Вы хотите закрыть мастер установки?', mbInformation, MB_YESNO) = IDYES then
    MainForm.Close;
End;
 
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Cancel:= True;
  Confirm:= False;
end;
 
procedure InitializeWizard();
begin
WizardForm.OnClose:= @WizardClose
end;


в) другой пример:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppverName=MyApp
DefaultDirName={pf}\MyApp

[  code]
procedure WizardFormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if MsgBox('Ты опух?',mbConfirmation,MB_YESNO)=IDNO then CanClose:=False;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=False;
end;

procedure InitializeWizard;
begin
  WizardForm.OnCloseQuery:=@WizardFormCloseQuery;
end;



3.
читать дальше »
Код:

[Setup]
AppName=MyApp
AppverName=MyApp
DefaultDirName={pf}\MyApp

//можно так:
//подробнее в справке
DisableWelcomePage=yes

[  code]
//или так
function  ShouldSkipPage(PageID: Integer): Boolean;  /// встроенная функция пропуска страниц
begin
  case /// в случае айди страницы "wpWelcome", то результат true, те пропустить
      PageID of wpWelcome: Result := True;
  end;
end;



ай ди страниц:
читать дальше »

wpWelcome = 1;
wpLicense = 2;
wpPassword = 3;
wpInfoBefore = 4;
wpUserInfo = 5;
wpSelectDir = 6;
wpSelectComponents = 7;
wpSelectProgramGroup = 8;
wpSelectTasks = 9;
wpReady = 10;
wpPreparing = 11;
wpInstalling = 12;
wpInfoAfter = 13;
wpFinished = 14;
YourCustomPageName.ID /// твоя страница с .ID на конце

GoshaPolo 29-05-2012 12:35 1924404

Johny777, спасибо за ответы :clapping:

Если не сложно еще три, я так думаю для знающих людей простых, вопроса:

1. Как можно задать свое названия ярлыка для деинсталляции в меню Пуск?
2. Как задать координаты окна установки при появлении? Например я хочу, чтобы окно вылазило в правом нижнем углу, или строго по центру экрана например.
3. Как задать на свой, а не стандартный, чекбокс функцию создания ярлыка на рабочем столе и функцию запуска программы после окончания установки?

Johny777 29-05-2012 12:39 1924406

GoshaPolo,
прочитай ка ты дружочек сначала справочку по 1-му вопросу!
(вот тебе русская справка http://sendfile.su/570136)
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,
по второму вопросу для ярлыка:
читать дальше »
Код:

[Setup]
AppName=Моя программа
AppVersion=1.5
DefaultDirName={pf}\Моя программа
OutputDir=.


[Icons]
Name: "{commondesktop}\Моя программа"; Filename: "{app}\MyProg.exe"; Check: Make_Icon

[  Code]
var
  IconCheckBox: TNewCheckBox;
 
function Make_Icon: Boolean;
begin
  Result:=IconCheckBox.Checked;
end;

procedure InitializeWizard();
begin

  IconCheckBox := TNewCheckBox.Create(WizardForm);
  with IconCheckBox do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(48), ScaleY(328), ScaleX(97), ScaleY(17))
    Caption := 'Создать ярлык';
  end;
 
end;


для запуска (секция RUN) таким же макаром через Check
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
по третьему:
через GetSystemMetrics,
здесь http://innoultra.ru/?page_id=18 под 43-м номером 2 варианта

GoshaPolo 29-05-2012 13:09 1924422

Johny777, спасибо еще раз!

По поводу чекбоксов еще вопросик маленький. Как их поместить на определенной странице, а не на всех?

Johny777 29-05-2012 13:12 1924430

Цитата:

Цитата GoshaPolo
Как их поместить на определенной странице, а не на всех? »

Parent := WizardForm.SelectDirPage; например
можно на панели или на форме разместить (если на форме, то TNewCheckBox.Create(название формы);
или другая страница
только вверх сдвинь, тк он низко находится

alert30
Цитата:

Цитата alert30
чтобы маскировать установщик в NSIS »

впервые слышу
можно поинтересоваться зачем тебе это?
в ...\Inno Setup 5\Scripts\NSIS_SkinCrafter\ не оно?

GoshaPolo 29-05-2012 13:17 1924431

Johny777, спасибо еще раз! Очень выручил :yahoo:

Johny777, что-то не могу разобраться. Прописал чекбокс на запуск программы в секцию RUN и он запускается сразу после странички с прогрессбаром. А как сделать, чтобы он запускался только после нажатия завершения установки на последней странице?

Johny777 29-05-2012 13:51 1924463

GoshaPolo,
есть этапы
пример (в порядке выполнения) :

читать дальше »
Код:

[Setup]
AppName=Name
AppVerName=Name
DefaultDirName={pf}\Name
compression=none

[  Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: Integer;
 
begin
    /////

    if CurStep = ssInstall then /// перед устанновкой
    begin
     
    end;

    ///////
   
    if CurStep = ssPostInstall then /// после установки
    begin
     
    end;
   
    //////

    if CurStep = ssDone then /// то что тебе надо
    begin
        Exec(ExpandConstant('{sys}\calc.exe'), '', '', SW_SHOW, ewNoWait, ResultCode);  ///  запустим калькулятор
        // другой пример Exec(ExpandConstant('{src}\outer\DirectX\DXSETUP.exe'), '/silent', ExpandConstant('{src}\outer\DirectX'), SW_SHOW, ewWaitUntilTerminated, ResultCode);
        //////////////////////////////// расположение файла ///////////////////// параметры //////////  рабочая папка ///////////////////// флаги ////// (другие -  SW_HIDE, ewNoWait)
    end;
   
    ///////
end;


и в справке в поиск вбей "Exec" и "ShellExec" без кавычек

поправил свою опечатку в коде

и обрати внимание на флаг "postinstall" для секции RUN

GoshaPolo 29-05-2012 15:29 1924514

Johny777, спасибо!

Флаг "postinstall" приметил сразу, сделал через него, но не сразу сообразил как будет это действовать, сейчас разобрался и делаю через него :)

alert30 29-05-2012 16:15 1924533

Цитата:

Цитата Johny777
впервые слышу
можно поинтересоваться зачем тебе это? »

Johny777
Допустим так: прогресс-бар по-короче, выполнение команд при распаковке инсталлятор и его какие-либо записи над прогесс-баром, кнопочка "Детали..." под прогесс-баром и при его нажатии должен появиться список выполненных команд.

Johny777 29-05-2012 17:17 1924556

Цитата:

Цитата alert30
нопочка "Детали..." под прогесс-баром и при его нажатии должен появиться список выполненных команд »

так?
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
Compression=none

[Files]
Source: C:\Windows\Fonts\*; DestDir: {app}; BeforeInstall: AddToMemo;

[  code]

var
  DetailsButton: TNewButton;
  FilesMemo: TNewMemo;
  Flag: boolean;

procedure AddToMemo();
var
  AFile: String;
begin
AFile:= ExpandConstant(CurrentFilename);
if ExtractFileExt(AFile)='' then
  FilesMemo.Lines.Add('CreateFolder: '+RemoveBackslash(AFile)) else
  FilesMemo.Lines.Add('Extract: '+AFile);
end;

procedure HideShow(Sender: TObject);
begin
  If not Flag then begin
    FilesMemo.Hide;
    DetailsButton.Caption:='Детали...';
    Flag:= True;
  end else begin
    FilesMemo.Show;
    DetailsButton.Caption:='Скрыть';
    Flag:= False;
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.ProgressGauge.Top := ScaleY(34);

  FilesMemo := TNewMemo.Create(WizardForm);
  with FilesMemo do
  begin
    SetBounds(WizardForm.InstallingPage.Left, ScaleY(88), WizardForm.ProgressGauge.Width, ScaleY(145));
    Parent := WizardForm.InstallingPage;
    WordWrap:= True;
    ScrollBars:= ssVertical;
    ReadOnly:= True;
    Visible := false;
    Clear;
  end;
 
  DetailsButton := TNewButton.Create(WizardForm);
  with DetailsButton do
  begin
    Parent := WizardForm.InstallingPage;
    SetBounds(ScaleX(334), ScaleY(60), ScaleX(75), ScaleY(25));
    Caption := 'Детали';
    OnClick := @HideShow
  end;
 
  Flag:= True;
end;


GoshaPolo 29-05-2012 17:30 1924572

Еще вопросик возник. Никак не могу совладать с флагом "waituntilidle", может быть я его не правильно понимаю, при запуске приложений после установки. Запускаются сразу все, которые прописаны. Как их запустить по очереди, чтобы пока не закроется процесс первого приложения, второе не запускалось, а затем сразу запускалось второе?

Sanshalay 29-05-2012 17:39 1924583

Всем привет. Скачал скрипт. Там не было страницы "Лицензия". Я его создал, но теперь при запуске инсталлятора и переходе на страницу Лицензия у меня становится не активна кнопка "Далее". Я знаю почему. Потому что не активирована Radio "Я согласен с ЛС". Но вот в чем проблема. Я не ставил эти Radio. Поэтому у меня к вам вопрос. Как поставить их ("Я согласен с ЛС" и "Я не согласен с ЛС")?

Исходный скрипт: http://www.sendspace.com/file/d77j3y
Мой скрипт: http://www.sendspace.com/file/c98ply

Johny777 29-05-2012 17:40 1924586

Цитата:

Цитата GoshaPolo
с флагом "waituntilidle" »

эх
почти
Тебе нужен флаг сразу под ним "waituntilterminated"
Ко всем строкам в RUN для внешних экзешников припиши которые должны выполняться по очереди
вот что важно:
Из справки: "Все параметры выполняются инсталлятором в том порядке, в котором они располагаются в секции." (сверху вниз от начала секции до конца)

Sanshalay,

читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

LicenseFile=compiler:License.Txt

[  code]
procedure InitializeWizard();
begin

    WizardForm.LicenseAcceptedRadio.Checked := True; // по умолчанию согласен. Те чекбокс по умолчанию отмечен

end;


Sanshalay 29-05-2012 18:05 1924602

Johny777, это то, что мне надо! Спасибо огромное!

ToCamoe 29-05-2012 19:01 1924641

Поправте в чём ошибка, хочу добавить 1 картинку на все страницы (стандартные, дополнительных нету) инсталера. Сама картинка подключена в [Files]
сам Code
var
pnl: TPanel;

procedure InitializeWizard(); <---- на это ругается
begin
ExtractTemporaryFile('img.jpg');

WizardForm.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\img.jpg'));

///////////////////////WelcomePage//////////////////////////////////////
procedure WelcomePage;
begin
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.WelcomeLabel1.AutoSize;
SetBounds(WizardForm.WelcomeLabel1.Left,WizardForm.WelcomeLabel1.Top,
WizardForm.WelcomeLabel1.Width,WizardForm.WelcomeLabel1.Height);
WordWrap:= WizardForm.WelcomeLabel1.WordWrap;
Caption:= WizardForm.WelcomeLabel1.Caption;
with Font do
begin
Color:= WizardForm.WelcomeLabel1.Font.Color;
Style:= WizardForm.WelcomeLabel1.Font.Style;
Name:= WizardForm.WelcomeLabel1.Font.Name;
Size:= WizardForm.WelcomeLabel1.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.WelcomeLabel2.AutoSize;
SetBounds(WizardForm.WelcomeLabel2.Left,WizardForm.WelcomeLabel2.Top,
WizardForm.WelcomeLabel2.Width,WizardForm.WelcomeLabel2.Height);
WordWrap:= WizardForm.WelcomeLabel2.WordWrap;
Caption:= WizardForm.WelcomeLabel2.Caption;
with Font do
begin
Color:= WizardForm.WelcomeLabel2.Font.Color;
Style:= WizardForm.WelcomeLabel2.Font.Style;
Name:= WizardForm.WelcomeLabel2.Font.Name;
Size:= WizardForm.WelcomeLabel2.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;
/////////////////////////////////////////////////////////////////

///////////////////////SelectDirPage//////////////////////////////////////
procedure SelectDirPage;
begin
with WizardForm do
begin
with DirEdit do
begin
Left:= 40;
Top:= 137;
Parent:= pnl;
end;
with DirBrowseButton do
begin
Left:= WizardForm.DirEdit.Left + WizardForm.DirEdit.Width + 10;
Top:= WizardForm.DirEdit.Top - 1;
Parent:= pnl;
end;
with SelectDirBitmapImage do
begin
Left:= WizardForm.DirEdit.Left;
Top:= WizardForm.DirEdit.Top - 62;
Stretch:= True;
Parent:= pnl;
end;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.SelectDirBrowseLabel.AutoSize;
SetBounds(WizardForm.DirEdit.Left,WizardForm.DirEdit.Top - 30,
WizardForm.SelectDirBrowseLabel.Width, WizardForm.SelectDirBrowseLabel.Height);
WordWrap:= WizardForm.SelectDirBrowseLabel.WordWrap;
Caption:= WizardForm.SelectDirBrowseLabel.Caption;
with Font do
begin
Color:= WizardForm.SelectDirBrowseLabel.Font.Color;
Style:= WizardForm.SelectDirBrowseLabel.Font.Style;
Name:= WizardForm.SelectDirBrowseLabel.Font.Name;
Size:= WizardForm.SelectDirBrowseLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.SelectDirLabel.AutoSize;
SetBounds(WizardForm.SelectDirBitmapImage.Left + 50,WizardForm.SelectDirBitmapImage.Top + 10,
WizardForm.SelectDirLabel.Width,WizardForm.SelectDirLabel.Height);
WordWrap:= WizardForm.SelectDirLabel.WordWrap;
Caption:= WizardForm.SelectDirLabel.Caption;
with Font do
begin
Color:= WizardForm.SelectDirLabel.Font.Color;
Style:= WizardForm.SelectDirLabel.Font.Style;
Name:= WizardForm.SelectDirLabel.Font.Name;
Size:= WizardForm.SelectDirLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.DiskSpaceLabel.AutoSize;
SetBounds(WizardForm.DirEdit.Left,WizardForm.Bevel.Top - 25,
WizardForm.DiskSpaceLabel.Width,WizardForm.DiskSpaceLabel.Height);
WordWrap:= WizardForm.DiskSpaceLabel.WordWrap;
Caption:= WizardForm.DiskSpaceLabel.Caption;
with Font do
begin
Color:= WizardForm.DiskSpaceLabel.Font.Color;
Style:= WizardForm.DiskSpaceLabel.Font.Style;
Name:= WizardForm.DiskSpaceLabel.Font.Name;
Size:= WizardForm.DiskSpaceLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;
/////////////////////////////////////////////////////////////////

///////////////////////ReadyPage//////////////////////////////////////
procedure ReadyPage;
var
ready_str: string;
begin
ready_str:= WizardForm.ReadyMemo.Text;
with TLabel.Create(pnl) do
begin
SetBounds(45,115,WizardForm.ReadyMemo.Width, WizardForm.ReadyMemo.Height);
Caption:= ready_str;
with Font do
begin
Color:= WizardForm.ReadyLabel.Font.Color;
Style:= WizardForm.ReadyLabel.Font.Style;
Name:= WizardForm.ReadyLabel.Font.Name;
Size:= WizardForm.ReadyLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TBevel.Create(WizardForm) do
begin
SetBounds(40,110, WizardForm.ReadyMemo.Width, WizardForm.ReadyMemo.Height);
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.ReadyLabel.AutoSize;
SetBounds(40,70, WizardForm.ReadyLabel.Width, WizardForm.ReadyLabel.Height);
WordWrap:= WizardForm.ReadyLabel.WordWrap;
Caption:= WizardForm.ReadyLabel.Caption;
with Font do
begin
Color:= WizardForm.ReadyLabel.Font.Color;
Style:= WizardForm.ReadyLabel.Font.Style;
Name:= WizardForm.ReadyLabel.Font.Name;
Size:= WizardForm.ReadyLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;
/////////////////////////////////////////////////////////////////

///////////////////////InstallingPage//////////////////////////////////////
procedure InstallingPage;
begin
with WizardForm.ProgressGauge do
begin
Left:= 40;
Top:= 115;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.FilenameLabel.AutoSize;
SetBounds(WizardForm.ProgressGauge.Left,WizardForm.ProgressGauge.Top-20,
WizardForm.FilenameLabel.Width,WizardForm.FilenameLabel.Height);
WordWrap:= WizardForm.FilenameLabel.WordWrap;
Caption:= WizardForm.FilenameLabel.Caption;
with Font do
begin
Color:= WizardForm.FilenameLabel.Font.Color;
Style:= WizardForm.FilenameLabel.Font.Style;
Name:= WizardForm.FilenameLabel.Font.Name;
Size:= WizardForm.FilenameLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.StatusLabel.AutoSize;
SetBounds(WizardForm.StatusLabel.Left,WizardForm.StatusLabel.Top,
WizardForm.StatusLabel.Width,WizardForm.StatusLabel.Height);
WordWrap:= WizardForm.StatusLabel.WordWrap;
Caption:= WizardForm.StatusLabel.Caption;
with Font do
begin
Color:= WizardForm.StatusLabel.Font.Color;
Style:= WizardForm.StatusLabel.Font.Style;
Name:= WizardForm.StatusLabel.Font.Name;
Size:= WizardForm.StatusLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;
/////////////////////////////////////////////////////////////////

///////////////////////FinishedPage//////////////////////////////////////
var
CheckBox: array of TNewCheckBox;

procedure CheckBoxClick(Sender: TObject);
begin
if TNewCheckBox(Sender).Checked then
WizardForm.RunList.Checked[TNewCheckBox(Sender).Tag]:= True
else WizardForm.RunList.Checked[TNewCheckBox(Sender).Tag]:= False;
end;

procedure LabelClick(Sender: TObject);
begin
if CheckBox[TLabel(Sender).Tag].Checked then
begin
WizardForm.RunList.Checked[TLabel(Sender).Tag]:= False;
CheckBox[TLabel(Sender).Tag].Checked:= False;
end
else
begin
WizardForm.RunList.Checked[TLabel(Sender).Tag]:= True;
CheckBox[TLabel(Sender).Tag].Checked:= True;
end;
end;

procedure HideRunList(Control: TWinControl);
var
i, t: Integer;
str: string;
begin
if WizardForm.RunList.Items.Count > 0 then
begin
WizardForm.RunList.Hide;
SetArrayLength(CheckBox, SizeOf(WizardForm.RunList.Items.Count));
for i:= 0 to WizardForm.RunList.Items.Count-1 do
begin
CheckBox[i]:= TNewCheckBox.Create(Control);
with CheckBox[i] do
begin
SetBounds(ScaleX(WizardForm.RunList.Left+2),ScaleY(WizardForm.RunList.Top+2+t),14,14);
Tag:= i;
Checked:= WizardForm.RunList.Checked[i];
Caption:= WizardForm.RunList.Items.Strings[i];
OnClick:= @CheckBoxClick;
Color:= clWhite;
Parent:= Control;
end;
str:= WizardForm.RunList.Items.Strings[i];
with TLabel.Create(WizardForm) do
begin
SetBounds(ScaleX(WizardForm.RunList.Left+20),ScaleY(WizardForm.RunList.Top+2+t),
WizardForm.RunList.Width,14);
Caption:= str;
Tag:= i;
OnClick:= @LabelClick;
Transparent:= True;
Parent:= Control;
end;
t:= t + 20;
end;
end;
end;

procedure FinishedPage;
begin
HideRunList(pnl);
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.FinishedHeadingLabel.AutoSize;
SetBounds(WizardForm.FinishedHeadingLabel.Left,WizardForm.FinishedHeadingLabel.Top,
WizardForm.FinishedHeadingLabel.Width,WizardForm.FinishedHeadingLabel.Height);
WordWrap:= WizardForm.FinishedHeadingLabel.WordWrap;
Caption:= WizardForm.FinishedHeadingLabel.Caption;
with Font do
begin
Color:= WizardForm.FinishedHeadingLabel.Font.Color;
Style:= WizardForm.FinishedHeadingLabel.Font.Style;
Name:= WizardForm.FinishedHeadingLabel.Font.Name;
Size:= WizardForm.FinishedHeadingLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.FinishedLabel.AutoSize;
SetBounds(WizardForm.FinishedLabel.Left,WizardForm.FinishedLabel.Top,
WizardForm.FinishedLabel.Width,WizardForm.FinishedLabel.Height);
WordWrap:= WizardForm.FinishedLabel.WordWrap;
Caption:= WizardForm.FinishedLabel.Caption;
with Font do
begin
Color:= WizardForm.FinishedLabel.Font.Color;
Style:= WizardForm.FinishedLabel.Font.Style;
Name:= WizardForm.FinishedLabel.Font.Name;
Size:= WizardForm.FinishedLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;
/////////////////////////////////////////////////////////////////

procedure CurPageChanged(CurPageID: Integer);
begin
pnl:= TPanel.Create(WizardForm);
with pnl do
begin
Align:= alClient;
Parent:= WizardForm;
end;
with WizardForm do
begin
with WizardBitmapImage do
begin
Align:= alClient;
Stretch:= True;
Parent:= pnl;
end;
NextButton.Parent:= pnl;
CancelButton.Parent:= pnl;
BackButton.Parent:= pnl;
Bevel.Parent:= pnl;
pnl.Repaint;
end;

if (CurPageID > wpWelcome) and (CurPageID < wpFinished) then
begin
WizardForm.Bevel1.Parent:= pnl;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.PageNameLabel.AutoSize;
SetBounds(WizardForm.PageNameLabel.Left,WizardForm.PageNameLabel.Top,
WizardForm.PageNameLabel.Width,WizardForm.PageNameLabel.Height);
Caption:= WizardForm.PageNameLabel.Caption;
with Font do
begin
Color:= WizardForm.PageNameLabel.Font.Color;
Style:= WizardForm.PageNameLabel.Font.Style;
Name:= WizardForm.PageNameLabel.Font.Name;
Size:= WizardForm.PageNameLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.PageDescriptionLabel.AutoSize;
SetBounds(WizardForm.PageDescriptionLabel.Left,WizardForm.PageDescriptionLabel.Top,
WizardForm.PageDescriptionLabel.Width,WizardForm.PageDescriptionLabel.Height);
Caption:= WizardForm.PageDescriptionLabel.Caption;
with Font do
begin
Color:= WizardForm.PageDescriptionLabel.Font.Color;
Style:= WizardForm.PageDescriptionLabel.Font.Style;
Name:= WizardForm.PageDescriptionLabel.Font.Name;
Size:= WizardForm.PageDescriptionLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;

if CurPageID = wpWelcome then WelcomePage;
if CurPageID = wpSelectDir then SelectDirPage;
if CurPageID = wpReady then ReadyPage;
if CurPageID = wpInstalling then InstallingPage;
if CurPageID = wpFinished then FinishedPage;
end;


И вопрос второй, как изменять цвет текста, на всех страницах инсталера

Sanshalay 29-05-2012 19:03 1924643

ToCamoe, я начинающий и сильно в код не всматривался. Но вот зачем после InitializeWizard ставить скобки? \\\Проверил. Дело не в этом

И он у тебя не закрыт

Найди
Код:

WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\img.jpg'));
Замени на
Код:

WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\img.jpg'));
end;

У тебя слов begin; 52 штуки. А end; всего лишь 50.

ToCamoe 29-05-2012 19:20 1924652

Sanshalay, код изначально не мой, я в попытках его дописать ) убирание скобок и закрытие не помогло. Ошибка осталась, судя по всему закрывать ближе к концу кода надо.

С учётом того end; что указал ты, их количество равно 52 на 52

GoshaPolo 29-05-2012 21:39 1924716

Johny777, спасибо еще раз! У меня справка в .chm не работает почему-то. Страницы не отображает. Поэтому пользуюсь другими источниками, а там такого флага не было :(

Gnom_aka_Lexander 29-05-2012 22:04 1924724

GoshaPolo, она работает. кликни в списке и все откроется. справка кривовата, но работает. еще вариант - в свойствах файла справки посмотри - если есть кнопка "Разблокировать" то нажми ее и потом - применить.

bear! 29-05-2012 22:13 1924729

Как отключить разбиение файлов? Нужно все в одном exe. Размер около одного гигабайта. Такое возможно?
Просто файл .bin не особо нужен (получается два файла)

zeroka_no_onna 29-05-2012 22:15 1924730

Подскажите про Inno + ISDone!

Потребовалось разбить репак на диски и там arc, precomp - потому ISDone для нормального отображения прогресса.
И получилось вот что - при запуске сетапа сразу просит второй диск, как выберешь параметры и "Установить" - опять просит первый!!!(ну и на середине установки, естественно, второй)

Почему такая чехарда с дисками?При чистом Inno всё нормально было.

=================================================================================================

Цитата:

Цитата bear!
Как отключить разбиение файлов? Нужно все в одном exe. Размер около одного гигабайта. Такое возможно?
Просто файл .bin не особо нужен (получается два файла) »

Да.

OutputDir=куда\сохранять
OutputBaseFilename=название
SolidCompression=yes

bear! 29-05-2012 22:42 1924743

Цитата:

Цитата zeroka_no_onna
Да.
OutputDir=куда\сохранять
OutputBaseFilename=название
SolidCompression=yes »

Спасибо.

ToCamoe 29-05-2012 23:56 1924765

...

Raf-9600 30-05-2012 00:25 1924778

Ктонить может модифицировать скрипт для конвертации OGG чтобы он выполнялся два раза, т.е. нужно чтобы первый раз он конвертировал содержимое папки {app}\data\local\sfx (при условии что выбран компонент "GameVoice"), а второй раз чтобы конвертировал содержимое \data\global\music (при условии что выбран компонент "Music")

Собсно особенность этого кода в том, что он в виде прогресс-бара отображает процесс конвертации:
читать дальше »
Код:

[C0de]
var
Files: Array of String;
S: String;
n: Integer;

Function StringToArray(Text, Cut: String): array of String; var i, k: Integer;
Begin
SetArrayLength(Result, 0); if Cut = '' then Cut:= #1310; //если шаблон пуст, считаем переводы строк
Repeat k:= Pos(Cut,Text);
if k = 1 then begin Delete(Text, 1, Length(Cut)); CONTINUE
end;
SetArrayLength(Result, GetArrayLength(Result) +1); i:= GetArrayLength(Result) -1;
if k = 0 then
Result[i]:=Text
else begin
Result[i]:= Copy(Text, 1, k -1); Delete(Text, 1, Length(Result[i]) + Length(Cut));
end;
Until Length(Text) * k = 0;
End;

procedure FindFiles(FromDir: String; Mask: String);
var FSR, DSR: TFindRec; FindResult: Boolean;
begin
FindResult:= FindFirst(AddBackslash(FromDir)+Mask, FSR)
while FindResult do begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin
S:= S + AddBackslash(fromDir) + FSR.Name +'|';
end;
FindResult:= FindNext(FSR);
end;
FindResult:= FindFirst(AddBackslash(FromDir)+ '*.*', DSR)
while FindResult do begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then begin
FindFiles(AddBackSlash(FromDir)+DSR.Name, Mask)
end;
FindResult:= FindNext(DSR);
end;
FindClose(FSR); FindClose(DSR)
end;

procedure RecodeOgg;
var ResultCode: integer; CurFile: String;
begin
FindFiles(ExpandConstant('{app}'), '*.ogg') //Находим все файлы по маске, в выбранной папке
Files:= StringToArray(S, '|') //Переводим в массив
WizardForm.ProgressGauge.Max:= GetArrayLength(Files)-1; //Получаем кол-во файлов
WizardForm.ProgressGauge.Position:=0
for n:=(GetArrayLength(Files)-1) downto 0 do begin
CurFile:= Files[n]
StringChange(CurFile, AddBackslash(ExpandConstant('{app}')), '')
Exec(ExpandConstant('{app}\oggdec.exe'), '-Q '+AddQuotes(CurFile), '', SW_Hide, EwWaitUntilTerminated, ResultCode) //Для каждого файла запускаем декодер
DeleteFile(Files[n]) //Удаляем ненужный файл
WizardForm.FilenameLabel.Caption:= Files[n]; //Двигаем прогрессбар
WizardForm.ProgressGauge.Position:= WizardForm.ProgressGauge.Position +1;
end;
DeleteFile(ExpandConstant('{app}\oggdec.exe'))
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then RecodeOgg;
end;


GoshaPolo 30-05-2012 10:46 1924880

Еще несколько вопросов:

1. Как задать выбор компонентов на свои RadioButton?
2. Как разделить RadioButton по взаимосвязи? Например у меня есть 4 RadioButton, первый и второй взаимосвязаны между собой и вместе выбираться не должны ни в коем случае, а третий и четвертый соответственно связаны между собой и вместо тоже выбираться не могут.
3. Как изменить картинку при наведении на нее курсора?

Johny777 30-05-2012 11:39 1924899

GoshaPolo,
вполне реально
потом в этом сообщении примеры сделаю

скачай ка для начала (или уже?) здесь http://forum.oszone.net/showthread.p...99#post1201499 расширенную версию (ispack не unicode с препроцессором)
или здесь сборку http://innoultra.ru/ В ней много примерв и библиотек!

GoshaPolo 30-05-2012 11:58 1924904

Johny777, я и так пользуюсь расширенной версией от ResTools. Всю облазил, многое нашел, что нужно. Но вот по этим вопросам, которые описал ничего не могу поделать. Например на картинку нет события OnEnter, так бы 3-ий вопрос не задавал.

Johny777 30-05-2012 12:41 1924920

1.
как во втором примере (если я правильно понял)

2.
размести на панелях
http://sendfile.su/604099
код:
читать дальше »
Код:

[Setup]
AppName=Test Mouse Event
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
PrivilegesRequired=none
OutputDir=userdocs:Inno Setup Examples Output

[Files]
Source: "Cremator_poster.bmp"; DestDir: {app}; Check: A
Source: "Airex_tower_large.bmp"; DestDir: {app}; Check: B

Source: "Alyx_Vance_head.bmp"; DestDir: {app}; Check: C
Source: "Gordon_head_cover.bmp"; DestDir: {app};  Check: D


[  Code]

var
  Panel1: TPanel;
  NewRadioButton1: TNewRadioButton;
  NewRadioButton2: TNewRadioButton;
  Panel2: TPanel;
  NewRadioButton3: TNewRadioButton;
  NewRadioButton4: TNewRadioButton;
 
function A: Boolean;
begin
  Result:=NewRadioButton1.Checked;
end;

function B: Boolean;
begin
  Result:=NewRadioButton2.Checked;
end;

function C: Boolean;
begin
  Result:=NewRadioButton3.Checked;
end;


function D: Boolean;
begin
  Result:=NewRadioButton4.Checked;
end;


procedure InitializeWizard();
begin
  { Panel1 }
  Panel1 := TPanel.Create(WizardForm);
  with Panel1 do
  begin
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(104);
    Top := ScaleY(104);
    Width := ScaleX(185);
    Height := ScaleY(57);
    BevelOuter := bvNone;
    Caption := '';
  end;

  { NewRadioButton1 }
  NewRadioButton1 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton1 do
  begin
    Parent := Panel1;
    Left := ScaleX(16);
    Top := ScaleY(8);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Checked := True;
  end;

  { NewRadioButton2 }
  NewRadioButton2 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton2 do
  begin
    Parent := Panel1;
    Left := ScaleX(16);
    Top := ScaleY(32);
    Width := ScaleX(113);
    Height := ScaleY(17);
  end;

  { Panel2 }
  Panel2 := TPanel.Create(WizardForm);
  with Panel2 do
  begin
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(104);
    Top := ScaleY(168);
    Width := ScaleX(185);
    Height := ScaleY(62);
    BevelOuter := bvNone;
    Caption := '';
  end;

  { NewRadioButton3 }
  NewRadioButton3 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton3 do
  begin
    Parent := Panel2;
    Left := ScaleX(16);
    Top := ScaleY(0);
    Width := ScaleX(113);
    Height := ScaleY(17);
  end;

  { NewRadioButton4 }
  NewRadioButton4 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton4 do
  begin
    Parent := Panel2;
    Left := ScaleX(16);
    Top := ScaleY(24);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Checked := True;
  end;
end;



3.
Цитата:

Цитата GoshaPolo
Например на картинку нет события OnEnter »

есть "OnMouseEnter" :)
архив с фалами
http://sendfile.su/604084
код:
читать дальше »
Код:

[Setup]
AppName=Test Mouse Event
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
PrivilegesRequired=none
OutputDir=userdocs:Inno Setup Examples Output

[Files]
Source: "Cremator_poster.bmp"; Flags: dontcopy solidbreak
Source: "Airex_tower_large.bmp"; Flags: dontcopy solidbreak

[  Code]
var
  Pic: TBitmapImage;

procedure Navodim_na_kartinku(Sender: TObject); /// при наведении
begin
  Pic.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Airex_tower_large.bmp'));  /// грузим в картинку другой файл картинки
end;

//procedure Navodim_na_kartinku(Sender: TObject; Shift: TShiftState; X, Y: Integer); /// при наведении
//begin
//  Pic.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Airex_tower_large.bmp'));  /// грузим в картинку другой файл картинки
//end;
 
procedure Ubiraem_Mish(Sender: TObject); /// уводим курсор с картинки
begin
  Pic.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Cremator_poster.bmp'));  /// грузим в картинку файл картинки по умолчанию
end;



procedure InitializeWizard();
begin

  with WizardForm do
  begin
    AutoScroll := False;
    ClientHeight := ScaleY(637);
    ClientWidth := ScaleX(523);
    OuterNotebook.Visible := False;
    CancelButton.SetBounds(ScaleX(450), ScaleY(600), ScaleX(60), ScaleY(20));
    Bevel.Hide;
  end;
   
    ExtractTemporaryFile('Cremator_poster.bmp'); // извлекаем в темп обе картинки
    ExtractTemporaryFile('Airex_tower_large.bmp');
       
    Pic := TBitmapImage.Create(WizardForm)
    with Pic do
      begin
      Parent := WizardForm;
      Left := ScaleX(20);
      Top := ScaleY(20);
      Bitmap.LoadFromFile(ExpandConstant('{tmp}\Cremator_poster.bmp'));
      AutoSize := True;
     
      OnMouseEnter := @Navodim_na_kartinku;
      //OnMouseMove := @Navodim_na_kartinku;    /// при наведении (вариант)
      OnMouseLeave := @Ubiraem_Mish; /// когда курсор за пределами картинки
    end;

end;


procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.NextButton.Visible := False;
end;


GoshaPolo 30-05-2012 13:16 1924934

Johny777, хм... не хочет у меня компилятор 5.4.3 принимать OnMouseEnter. Пишет, что неизвестный идентификатор.

Johny777 30-05-2012 13:22 1924939

GoshaPolo,
у меня тоже 5.4.3.
всё компилится
(ANSI)
скачай архив с файлами
если не получится ставь заново или скачай InnoUltra из ссылки моего поста

GoshaPolo 30-05-2012 14:22 1924967

Johny777, установил InnoUltra и все переменные заработали как следует. Спасибо! По RadioButton тоже все верно поняли, все получилось. Только вот маленький вопросик по панелям. Можно ли сделать фон панели прозрачным?

И еще в догонку, последние четыре интересующих меня вопроса, больше не будет:

1. Как поменять название окна, которое отображается в панели задач? Со стандартного "Установить" на что-нибудь свое.
2. Как поменять заголовок окна деинсталяции?
3. Как поменять текст в первом окне деисталяции, где пишется "Вы действительно хотите удалить..."?
3. Как поменять текст в завершающем деинсталяцию окне, где пишется "Программа *** была полностью удалена с Вашего компьютера."?

GoshaPolo 30-05-2012 15:19 1925004

Johny777, вот сейчас появился вопрос :)

Это не есть хорошо, что RadioButton прозрачной нельзя сделать. А можно ли тогда чекбоксами реализовать подобное? Чтобы при нажатии на один чекбокс с другого снималась галочка, и без панелей.

И еще микро-вопросик всплыл. Какой ID имеет моя страница, вставленная после wpSelectComponents? Не могу ее скрыть никак.

Raf-9600 30-05-2012 15:31 1925013

У меня есть замечательный скрипт который добавляет зависимость от не дочерних компонентов, но есть в нем одно неудобство: он завязан на номерах компонентов. Собсно можно ли его переделать, чтобы зависимость была от названия компонента?
Т.е. желательно не от "Description", а от "Name".

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[Components]
Name: "GameDiablo2"; Description: Diablo 2; Flags: fixed; Types: full compact custom;

Name: GameLoD; Description: Lord of Destruction; Types: full;

Name: Version; Description: Версия; Flags: fixed; Types: full compact custom;
Name: Version\107; Description: 1.07; Flags: exclusive;
Name: Version\108; Description: 1.08; Flags: exclusive;
Name: Version\109; Description: 1.09; Flags: exclusive; Types: full;

Name: NoCD; Description: NoCD; Types: full;

[c0de]
var
OldEvent_ComponentsListClickCheck: TNotifyEvent;

procedure ComponentsListClickCheck(Sender: TObject);
begin
If IsComponentSelected('GameLoD') then begin
WizardForm.ComponentsList.ItemEnabled[3]:=True;
WizardForm.ComponentsList.ItemEnabled[4]:=True;
end else begin
WizardForm.ComponentsList.ItemEnabled[3]:=False;
WizardForm.ComponentsList.ItemEnabled[4]:=False;
OldEvent_ComponentsListClickCheck(Sender);
end;
end;

procedure InitializeWizard();
begin
with WizardForm.ComponentsList do
begin
OldEvent_ComponentsListClickCheck := OnClickCheck;
OnClickCheck := @ComponentsListClickCheck;
ItemEnabled[3]:=True;
end;
end;


Gnom_aka_Lexander 30-05-2012 15:43 1925020

Цитата:

Цитата Johny777
только ParentBackground := True; (цвет) »

На юникоде не только цвет, но и картинка ;)
Цитата:

Цитата Johny777
и радиобаттоны тоже не сделать прозрачными »

Аналогично - юникод их автоматом прозрачными делает.
Raf-9600, посмотри на свойство ItemName - вроде-бы то, что нужно.

GoshaPolo, ID страниц по порядку:
читать дальше »
wpWelcome = 1;
wpLicense = 2;
wpPassword = 3;
wpInfoBefore = 4;
wpUserInfo = 5;
wpSelectDir = 6;
wpSelectComponents = 7;
wpSelectProgramGroup = 8;
wpSelectTasks = 9;
wpReady = 10;
wpPreparing = 11;
wpInstalling = 12;
wpInfoAfter = 13;
wpFinished = 14;

YURSHAT 30-05-2012 15:44 1925022

Цитата:

Цитата GoshaPolo
Какой ID имеет моя страница, вставленная после wpSelectComponents? Не могу ее скрыть никак. »

Код:

...
var
  MyPage: TWizardPage;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID= MyPage.ID then
  ...
end;

Цитата:

Цитата GoshaPolo
Это не есть хорошо, что RadioButton прозрачной нельзя сделать. А можно ли тогда чекбоксами реализовать подобное? »

Чекбоксы тоже прозрычными сделать нельзя (дефолтные у анси) :)
Решение следующее: Создаете радиокнопку без надписи справа, создаете отдельно надпись к ней (элемент TLabel с Transparent:=True). Пишите процедурку клик по TLabel=клик по радиокнопочке. И в итоге получаете прозрачную радиокнопочку. Примеров таких кнопочек и чекбоксов - немеряно, поэтому ищем (скрипт Prototype от Shegorat к примеру)

Raf-9600 30-05-2012 15:49 1925026

Цитата:

Цитата Gnom_aka_Lexander
посмотри на свойство ItemName - вроде-бы то, что нужно. »

А можно пример использования? Просто если честно, то я не шарю в этом всем

GoshaPolo 30-05-2012 16:01 1925031

Цитата:

Цитата Gnom_aka_Lexander
ID страниц по порядку:
читать дальше » »

Про ID стандартных страниц я знаю. Меня интересует ID страницы созданной мной дополнительно.

Цитата:

Цитата YURSHAT
Чекбоксы тоже прозрычными сделать нельзя (дефолтные у анси) »

В том то и дело, что на АНСИ чекбоксы если поставить размером 13х13, фона по бокам нет, поскольку они квадратные. А RadioButton при размерах 13х13, имеют фон по краям.

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

ToCamoe 30-05-2012 16:22 1925044

1. как поменять иконку файла удаления, она по стандарту делается как иконка установщика, хочется другую. - вопрос решён
2. как сделать, чтобы при удаление, удалялась папка с её содержимым полностью, а не только те файлы, которые были установлены.
3. сколько переменных procedure InitializeWizard; может использоваться в одном коде ?

Raf-9600 30-05-2012 16:51 1925061

Цитата:

Цитата ToCamoe
1. как поменять иконку файла удаления, она по стандарту делается как иконка установщика, хочется другую. - вопрос решён »

Кстати, любопытно как это реализовано?

Цитата:

Цитата ToCamoe
2. как сделать, чтобы при удаление, удалялась папка с её содержимым полностью, а не только те файлы, которые были установлены. »

Самый простой способ:

Код:

[UninstallDelete]
Type: files; Name: {app}


Gnom_aka_Lexander 30-05-2012 17:01 1925069

ToCamoe,
Цитата:

Цитата ToCamoe
2. как сделать, чтобы при удаление, удалялась папка с её содержимым »

Код:

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

Цитата:

Цитата ToCamoe
3. сколько переменных procedure InitializeWizard; »

Процедура и переменная - это разные совершенно понятия.
Инно не умеет работать с перегруженными функциями,(вроде-бы) поэтому одноименные функции нельзя выполнять в одном скрипте. но никто не запрещает эти функции ( как и процедуры ) переименовать и выполнить внутри одной procedure InitializeWizard.
GoshaPolo, Можно так:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*Code]
var
  NewCheckBox1, NewCheckBox2: TNewCheckBox;

procedure CheckBoxClick(Sender: TObject);
begin
  case TNewCheckBox(Sender) of
    NewCheckBox1 : NewCheckBox2.Checked := not NewCheckBox1.Checked;
    NewCheckBox2 : NewCheckBox1.Checked := not NewCheckBox2.Checked;
  end;
end;

procedure InitializeWizard();
begin
  NewCheckBox1 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox1 do
  begin
    Parent := WizardForm;
    SetBounds( ScaleX(40), ScaleY(320), ScaleX(13), ScaleY(13));
    Checked := True;
  end;

  NewCheckBox2 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox2 do
  begin
    Parent := WizardForm;
    SetBounds( ScaleX(40), ScaleY(340), ScaleX(13), ScaleY(13));
    OnClick := @CheckBoxClick;
  end;
  NewCheckBox1.OnClick := @CheckBoxClick;
end;



Raf-9600, попозже чуток :)

ToCamoe 30-05-2012 17:11 1925074

Цитата:

Цитата Raf-9600
Кстати, любопытно как это реализовано? »

тырк
[Icons]
Name: {group}\Client; Filename: {app}\Client.exe; IconFilename: "C:\Users\Admin\img.ico";
Name: {group}\Деинсталлировать Client; Filename: {uninstallexe}; IconFilename: "C:\Users\Admin\img1.ico";


Цитата:

Цитата Raf-9600
Самый простой способ: »

Получается, что так ?
Код:

[UninstallDelete]  Type: files; Name: {app}\Имя папки

Gnom_aka_Lexander 30-05-2012 17:16 1925081

Цитата:

Цитата ToCamoe
Получается, что так ? »

Нет.
Код:

[UninstallDelete] 
Type: files; Name: {app}

В справке есть - {app} - папка установки. твой вопрос был -
Цитата:

Цитата ToCamoe
удалялась папка с её содержимым полностью, »


Raf-9600 30-05-2012 17:18 1925084

Цитата:

Цитата Gnom_aka_Lexander
попозже чуток »

Буду ждать, так как для меня проблема весьма актуальна.

Цитата:

Цитата ToCamoe
Получается, что так ? »

Если всю папку (со всем содержимым) в которую прога устанавливалась, то как сказал Gnom_aka_Lexander -
Код:

Type: filesandordirs; Name: {app}
Если папку Name (со всем содержимым) , из той папки в которую производилась установка, то
Код:

Type: filesandordirs; Name: {app}\Name
Вобще-то в русскоязычной справке этот момент достаточно хорошо объяснен.

Gnom_aka_Lexander 30-05-2012 17:34 1925094

Raf-9600, Вспомнил. бедой такой я уже занимался. и сделать можно привязку к именам компонентов. но. зависимость от номера все равно останется. единственное, что можно сделать - привязку к Description, чтобы избавится от привязки к номерам. Выглядеть будет так:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[Components]
Name: "GameDiablo2"; Description: Diablo 2; Flags: fixed; Types: full compact custom;

Name: GameLoD; Description: Lord of Destruction; Types: full;

Name: Version; Description: Версия; Flags: fixed; Types: full compact custom;
Name: Version\107; Description: 1.07; Flags: exclusive;
Name: Version\108; Description: 1.08; Flags: exclusive;
Name: Version\109; Description: 1.09; Flags: exclusive; Types: full;

Name: NoCD; Description: NoCD; Types: full;

[*code]
var
OldEvent_ComponentsListClickCheck: TNotifyEvent;

procedure ComponentsListClickCheck(Sender: TObject);
var
  i : Integer;
begin
  for i := 0 to WizardForm.ComponentsList.ItemCount -1 do
  begin
    case WizardForm.ComponentsList.ItemCaption[i] of
      '1.08', '1.09' : // перечисляем через запятую надписикомпонентов, которые зависят от GameLoD
      WizardForm.ComponentsList.ItemEnabled[i] := IsComponentSelected('GameLoD');
      '1.07' :  // тут логично выбрать этот компонент, если отключаем остальные зависимые
      WizardForm.ComponentsList.Checked[i] := not IsComponentSelected('GameLoD');
    end;
  end;
  OldEvent_ComponentsListClickCheck(Sender);
end;

procedure InitializeWizard();
begin
  with WizardForm.ComponentsList do
  begin
    OldEvent_ComponentsListClickCheck := OnClickCheck;
    OnClickCheck := @ComponentsListClickCheck;
    ItemEnabled[3]:=True;
  end;
end;


zeroka_no_onna 30-05-2012 17:45 1925106

Ап!
http://forum.oszone.net/post-1924730.html#post1924730
Не знает никто про диски?

Gnom_aka_Lexander 30-05-2012 17:48 1925108

zeroka_no_onna, скртипт покажи. Пытался я тут телепатией заниматься - люди начинают завидовать и обижаться.

zeroka_no_onna 30-05-2012 18:11 1925122

Вот скрипт
читать дальше »
PHP код:

#define NeedSize "1073741820"



#define NeedMem 0



;#define SecondProgressBar



;#define Components



#define records



#define facompress





[Setup]

SourceDir=.

OutputDir=J:FEARBUILD

AppName
=FEAR 2 Project Origin

AppVerName
=FEAR 2 Project Origin

AppVersion
=FEAR 2 Project Origin

DefaultDirName
={pf}FEAR 2 Project Origin

DefaultGroupName
=FEAR 2 Project Origin

AllowNoIcons
=yes

OutputBaseFilename
=FEAR2setup

WizardImageFile
=C:путьккартинке

WizardSmallImageFile
=C:путьккартинке

SetupIconFile
=C:путьккартинке

WindowVisible
=no

WindowShowCaption
=no

WindowResizable
=no

Compression
=none

SolidCompression
=no

DiskSpanning
=yes

SlicesPerDisk
=3

DiskSliceSize
=1566000000

#ifdef NeedSize

ExtraDiskSpaceRequired={#NeedSize}

#endif









[Languages]

Name"russian"MessagesFile"compiler:Languages\Russian.isl"



[Tasks]

Name"LangEng"Description"Английский"GroupDescription"Язык интерфейса"Flagsexclusive

Name
"LangRus"Description"Русский"GroupDescription"Язык интерфейса"Flagsexclusive

Name
"desktopicon"Description"{cm:CreateDesktopIcon}"GroupDescription"{cm:AdditionalIcons}"





[Icons]

Name"{group}\FEAR 2 Project Origin"Filename"{app}\FEAR2.exe"WorkingDir"{app}";

Name"{userdesktop}\FEAR 2 Project Origin"Filename"{app}\FEAR2.exe"WorkingDir"{app}"Tasksdesktopicon;

Name"{group}\{cm:UninstallProgram,FEAR 2 Project Origin}"Filename"{uninstallexe}"



[Registry]

RootHKCUSubkey"SOFTWARE\Monolith Productions"Flagsuninsdeletekeyifempty 

Root
HKCUSubkey"SOFTWARE\Monolith Productions\FEAR2"Flagsuninsdeletekey 

Root
HKCUSubkey"SOFTWARE\Monolith Productions\FEAR2\1.00.0000"ValueName"LANGUAGE"ValueTypeStringValueData"ru"TasksLangRusFlagsuninsdeletekey 

Root
HKCUSubkey"SOFTWARE\Monolith Productions\FEAR2\1.00.0000"ValueName"LANGUAGE"ValueTypeStringValueData"en"TasksLangEngFlagsuninsdeletekey 

Root
HKLMSubkey"SOFTWARE\Monolith Productions, Inc."Flagsuninsdeletekeyifempty 

Root
HKLMSubkey"SOFTWARE\Monolith Productions\F.E.A.R. 2 Project Origin"Flagsuninsdeletekey 

Root
HKLMSubkey"SOFTWARE\Monolith Productions\F.E.A.R. 2 Project Origin\1.00.0000"Flagsuninsdeletekey 

Root
HKLMSubkey"SOFTWARE\FEAR2Game"ValueName"AppPath"ValueTypeStringValueData"{app}"Flagsuninsdeletekey 





[Files]

Source"J:\FEAR 2 Project Origin\*"DestDir"{app}"Flagsignoreversion



Source
ISDone.dllDestDir: {tmp}; Flagsdontcopy

#ifdef records

Sourcerecords.infDestDir: {tmp}; Flagsdontcopy

#endif



#ifdef facompress

Source: Includefacompress.dllDestDir: {tmp}; Flagsdontcopy

#endif





[CustomMessages]

russian.ExtractedFile=Извлекается файл:

russian.Extracted=Распаковка игровых архивов...

russian.CancelButton=Отменить распаковку

russian
.Error=Ошибка распаковки!

russian.ElapsedTime=Прошло:

russian.RemainingTime=Осталось времени:

russian.EstimatedTime=Всего:

russian.AllElapsedTime=Время установки:



[
UninstallDelete]

TypefilesandordirsName: {app}



[
code]

const

  
PCFonFLY=true;

  
notPCFonFLY=false;

var

  
LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3TLabel;

  
ISDoneProgressBar1TNewProgressBar;

#ifdef SecondProgressBar

  
LabelPct2TLabel;

  
ISDoneProgressBar2:TNewProgressBar;

#endif

  
MyCancelButtonTButton;

  
ISDoneCancel:integer;

  
ISDoneError:boolean;

  
PCFVer:double;



type

  TCallback 
= function (OveralPct,CurrentPctinteger;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;



function 
WrapCallback(callback:TCallbackparamcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';



function 
ISArcExtract(CurComponent:CardinalPctOfTotal:doubleInNameOutPathExtractedPathAnsiStringDeleteInFile:booleanPasswordCfgFileWorkPathAnsiStringExtractPCFboolean ):booleanexternal 'ISArcExtract@files:ISDone.dll stdcall delayload';

function 
Exec2 (FileNameParamPAnsiChar;Show:boolean):booleanexternal 'Exec2@files:ISDone.dll stdcall delayload';

function 
ISFindFiles(CurComponent:CardinalFileMask:AnsiString; var ColFiles:integer):integerexternal 'ISFindFiles@files:ISDone.dll stdcall delayload';

function 
ISPickFilename(FindHandle:integerOutPath:AnsiString; var CurIndex:integerDeleteInFile:boolean):booleanexternal 'ISPickFilename@files:ISDone.dll stdcall delayload';

function 
ISGetName(TypeStr:integer):PAnsicharexternal 'ISGetName@files:ISDone.dll stdcall delayload';

function 
ISFindFree(FindHandle:integer):booleanexternal 'ISFindFree@files:ISDone.dll stdcall delayload';

function 
ISExec(CurComponent:CardinalPctOfTotal,SpecifiedProcessTime:doubleExeName,Parameters,TargetDir,OutputStr:AnsiString):booleanexternal 'ISExec@files:ISDone.dll stdcall delayload';

function 
FileSearchInit(RecursiveSubDir:boolean):booleanexternal 'FileSearchInit@files:ISDone.dll stdcall delayload';

function 
ISDoneInit(RecordFileName:AnsiStringTimeType,Comp1,Comp2,Comp3:CardinalWinHandleNeededMem:longintcallback:TCallback):booleanexternal 'ISDoneInit@files:ISDone.dll stdcall';

function 
ISDoneStop:booleanexternal 'ISDoneStop@files:ISDone.dll stdcall';



function 
ProgressCallback(OveralPct,CurrentPctinteger;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

begin

  
if OveralPct<=1000 then ISDoneProgressBar1.Position := OveralPct;

  
LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 OveralPct mod 10)+'%';

#ifdef SecondProgressBar

  
if CurrentPct<=1000 then ISDoneProgressBar2.Position := CurrentPct;

  
LabelPct2.Caption := IntToStr(CurrentPct div 10)+'.'+chr(48 CurrentPct mod 10)+'%';

#endif

  
LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFileLabelCurrFileName.FontLabelCurrFileName.Width-ScaleX(100));

  
LabelTime1.Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;

  
LabelTime2.Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;

  
LabelTime3.Caption:=ExpandConstant('{cm:AllElapsedTime}')+TimeStr3;

  
Result := ISDoneCancel;

end;



procedure CancelButtonOnClick(SenderTObject);

begin

  
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmationMB_YESNO) = IDYES then ISDoneCancel:=1;

end;



procedure HideControls;

begin

  WizardForm
.FileNamelabel.Hide;

  
ISDoneProgressBar1.Hide;

  
LabelPct1.Hide;

  
LabelCurrFileName.Hide;

  
LabelTime1.Hide;

  
LabelTime2.Hide;

  
MyCancelButton.Hide;

#ifdef SecondProgressBar

  
ISDoneProgressBar2.Hide;

  
LabelPct2.Hide;

#endif

end;



procedure CreateControls;

var 
PBTop:integer;

begin

  PBTop
:=ScaleY(50);

  
ISDoneProgressBar1 := TNewProgressBar.Create(WizardForm);

  
with ISDoneProgressBar1 do begin

    Parent   
:= WizardForm.InstallingPage;

    
Height   := WizardForm.ProgressGauge.Height;

    
Left     := ScaleX(0);

    
Top      := PBTop;

    
Width    := ScaleX(365);

    
Max      := 1000;

  
end;

  
LabelPct1 := TLabel.Create(WizardForm);

  
with LabelPct1 do begin

    Parent    
:= WizardForm.InstallingPage;

    
AutoSize  := False;

    
Left      := ISDoneProgressBar1.Width+ScaleX(5);

    
Top       := ISDoneProgressBar1.Top ScaleY(2);

    
Width     := ScaleX(80);

  
end;

  
LabelCurrFileName := TLabel.Create(WizardForm);

  
with LabelCurrFileName do begin

    Parent   
:= WizardForm.InstallingPage;

    
AutoSize := False;

    
Width    := ISDoneProgressBar1.Width+ScaleX(30);

    
Left     := ScaleX(0);

    
Top      := ScaleY(30);

  
end;

#ifdef SecondProgressBar

  
PBTop:=PBTop+ScaleY(25);

  
ISDoneProgressBar2 := TNewProgressBar.Create(WizardForm);

  
with ISDoneProgressBar2 do begin

    Parent   
:= WizardForm.InstallingPage;

    
Left     := ScaleX(0);

    
Top      := PBTop+ScaleY(8);

    
Width    := ISDoneProgressBar1.Width;

    
Max      := 1000;

    
Height   := WizardForm.ProgressGauge.Height;

  
end;

  
LabelPct2 := TLabel.Create(WizardForm);

  
with LabelPct2 do begin

    Parent    
:= WizardForm.InstallingPage;

    
AutoSize  := False;

    
Left      := ISDoneProgressBar2.Width+ScaleX(5);

    
Top       := ISDoneProgressBar2.Top ScaleY(2);

    
Width     := ScaleX(80);

  
end;

#endif

  
LabelTime1 := TLabel.Create(WizardForm);

  
with LabelTime1 do begin

    Parent   
:= WizardForm.InstallingPage;

    
AutoSize := False;

    
Width    := ISDoneProgressBar1.Width div 2;

    
Left     := ScaleX(0);

    
Top      := PBTop ScaleY(35);

  
end;

  
LabelTime2 := TLabel.Create(WizardForm);

  
with LabelTime2 do begin

    Parent   
:= WizardForm.InstallingPage;

    
AutoSize := False;

    
Width    := LabelTime1.Width+ScaleX(40);

    
Left     := ISDoneProgressBar1.Width div 2;

    
Top      := LabelTime1.Top;

  
end;  

  
LabelTime3 := TLabel.Create(WizardForm);

  
with LabelTime3 do begin

    Parent   
:= WizardForm.FinishedPage;

    
AutoSize := False;

    
Width    := 300;

    
Left     := 180;

    
Top      := 200;

  
end;

  
MyCancelButton:=TButton.Create(WizardForm);

  
with MyCancelButton do begin

    Parent
:=WizardForm;

    
Width:=ScaleX(135);

    
Caption:=ExpandConstant('{cm:CancelButton}');

    
Left:=ScaleX(360);

    
Top:=WizardForm.cancelbutton.top;

    
OnClick:=@CancelButtonOnClick;

  
end;

end;



Procedure CurPageChanged(CurPageIDInteger);

Begin

  
if (CurPageID wpFinished) and ISDoneError then

  begin

    LabelTime3
.Hide;

    
WizardForm.Caption:= ExpandConstant('{cm:Error}');

    
WizardForm.FinishedLabel.Font.Color:= clRed;

    
WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;

  
end;

end;



function 
CheckError:boolean;

begin

  result
:= not ISDoneError;

end;



procedure CurStepChanged(CurStepTSetupStep);

var 
Comps1,Comps2,Comps3TmpValue:cardinal;

    
FindHandle1,ColFiles1,CurIndex1,tmp:integer;

    
ExecError:boolean;

    
InFilePath,OutFilePath,OutFileName:PAnsiChar;

begin

  
if CurStep ssPostInstall then begin  //Если необходимо, можно поменять на ssPostInstall

    
WizardForm.ProgressGauge.Hide;

    
WizardForm.CancelButton.Hide;

    
CreateControls;

    
WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');

    
ISDoneCancel:=0;



// Распаковка всех необходимых файлов в папку {tmp}.

#ifdef facompress

    
ExtractTemporaryFile('facompress.dll'); //ускоряет распаковку .arc архивов.

#endif



#ifdef records

    
ExtractTemporaryFile('records.inf');

#endif



    
ISDoneError:=true;

    if 
ISDoneInit(ExpandConstant('{src}\records.inf'), $F777Comps1,Comps2,Comps3MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin

      
repeat

        
if not FileSearchInit(falsethen break;



        if 
not ISArcExtract 00ExpandConstant('{app}\*.arc'), ExpandConstant('{app}'), ''false''''ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

        if 
not ISExec(000'cmd.exe'' /C del /F /Q PACK1.arc'ExpandConstant('{app}'), '...'then break;       

        if 
not ISExec(000'cmd.exe'' /C del /F /Q PACK2.arc'ExpandConstant('{app}'), '...'then break;

          

        if 
not ISExec(000ExpandConstant('{app}\rep.exe'), ' "Layer10.pcf.rep"',ExpandConstant('{app}'), 'Layer10.pcf'then break;

        if 
not ISExec(000'cmd.exe'' /C del /F /Q Layer10.pcf.rep'ExpandConstant('{app}'), '...'then break;

        if 
not ISExec(000ExpandConstant('{app}\precomp.exe'), ExpandConstant('-r -o"{app}\Layer10.Arch01" "{app}\Layer10.pcf"'), ExpandConstant('{app}'), 'Layer10.Arch01'then break;  

        if 
not ISExec(000'cmd.exe'' /C del /F /Q Layer10.pcf'ExpandConstant('{app}'), '...'then break;



        if 
not ISExec(000ExpandConstant('{app}\rep.exe'), ' "Layer15.pcf.rep"',ExpandConstant('{app}'), 'Layer15.pcf'then break;

        if 
not ISExec(000'cmd.exe'' /C del /F /Q Layer15.pcf.rep'ExpandConstant('{app}'), '...'then break;

        if 
not ISExec(000ExpandConstant('{app}\precomp.exe'), ExpandConstant('-r -o"{app}\Layer15.Arch01" "{app}\Layer15.pcf"'), ExpandConstant('{app}'), 'Layer15.Arch01'then break;  

        if 
not ISExec(000'cmd.exe'' /C del /F /Q Layer15.pcf rep.exe msvcr80.dll packjpg_dll.dll zlib1.dll precomp.exe'ExpandConstant('{app}'), '...'then break;



        
ISDoneError:=false;

      
until true;

      
ISDoneStop;

    
end;

    
HideControls;

    
WizardForm.CancelButton.Visible:=true;

    
WizardForm.CancelButton.Enabled:=false;

  
end;

  if (
CurStep=ssPostInstall) and ISDoneError then begin

    Exec2
(ExpandConstant('{uninstallexe}'), '/VERYSILENT'false);

  
end;

end



Раньше с многодисковыми установками сталкиваться не приходилось, потому вобще не представляю в чём дело.
У меня подозрения только на использование ssPostInstall а не штатного значения ssInstall

Gnom_aka_Lexander 30-05-2012 18:14 1925126

zeroka_no_onna,
Код:

DiskSpanning=yes
SlicesPerDisk=3
DiskSliceSize=1566000000

эти строчки зачем? они нужны, когда упаковка средствами самого Inno. у IsDone усть своя функция запроса следующего диска.

GoshaPolo 30-05-2012 18:38 1925139

Кто-нибудь мне подскажет все-таки как скрыть созданную дополнительно страницу? Какой у нее будет ID?

Gnom_aka_Lexander 30-05-2012 18:51 1925146

GoshaPolo, Тебе ответили уже:
http://forum.oszone.net/post-1925022-125.html
Ее ID равен MyPage.ID.

GoshaPolo 30-05-2012 19:03 1925152

Gnom_aka_Lexander, сорри не заметил того ответа. Но все же я не могу сообразить. Страницу я создал в расширенной версии компилятора от ResTools внутренними средствами, то есть не прописывал ее в коде. Как бы узнать какой у нее ID?

zeroka_no_onna 30-05-2012 19:06 1925153

Цитата:

эти строчки зачем? они нужны, когда упаковка средствами самого Inno. у IsDone усть своя функция запроса следующего диска.
ISDone вцелом переусложнён и неудобен, вот именно и хотелось использовать его только для того, что само Inno не умеет - т.е. прогресса для сторонних упаковщиков.
Тут задумывалось что вначале само inno копирует с дисков, а затем уж IsDone + arc и т.п.
Ведь нужные ему файлы, всё в сетапе же должно быть?
Код:

#define records
#define facompress

вот эти и arc?

Гм, кстати, rep/precomp/packjpg и прочее у меня как-раз таки и не в сетапе.Хотя не пофиг ли ему где и есть ли они?
Вобшем, не понимаю.

Диски уже записаны потому переделывать поздно, на будущее хотелось разобраться в чём дело.

Gnom_aka_Lexander 30-05-2012 19:22 1925165

GoshaPolo, код покажи.zeroka_no_onna, придется сперва почитать всетаки, справки по исдону. facompress - длл-ка которая ускоряет распаковку фриарк. records - директива, нужная для механизма равномерного заполнения прогрессбара. и все усложнение начинается с того момента, как запакованное во фриарк было засунуто в инсталл.

Raf-9600 30-05-2012 19:23 1925166

Цитата:

Цитата Gnom_aka_Lexander
Выглядеть будет так »

Благодарю. Меня ещё интересует:
1. Как сделать чтобы компонент выбирался и блокировался? У меня получается делать только что-то одно :(
2. Можно ли сделать чтобы правило выставления галочки в зависимости от компонента, не работало и в обратном направлении. Т.е. нужно чтобы если компонент выбран, то галочка ставилась, а если не выбран, то пользователь сам мог её поставить или убрать.

Грубо говоря, вот код, и последние два правила работают не так как нужно. Буду весьма признателен если подскажете как это скорректировать:

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[CustomMessages]
TypeOfInstallation=Тип установки:
Game=Игра
OnlyLocation=Только локализация
backup=Резервная копия
Text=Текст:
VoiceDiablo2=Озвучка Diablo 2:
VersionGame=Версия игры:

[Components]
Name: "Game"; Description: "{cm:TypeOfInstallation}"; Flags: disablenouninstallwarning;
Name: "Game\Full"; Description: "{cm:Game}"; Flags: exclusive disablenouninstallwarning; Types: full
Name: "Game\Lokal"; Description: "{cm:OnlyLocation}"; Flags: collapsed exclusive disablenouninstallwarning;
Name: "Game\Lokal\Backup"; Description: "{cm:backup}"; Flags: disablenouninstallwarning;


Name: "GameDiablo2"; Description: Diablo 2; Types: full
Name: "GameDiablo2\Text"; Description: "{cm:Text}"; Flags: collapsed; Types: full
Name: "GameDiablo2\VoiceD2"; Description: "{cm:VoiceDiablo2}"; Flags: collapsed; Types: full
Name: "Version"; Description: "{cm:VersionGame}"; Flags: collapsed disablenouninstallwarning;


[c0de]
var
OldEvent_ComponentsListClickCheck: TNotifyEvent;

procedure ComponentsListClickCheck(Sender: TObject);
var
  i : Integer;
begin
  for i := 0 to WizardForm.ComponentsList.ItemCount -1 do
  begin
    case WizardForm.ComponentsList.ItemCaption[i] of
      '1.04c', '1.05b' : // перечисляем через запятую надписи компонентов, которые зависят от GameLoD
      WizardForm.ComponentsList.ItemEnabled[i] := not (IsComponentSelected('GameLoD') or IsComponentSelected('Mod\PlugY'));

      '1.07', '1.08' :
      WizardForm.ComponentsList.ItemEnabled[i] := IsComponentSelected('GameLoD') and not IsComponentSelected('Mod\PlugY');

      ExpandConstant('{cm:Text}'), ExpandConstant('{cm:VoiceDiablo2}'), ExpandConstant('{cm:VersionGame}') :
      WizardForm.ComponentsList.Checked[i] := IsComponentSelected('Game\Full');

      ExpandConstant('{cm:Text}'), ExpandConstant('{cm:VoiceDiablo2}'), ExpandConstant('{cm:VersionGame}') :
      WizardForm.ComponentsList.ItemEnabled[i] := not IsComponentSelected('Game\Full');


    end;
  end;
  OldEvent_ComponentsListClickCheck(Sender);
end;

procedure InitializeWizard();
begin
  with WizardForm.ComponentsList do
  begin
    OldEvent_ComponentsListClickCheck := OnClickCheck;
    OnClickCheck := @ComponentsListClickCheck;
    ItemEnabled[3]:=True;
  end;
end;


Gnom_aka_Lexander 30-05-2012 19:39 1925172

Raf-9600,
Код:

      '1.07', '1.08' :
      WizardForm.ComponentsList.ItemEnabled[i] := IsComponentSelected('GameLoD') and not IsComponentSelected('Mod\PlugY');

      ExpandConstant('{cm:Text}'), ExpandConstant('{cm:VoiceDiablo2}'), ExpandConstant('{cm:VersionGame}') :
      begin
        WizardForm.ComponentsList.Checked[i] := IsComponentSelected('Game\Full');
        WizardForm.ComponentsList.ItemEnabled[i] := not IsComponentSelected('Game\Full');
      end;


GoshaPolo 30-05-2012 19:54 1925176

Gnom_aka_Lexander, кроме того, что ниже, в коде больше нет упоминания про эту страницу:

читать дальше »
Код:

procedure RedesignWizardForm;
begin
 
  ISCustomPage1 := CreateCustomPage(wpSelectProgramGroup, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');
 
  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

end;


Gnom_aka_Lexander 30-05-2012 19:59 1925178

GoshaPolo, ISCustomPage1.ID

GoshaPolo 30-05-2012 20:07 1925180

Gnom_aka_Lexander, спасибо! Наконец-то! Пол дня бился с этой страницей :)

Raf-9600 30-05-2012 20:09 1925182

Цитата:

Цитата Gnom_aka_Lexander
WizardForm.ComponentsList.ItemEnabled[i] := not IsComponentSelected('Game\Full');»

Выделяет строчку и пишет ошибку colon (':') expeacted.

Gnom_aka_Lexander 30-05-2012 20:13 1925183

Raf-9600,
Код:

procedure ComponentsListClickCheck(Sender: TObject);
var
  i : Integer;
begin
  for i := 0 to WizardForm.ComponentsList.ItemCount -1 do
  begin
    case WizardForm.ComponentsList.ItemCaption[i] of
      '1.04c', '1.05b' : // перечисляем через запятую надписи компонентов, которые зависят от GameLoD
      WizardForm.ComponentsList.ItemEnabled[i] := not (IsComponentSelected('GameLoD') or IsComponentSelected('Mod\PlugY'));

      '1.07', '1.08' :
      WizardForm.ComponentsList.ItemEnabled[i] := IsComponentSelected('GameLoD') and not IsComponentSelected('Mod\PlugY');

      ExpandConstant('{cm:Text}'), ExpandConstant('{cm:VoiceDiablo2}'), ExpandConstant('{cm:VersionGame}') :
      begin
        WizardForm.ComponentsList.Checked[i] := IsComponentSelected('Game\Full');
        WizardForm.ComponentsList.ItemEnabled[i] := not IsComponentSelected('Game\Full');
      end;
    end;
  end;
  OldEvent_ComponentsListClickCheck(Sender);
end;


Raf-9600 30-05-2012 20:19 1925186

Gnom_aka_Lexander, благодарю, а как решить вторую проблему? Ну т.е. если выбрать компонент Game\Lokal то ни GameDiablo2\Text, ни GameDiablo2\VoiceD2, ни Version нельзя выбрать :(

Gnom_aka_Lexander 30-05-2012 20:32 1925190

Raf-9600, вот так, тогда:
читать дальше »
Код:

procedure ComponentsListClickCheck(Sender: TObject);
var
  i : Integer;
begin
  for i := 0 to WizardForm.ComponentsList.ItemCount -1 do
  begin
    case WizardForm.ComponentsList.ItemCaption[i] of
      '1.04c', '1.05b' : // перечисляем через запятую надписи компонентов, которые зависят от GameLoD
      WizardForm.ComponentsList.ItemEnabled[i] := not (IsComponentSelected('GameLoD') or IsComponentSelected('Mod\PlugY'));

      '1.07', '1.08' :
      WizardForm.ComponentsList.ItemEnabled[i] := IsComponentSelected('GameLoD') and not IsComponentSelected('Mod\PlugY');

      ExpandConstant('{cm:Text}'), ExpandConstant('{cm:VoiceDiablo2}'), ExpandConstant('{cm:VersionGame}') :
      begin
        if IsComponentSelected('Game\Full') then WizardForm.ComponentsList.Checked[i] := IsComponentSelected('Game\Full');
        WizardForm.ComponentsList.ItemEnabled[i] := not IsComponentSelected('Game\Full');
      end;
    end;
  end;
  OldEvent_ComponentsListClickCheck(Sender);
end;


Обрати внимание на условие - if IsComponentSelected('Game\Full') then - тоесть компонент принудительно выбран, только если выбран компонет Game\Full, в противном случае его можно выбирать самостоятельно.

El Sanchez 30-05-2012 21:22 1925206

Цитата:

Цитата Raf-9600
Ктонить может модифицировать скрипт для конвертации OGG чтобы он выполнялся два раза, т.е. нужно чтобы первый раз он конвертировал содержимое папки {app}\data\local\sfx (при условии что выбран компонент "GameVoice"), а второй раз чтобы конвертировал содержимое \data\global\music (при условии что выбран компонент "Music") »

Raf-9600, модифицировать не стал, написал свой вариант.
читать дальше »

Код:

[code]
var
    RecodePage: TOutputProgressWizardPage;

//
procedure InitializeWizard();
begin
    RecodePage := CreateOutputProgressPage('Обработка файлов', '');
end;

procedure RecodeOgg(Path, Mask: String);
var
    iFiles: TArrayOfString;
    FindRec: TFindRec;
    ResultCode, i: Integer;
begin
    try
        RecodePage.Show;
        if FindFirst(ExpandConstant(AddBackslash(RemoveBackslash(Path)) + Mask), FindRec) then
        try
            repeat
                if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
                begin
                    SetArrayLength(iFiles, GetArrayLength(iFiles)+1);
                    iFiles[GetArrayLength(iFiles)-1] := ExpandConstant(AddBackslash(RemoveBackslash(Path)) + FindRec.Name);
                end;
            until not FindNext(FindRec);
        finally
            FindClose(FindRec);
        end;
        for i := 1 to GetArrayLength(iFiles) do
        begin
            RecodePage.SetProgress(i, GetArrayLength(iFiles));
            RecodePage.SetText(iFiles[i-1], IntToStr(i*100/GetArrayLength(iFiles)) + ' %');
            Exec(ExpandConstant('{app}\oggdec.exe'), '-Q ' + AddQuotes(iFiles[i-1]), '', SW_HIDE, EwWaitUntilTerminated, ResultCode);
            DeleteFile(iFiles[i-1]);
        end;
    finally
        RecodePage.Hide;
    end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
        if IsComponentSelected('GameVoice') then RecodeOgg('{app}\data\local\sfx', '*.ogg');
        if IsComponentSelected('Music') then RecodeOgg('{app}\data\global\music', '*.ogg');
    end;
end;


Raf-9600 30-05-2012 22:02 1925222

Цитата:

Цитата El Sanchez
модифицировать не стал, написал свой вариант. »

Это его как-то вызывать нужно? Ибо вот только что проверил и никакой конвертации не произошло...

El Sanchez 30-05-2012 22:11 1925224

Raf-9600, вызывается на этапе ssPostInstall, смотрите в конце. Папки существуют-то, где ogg-файлы находятся? oggdec.exe в {app} или где-то еще?

Raf-9600 30-05-2012 22:19 1925237

El Sanchez, Вот весь скрипт:

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

               


[Languages]
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"

[components]
Name: "GameVoice"; Description: GameVoice; Types: full
Name: "Music"; Description: "Music"; Types: full


[Files]

Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_01.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_02.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_03.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_04.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_05.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_06.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_07.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_08.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_09.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_10.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_gossip_sor.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_intro.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_intro_sor.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q1_after.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q1_early.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q1_init.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q1_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q2_after.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q2_early.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q2_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q3_after.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q3_early.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q3_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q4_after_scroll.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q4_early.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q4_early_scroll.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q4_init.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q4_instructions.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q4_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q5_after.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q5_early.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q5_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q6_after.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q6_early.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_act1_q6_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_goodday.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_goodevening.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_goodmorning.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_greetings.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_hello.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_orderwelcomes.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_welcomeback.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Akara\Aka_yes.ogg; DestDir: {app}\data\local\sfx\Act1\Akara;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_complete_andariel.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_complete_burialground.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_complete_denofevil.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_complete_forgottentower.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_complete_toolsoftrade.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_entry_burialground.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_entry_catacombs.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_entry_denofevil.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_entry_forgottentower.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_entry_jail.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_entry_monastery.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_entry_wilderness.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_find_cairnstones.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_find_treeofinifuss.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_find_tristram.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Amazon\Ama_act1_rescue_cain.ogg; DestDir: {app}\data\local\sfx\Act1\Amazon;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_complete_andariel.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_complete_burialground.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_complete_denofevil.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_complete_forgottentower.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_complete_toolsoftrade.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_entry_burialground.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_entry_catacombs.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_entry_denofevil.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_entry_forgottentower.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_entry_jail.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_entry_monastery.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_entry_wilderness.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_find_cairnstones.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_find_treeofinifuss.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_find_tristram.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Barbarian\Bar_act1_rescue_cain.ogg; DestDir: {app}\data\local\sfx\Act1\Barbarian;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_gossip_01.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_gossip_02.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_gossip_03.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_gossip_04.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_gossip_afterA1Q6init.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q3_after.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q3_early.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q3_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q4_rescuedbyhero.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q4_rescuedbyrogues.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q4_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q4_tragedyoftristram.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q5_after.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q5_early.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q5_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q6_after.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q6_early.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q6_init.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_act1_q6_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_help1.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_help2.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Cain\Cain_help3.ogg; DestDir: {app}\data\local\sfx\Act1\Cain;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_gossip_01.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_gossip_02.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_gossip_03.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_gossip_04.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_gossip_05.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_gossip_06.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_gossip_bar.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_intro.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_intro_bar.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q1_after_alt.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q1_after_main.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q1_early.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q1_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q2_after.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q2_early.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q2_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q3_after.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q3_early.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q3_init.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q3_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q4_after_scroll.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q4_early.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q4_instructions.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q4_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q4_successful_scroll.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q5_after.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q5_early.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q5_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q6_after.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q6_early.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_act1_q6_successful.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_farewell.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_goodbye.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_goodday.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_goodevening.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_goodmorning.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_goodtoseeyou.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_greetings.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_hello.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_heythere.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_needhelp.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_whatcanIdoforyou.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_whatchaneed.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Charsi\Cha_yes.ogg; DestDir: {app}\data\local\sfx\Act1\Charsi;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Gheed\Ghe_act1_gossip_01.ogg; DestDir: {app}\data\local\sfx\Act1\Gheed;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Gheed\Ghe_act1_gossip_02.ogg; DestDir: {app}\data\local\sfx\Act1\Gheed;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Gheed\Ghe_act1_gossip_03.ogg; DestDir: {app}\data\local\sfx\Act1\Gheed;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Gheed\Ghe_act1_gossip_04.ogg; DestDir: {app}\data\local\sfx\Act1\Gheed;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Gheed\Ghe_act1_gossip_05.ogg; DestDir: {app}\data\local\sfx\Act1\Gheed;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Gheed\Ghe_act1_gossip_06.ogg; DestDir: {app}\data\local\sfx\Act1\Gheed;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Gheed\Ghe_act1_gossip_nec.ogg; DestDir: {app}\data\local\sfx\Act1\Gheed;
Source: D:\Diablo 2\Localization\Sound\The Best\d2speech\data\local\sfx\Act1\Gheed\Ghe_act1_intro.ogg; DestDir: {app}\data\local\sfx\Act1\Gheed;



Source: D:\Diablo 2\Music\D2 OST\Act1\Cave (caves).ogg; DestName: caves.ogg; DestDir: {app}\data\global\music\Act1\
Source: D:\Diablo 2\Music\D2 OST\Act1\Crypt.ogg; DestDir: {app}\data\global\music\Act1\
Source: D:\Diablo 2\Music\D2 OST\Act1\Monastery.ogg; DestDir: {app}\data\global\music\Act1\
Source: D:\Diablo 2\Music\D2 OST\Act1\Rogue (town1).ogg; DestName: town1.ogg; DestDir: {app}\data\global\music\Act1\
Source: D:\Diablo 2\Music\D2 OST\Act1\Wilderness (wild).ogg; DestName: wild.ogg; DestDir: {app}\data\global\music\Act1\
Source: D:\Diablo 2\Music\D2 OST\Act2\Desert.ogg; DestDir: {app}\data\global\music\Act2\
Source: D:\Diablo 2\Music\D2 OST\Act2\Sanctuary (Harem).ogg; DestName: Harem.ogg; DestDir: {app}\data\global\music\Act2\
Source: D:\Diablo 2\Music\D2 OST\Act2\Tombs.ogg; DestDir: {app}\data\global\music\Act2\
Source: D:\Diablo 2\Music\D2 OST\Act2\Toru (town2).ogg; DestName: town2.ogg; DestDir: {app}\data\global\music\Act2\
Source: D:\Diablo 2\Music\D2 OST\Act3\Jungle.ogg; DestDir: {app}\data\global\music\Act3\
Source: D:\Diablo 2\Music\D2 OST\Act3\Spider.ogg; DestDir: {app}\data\global\music\Act3\
Source: D:\Diablo 2\Music\D2 OST\Act4\Leoric (diablo).ogg; DestName: diablo.ogg; DestDir: {app}\data\global\music\Act4\
Source: D:\Diablo 2\Music\D2 OST\Act4\Mesa.ogg; DestDir: {app}\data\global\music\Act4\

Source: D:\Diablo 2\Utilites\Ogg - Wav\oggdec.exe; DestDir: {app}; Flags: ignoreversion;



[C0de]
var
    RecodePage: TOutputProgressWizardPage;

//
procedure InitializeWizard();
begin
    RecodePage := CreateOutputProgressPage('Обработка файлов', '');
end;

procedure RecodeOgg(Path, Mask: String);
var
    iFiles: TArrayOfString;
    FindRec: TFindRec;
    ResultCode, i: Integer;
begin
    try
        RecodePage.Show;
        if FindFirst(ExpandConstant(AddBackslash(RemoveBackslash(Path)) + Mask), FindRec) then
        try
            repeat
                if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
                begin
                    SetArrayLength(iFiles, GetArrayLength(iFiles)+1);
                    iFiles[GetArrayLength(iFiles)-1] := ExpandConstant(AddBackslash(RemoveBackslash(Path)) + FindRec.Name);
                end;
            until not FindNext(FindRec);
        finally
            FindClose(FindRec);
        end;
        for i := 1 to GetArrayLength(iFiles) do
        begin
            RecodePage.SetProgress(i-1, GetArrayLength(iFiles));
            RecodePage.SetText(iFiles[i-1], IntToStr((i-1)*100/GetArrayLength(iFiles)) + ' %');
            Exec(ExpandConstant('{app}\oggdec.exe'), '-Q ' + AddQuotes(iFiles[i]), '', SW_HIDE, EwWaitUntilTerminated, ResultCode);
            DeleteFile(iFiles[i]);
        end;
    finally
        RecodePage.Hide;
    end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
        if IsComponentSelected('GameVoice') then RecodeOgg('{app}\data\local\sfx', '*.ogg');
        if IsComponentSelected('Music') then RecodeOgg('{app}\data\global\music', '*.ogg');
    end;
end;


Sanshalay 30-05-2012 22:32 1925248

Как создать свою пустую страницу в инсталляторе?

YURSHAT 31-05-2012 01:48 1925327

Цитата:

Цитата Sanshalay
Как создать свою пустую страницу в инсталляторе? »

Пример
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup

[Languages]
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"

[CustomMessages]
ru.PageName=Название моей страницы
ru.PageDescr=Описание моей страницы

[_code]
var
  MyPage: TWizardPage;
  Label1: TLabel;
 
procedure RedesignWizardForm;
begin
  MyPage:= CreateCustomPage(wpWelcome, ExpandConstant('{cm:PageName}'), ExpandConstant('{cm:PageDescr}'));
 
  Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Parent := MyPage.Surface;
    SetBounds(ScaleX(0), ScaleY(216), ScaleX(417), ScaleY(17));
    Caption := SetupMessage(msgInfoAfterClickLabel);
  end;
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
end;


ILIA_1992 31-05-2012 02:02 1925329

Как исправить эту ошибку ?

http://s019.radikal.ru/i607/1205/b3/13fc49b5389c.jpg

Gnom_aka_Lexander 31-05-2012 09:57 1925425

ILIA_1992, так-то оффтоп. Но, отвечу - использовать для распаковки те-же параметры, которые были при упаковке. от Inno это никаким боком не зависит.

ILIA_1992 31-05-2012 10:47 1925448

Gnom_aka_Lexander,

Я давно репаки не делал . Всё забыл .
Начинаю с нуля.
А поподробнее про ошибку можно ? Заранее спасибо.

И ещё один вопрос .

Как найти реестр ? например Alan Wake's American Nightmare .

El Sanchez 31-05-2012 12:07 1925483

Цитата:

Цитата Raf-9600
Ибо вот только что проверил и никакой конвертации не произошло... »

Цитата:

Цитата Raf-9600
Вот весь скрипт: »

Raf-9600, ясно, ведь в указанных папках ogg-файлов нет, они глубже - в подпапках. Вот вариант №2, универсальный. В процедуру RecodeOgg добавлен параметр Recurse (True - искать в подпапках, False - только в указанной папке).
читать дальше »

[code]
Код:

var
    RecodePage: TOutputProgressWizardPage;


function FindFiles(Path, Mask: String; Recurse: BOOL): TArrayOfString;
var
    FindRecAll, FindRecMask: TFindRec;
begin
    if not DirExists(Path) then Exit;
    //
    if FindFirst(AddBackslash(RemoveBackslash(Path)) + Mask, FindRecMask) then
    try
        repeat
            if (FindRecMask.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
            begin
                SetArrayLength(Result, GetArrayLength(Result)+1);
                Result[GetArrayLength(Result)-1] := AddBackslash(RemoveBackslash(Path)) + FindRecMask.Name;
            end;
        until not FindNext(FindRecMask);
    finally
        FindClose(FindRecMask);
    end;
    //
    if Recurse then
    begin
        if FindFirst(AddBackslash(RemoveBackslash(Path)) + '*', FindRecAll) then
        try
            repeat
                if (FindRecAll.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and (FindRecAll.Name <> '.') and (FindRecAll.Name <> '..') then
                    Result := FindFiles(AddBackslash(RemoveBackslash(Path)) + FindRecAll.Name, Mask, Recurse);
            until not FindNext(FindRecAll);
        finally
            FindClose(FindRecAll);
        end;
    end;
end;

procedure RecodeOgg(Path, Mask: String; Recurse: BOOL);
var
    iFiles: TArrayOfString;
    ResultCode, i: Longint;
begin
    try
        RecodePage.Show;
        iFiles := FindFiles(Path, Mask, Recurse);
        for i := 1 to GetArrayLength(iFiles) do
        begin
            RecodePage.SetProgress(i, GetArrayLength(iFiles));
            RecodePage.SetText(iFiles[i-1], IntToStr(i*100/GetArrayLength(iFiles)) + ' %');

            Exec(ExpandConstant('{app}\oggdec.exe'), '-Q ' + AddQuotes(iFiles[i-1]), '', SW_HIDE, EwWaitUntilTerminated, ResultCode);
            DeleteFile(iFiles[i-1]);

        end;
    finally
        RecodePage.Hide;
    end;
end;

procedure InitializeWizard();
begin
    RecodePage := CreateOutputProgressPage('Обработка файлов', '');
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
        if IsComponentSelected('GameVoice') then RecodeOgg(ExpandConstant('{app}\data\local\sfx'), '*.ogg', True);
        if IsComponentSelected('Music') then RecodeOgg(ExpandConstant('{app}\data\global\music'), '*.ogg', True);
    end;
end;


P.S. Не увидел в вашем коде привязку какого-нибудь файла к компоненту.
P.P.S. Вместо выделенных строк можете написать для теста чего-нибудь нейтральное, типа Sleep(100).

Raf-9600 31-05-2012 14:10 1925536

Цитата:

Цитата El Sanchez
Не увидел в вашем коде привязку какого-нибудь файла к компоненту. »

Это тестовый скрипт.

Все файлы которые отвечают за GameVoice сконвертировались отлично, но вот когда дело дошло до Music то появилась ошибка Out Of Range. и компилятор выделил:
Код:

Exec(ExpandConstant('{app}\oggdec.exe'), '-Q ' + AddQuotes(iFiles[i]), '', SW_HIDE, EwWaitUntilTerminated, ResultCode);
Ещё как я понял этот скрипт создает свою страничку, а для меня это совсем не подходит, так как это вряд ли получиться совместить с теми украшательствами что уже имеются у меня.

И ещё на данный момент скрипт в поле статуса пишет какой файл обрабатывает, а в том поле что нижу, пишет проценты. Но мне бы хотелось чтобы в поле статуса писалось во время обработки GameVoice - "Конвертация монологов", а во время обработки Music - "Конвертация музыки". И после этих надписей уже можно отображение процентов прогресса.

El Sanchez 31-05-2012 16:11 1925589

Цитата:

Цитата Raf-9600
Все файлы которые отвечают за GameVoice сконвертировались отлично, но вот когда дело дошло до Music то появилась ошибка Out Of Range. и компилятор выделил: »

Raf-9600, мерси, поправил.
Цитата:

Цитата Raf-9600
Ещё как я понял этот скрипт создает свою страничку, а для меня это совсем не подходит, так как это вряд ли получиться совместить с теми украшательствами что уже имеются у меня.
И ещё на данный момент скрипт в поле статуса пишет какой файл обрабатывает, а в том поле что нижу, пишет проценты. Но мне бы хотелось чтобы в поле статуса писалось во время обработки GameVoice - "Конвертация монологов", а во время обработки Music - "Конвертация музыки". И после этих надписей уже можно отображение процентов прогресса. »

Raf-9600, лады, раз хотите стандартную, то вариант №3:
читать дальше »

Код:

[code]
function FindFiles(Path, Mask: String; Recurse: BOOL): TArrayOfString;
var
    FindRecAll, FindRecMask: TFindRec;
begin
    if not DirExists(Path) then Exit;
    //
    if FindFirst(AddBackslash(RemoveBackslash(Path)) + Mask, FindRecMask) then
    try
        repeat
            if (FindRecMask.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
            begin
                SetArrayLength(Result, GetArrayLength(Result)+1);
                Result[GetArrayLength(Result)-1] := AddBackslash(RemoveBackslash(Path)) + FindRecMask.Name;
            end;
        until not FindNext(FindRecMask);
    finally
        FindClose(FindRecMask);
    end;
    //
    if Recurse then
    begin
        if FindFirst(AddBackslash(RemoveBackslash(Path)) + '*', FindRecAll) then
        try
            repeat
                if (FindRecAll.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and (FindRecAll.Name <> '.') and (FindRecAll.Name <> '..') then
                    Result := FindFiles(AddBackslash(RemoveBackslash(Path)) + FindRecAll.Name, Mask, Recurse);
            until not FindNext(FindRecAll);
        finally
            FindClose(FindRecAll);
        end;
    end;
end;

procedure RecodeOgg(Path, Mask, Status: String; Recurse: BOOL);
var
    iFiles: TArrayOfString;
    ResultCode, i: Longint;
begin
    iFiles := FindFiles(Path, Mask, Recurse);
    with WizardForm.ProgressGauge do
    begin
        Position := 0;
        Max := GetArrayLength(iFiles)-1;
        for i := 1 to Max+1 do
        begin
            Position := i;
            WizardForm.StatusLabel.Caption := Status + IntToStr(i*100/(Max+1)) + ' %';
            Exec(ExpandConstant('{app}\oggdec.exe'), '-Q ' + AddQuotes(iFiles[i-1]), '', SW_HIDE, EwWaitUntilTerminated, ResultCode);
            DeleteFile(iFiles[i-1]);
        end;
    end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
        if IsComponentSelected('GameVoice') then RecodeOgg(ExpandConstant('{app}\data\local\sfx'), '*.ogg', 'Конвертация монологов выполнена на... ', True);
        if IsComponentSelected('Music') then RecodeOgg(ExpandConstant('{app}\data\global\music'), '*.ogg', 'Конвертация музыки выполнена на... ', True);
    end;
end;


Raf-9600 31-05-2012 16:55 1925623

El Sanchez, Вот теперь все работает как нужно, Благодарю

На ум пришло лишь два нюанса которыми его можно было бы дополнить:
1. Было бы очень круто, если бы прогресс-бар так же бы был в таскбаре (на ярлыке инсталлятора) если у пользователя Win7.
2. Так как в моем скрипте на странице инсталляциии отображается только строчка статуса, то хотелось бы чтобы проценты хода выполнения отображались тоже в строке статуса, после надписи. Т.е. чтобы можно было написать "Конвертация музыки выполнена на" и справа (не снизу) отображение процентов.

Это все конечно не критично, но хотелось бы иметь

El Sanchez 31-05-2012 18:24 1925647

Цитата:

Цитата Raf-9600
1. Было бы очень круто, если бы прогресс-бар так же бы был в таскбаре (на ярлыке инсталлятора) если у пользователя Win7. »

Raf-9600, такое возможно сделать только в юникодной версии Inno.
Цитата:

Цитата Raf-9600
2. Так как в моем скрипте на странице инсталляциии отображается только строчка статуса, то хотелось бы чтобы проценты хода выполнения отображались тоже в строке статуса, после надписи. Т.е. чтобы можно было написать "Конвертация музыки выполнена на" и справа (не снизу) отображение процентов. »

Raf-9600, изменил свой предыдущий код.

Raf-9600 31-05-2012 20:01 1925672

El Sanchez, ИМХО его можно было бы и в первый пост, под спойлер "Ссылки на примеры скриптов" закинуть. Так как уверен, что этот код многим пригодиться.

Edison007 31-05-2012 20:18 1925687

Цитата:

Цитата El Sanchez
такое возможно сделать только в юникодной версии Inno. »

Можно и на анси с использованием WinTB

Dark_Delphin 31-05-2012 20:24 1925690

Всем привет.

Подскажите как правильно прописать строку, чтобы файл устанавливался в Мои документы...
Вроде {commondocs} или по другому?

Заранее спасибо.

Raf-9600 31-05-2012 20:42 1925702

Цитата:

Цитата Edison007
Можно и на анси с использованием WinTB »

А вы можете это реализовать? Там только нужен прогресс-бар, без всяких кнопок и прочего.
Просто наличие прогресс-бара в таскбаре это единственное что отделяет код El Sanchez от совершенства

ToCamoe 31-05-2012 23:15 1925781

Покапался в хэлпе и не нашёл, что то, какой флаг отвечает за установленную галочку чекбокса, по умолчанию, но можно было снять?

Raf-9600 31-05-2012 23:49 1925802

ToCamoe,
Код:

Name: "Text"; Description: "Text";  Types: full

ToCamoe 31-05-2012 23:55 1925805

Цитата:

Цитата Raf-9600
ToCamoe,
Код:
Name: "Text"; Description: "Text"; Types: full »

мне для
Код:

Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
такого флага )

Johny777 01-06-2012 00:00 1925807

Цитата:

Цитата Dark_Delphin
чтобы файл устанавливался в Мои документы... »

{userdocs} - документы текущего пользователя (используй этот)
{commondocs} - общие документы
Цитата:

Цитата ToCamoe
какой флаг отвечает за установленную галочку чекбокса, по умолчанию »

для секции компонентов удали типы (например Types: full compact) у тех компонентов (дочерних) которые не должны быть отмечены
для секции задач используй флаг unchecked для неотмеченных по умолчанию
а можно через код (для компонентов)
так:
читать дальше »
Код:

[Setup]
AppName=Test Mouse Event
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=none
PrivilegesRequired=none
OutputDir=userdocs:Inno Setup Examples Output


[Components]

Name: a; Description: описание a

Name: b; Description: описание b

Name: c; Description: описание c



[  Code]
procedure InitializeWizard();
begin
  WizardForm.ComponentsList.Checked[2] := True; /// отсчёт от нуля // выбран компонет С (третий)
end;


Raf-9600 01-06-2012 00:01 1925808

ToCamoe, Может если убрать Flags: unchecked то галочка по умолчанию будет? По крайней мере у меня так.

GoshaPolo 01-06-2012 12:20 1925976

Ответьте на вопросик, может немножко не по теме, но я думаю ответ найдется :)

Мне нужно прописать ключ в реестр, который у меня записывается по такому пути - HKEY_USERS\S-1-5-21-4202093143-4282819894-987643330-1006\Software\
Так вот вопрос в том, на всех ли других компьютерах будет такая же папка S-1-5-21-4202093143-4282819894-987643330-1006 в реестре или это какое-то индивидуальное обозначение пользователя? Как тогда прописать в такую папку, если у каждой системы эта папка различна?

Johny777 01-06-2012 16:59 1926207

скажите пожалуйста

в этом нет ничего неправильного?

читать дальше »

Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
  ssPostInstall :
  begin

    case  TNewCheckBox(Sender) of       
      hl2_icon_Checkbox :
...
  end;
end;

в case идёт ещё один case

и в этом
Код:

procedure make (Sender: TObject);
begin
  case TNewCheckBox(Sender) of

      hl2_main_CheckBox :
      begin
 ...
  case TNewRadioButton(Sender) of
...
    case TNewButton(Sender) of
//// всё это в одной процедуре (кнопка, переключатели, чекбоксы)
end;


и вообще записывать через case правильнее (с точки зрения оптимизации)?
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
также открыл для себя .Free
у меня много текста и картинок в скроллбоксе на второй странице
при запуске процесс инсталла кушает 43 мб оперативы
во время установки 100
на шаге ssInstall освободил скроллбокс
*(скроллбокс.Free)
теперь во время установки чуть больше 50-ти :)

GoshaPolo,
Извини
реестр для меня тёмный лес с чудовищами

GoshaPolo 01-06-2012 19:50 1926274

На мой вопрос выше никто ответа не знает?

Raf-9600 01-06-2012 20:03 1926284

GoshaPolo, если не ошибаюсь, нужно писать Root: HKCU; и без S-1-5-21-4202093143-4282819894-987643330-1006

GoshaPolo 01-06-2012 20:41 1926311

Raf-9600, писал так, но при установке выдает ошибку, что не может прописать по такому пути :(

R.i.m.s.k.y. 01-06-2012 21:20 1926334

Поделитесь пожалуйста алгоритмом сравнения нужной версии файла 50.6 через GetVersionNumbers(FilePath, VersionMSFile, VersionLSFile);
Причем VersionMSFile деятичный, а VersionLSFile - шестандцатеричный (т.е. msgbox показывает 50 327680 соответственно)

Заранее спасибо!

Sanshalay 01-06-2012 22:32 1926390

Помогите пожалуйста убрать страницы "Меню пуск" и "Компоненты" правильно. Как не убираю, вылазит рантайм. Буду очень благодарен

Скрипт: http://clck.ru/d/zxAyJVzi19yFX

GoshaPolo 01-06-2012 23:26 1926440

Sanshalay, мне тут выше отвечали на такой же вопрос :)

Вот ответ:
читать дальше »
Код:

[Setup]

DisableSelectComponentsPage=yes
DisableSelectProgramGroupPage=yes


Sanshalay 01-06-2012 23:44 1926466

GoshaPolo, ошибка вылазит:
Unrecognized [Setup] section directive "DisableSelectComponentsPage"

Serega 01-06-2012 23:47 1926470

Цитата:

Цитата Johny777
в этом нет ничего неправильного? »

всё правильно
Цитата:

Цитата Johny777
и вообще записывать через case правильнее (с точки зрения оптимизации)? »

Вопрос поставлен не верно, писать через case... или через if..., это скорее всего привычка написания, ну или кому как легче читать код. Конечно это только можно отнести только если использовать только одну проверку т.е. if ... then ... else, если таких проверок более двух, то удобнее на мой взгляд через case...

Цитата:

Цитата GoshaPolo
На мой вопрос выше никто ответа не знает? »

HKCU\Software\...

Цитата:

Цитата R.i.m.s.k.y.
Поделитесь пожалуйста алгоритмом сравнения нужной версии файла 50.6 через GetVersionNumbers »

Пример

Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes

[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl

[Code]
function InitializeSetup(): Boolean;
var
  VersionMS, VersionLS: Cardinal;
begin
  if GetVersionNumbers(ExpandConstant('{sys}\shell32.dll'), VersionMS, VersionLS) then
    MsgBox(IntToStr(VersionMS shr 16) + '.' +
          IntToStr(VersionMS and $FFFF) + '.' +
          IntToStr(VersionLS shr 16) + '.' +
          IntToStr(VersionLS and $FFFF),
          mbInformation, MB_OK);
end;


Gnom_aka_Lexander 02-06-2012 00:00 1926479

Цитата:

Цитата Serega
это скорее всего привычка написания, ну или кому как легче читать код. »

Внесу свою лепту, так сказать :)
Через case удобно и оптимально проверять сранение двух переменных, когда:
1) одну определенную переменную нужно сравнить с несколькими другими, и в зависимости от того, какой из других она равна - совершить соответствующее действие
2) когда одну переменную нужно сравнить с несколькими другими и совершить в нескольких случаях одно и тоже действие.
В обоих этих случаях плюсы ощутимы - начиная от читаемости кода, заканчивая его оптимальностью. но в плане оптимальности, нужно помнить - case of работает до первого положительного ответа. как только получен ответ - да, выполнение структуры прерывается, и если это недопустимо, то тут без вариантов - if...then...else...

GoshaPolo 02-06-2012 00:16 1926488

Sanshalay, со страницей компонентов у меня тоже такой способ не прокатил :(

Вот такой вариант 100% получится. Пропиши эту функцию в секцию CODE
читать дальше »
Код:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if PageID = 7 then Result:= True;
if PageID = 8 then Result:= True;
end;



7 и 8 это ID страниц. Вот список всех страниц:
читать дальше »
Код:

wpWelcome = 1;
wpLicense = 2;
wpPassword = 3;
wpInfoBefore = 4;
wpUserInfo = 5;
wpSelectDir = 6;
wpSelectComponents = 7;
wpSelectProgramGroup = 8;
wpSelectTasks = 9;
wpReady = 10;
wpPreparing = 11;
wpInstalling = 12;
wpInfoAfter = 13;
wpFinished = 14;



Serega, в том то и дело, что там не CURRENT USER, а в простой USERS надо записать. Если HKU\SOFTWARE прописывать, то выдает ошибку при установке, что записать такую строку не может в реестр. Или разницы нету между CURRENT USER и этой строкой в USERS? Но почему тогда они разделены на разные разделы?

Serega 02-06-2012 00:36 1926494

Цитата:

Цитата GoshaPolo
Если HKU\SOFTWARE прописывать, то выдает ошибку при установке »

Вы пишите в HKCU\Software, т.к. именно он является реестром текущего пользователя, а в HKU\текущий пользователь\Software он будет продублирован автоматом самой системой.

Johny777 02-06-2012 00:55 1926500

Serega, Gnom_aka_Lexander,
спасибо!
понял, запомнил

Sanshalay,
страница выбора компонетов появляется, если у тебя есть секция компонентов

вот тебе пример пропуска страниц через код (айди страниц выше )
читать дальше »
Код:

[Setup]
AppName=Test Mouse Event
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: a; Description: описание a
Name: b; Description: описание b
Name: c; Description: описание cGoshaPolo,

[  Code]
function  ShouldSkipPage(PageID: Integer): Boolean; 
begin
  case
    PageID of
      wpSelectComponents: Result := True;
      wpSelectDir: Result := True;
      wpWelcome: Result := True;
      wpReady: Result := True;
  end;
end;


скрываем все станицы в этом примере, но появится страница готовности. Её не скроешь

другой вариант как сказал GoshaPolo через секцию [Setup] (читай справку)
•DisableDirPage
•DisableFinishedPage
•DisableProgramGroupPage
•DisableReadyMemo
•DisableReadyPage
•DisableStartupPrompt
•DisableWelcomePage

R.i.m.s.k.y. 02-06-2012 08:10 1926536

Serega, спасибо, но меня интересовал не MSGBox а алгоритм сравнения числа 50.6 с VersionMS и VersionLS
Т.е. в пакете версия 50.6, getVersionNumber возвращает VersionMS=50 и VersionLS=327680
Как узнать что версия в пакете новее?

Gnom_aka_Lexander 02-06-2012 10:10 1926578

R.i.m.s.k.y., если я правильно понял, то так:

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*code]
function InitializeSetup(): Boolean;
var
  VersionMS, VersionLS: Cardinal;
  Float : Extended;
  s : string;
begin
  Float := 6.7601;
  if GetVersionNumbers(ExpandConstant('{sys}\shell32.dll'), VersionMS, VersionLS) then
  begin
    if StrToFloat(IntToStr(VersionMS shr 16) + '.' + IntToStr(VersionLS shr 16)) = Float then
      s := 'Версии равны'
    else
      s := 'Версии неравны';
  end else s := 'Не удалось определить версию';
    Result := MsgBox(s, mbInformation, MB_OK) = IDOK;
end;

Обрати внимание на переменную Float и ее тип.
Цитата:

Цитата Johny777
понял, запомнил »

товй-же код, но с учетом удобства case of:

читать дальше »
Код:

function  ShouldSkipPage(PageID: Integer): Boolean; 
begin
  case PageID of
      wpSelectComponents, wpSelectDir, wpWelcome, wpReady: Result := True;
  end;
end;


R.i.m.s.k.y. 02-06-2012 10:20 1926580

Gnom_aka_Lexander, немного не то
мне нужно условие больше или равно, а в примере просто равно

Gnom_aka_Lexander 02-06-2012 10:22 1926581

:unsure: R.i.m.s.k.y., ну, дык :)
Код:

if StrToFloat(IntToStr(VersionMS shr 16) + '.' + IntToStr(VersionLS shr 16)) >= Float then
StrToFloat возвращает значение типа Extended и его можно любым образом сравнить с другим значением типа Extended каковым и является твое 50.6
могу только догадаться, что shr 16 приводит к десятичному значению, буду благодарен, если мне кто-нибудь объяснит работу этих приведений :modesty:

Sanshalay 02-06-2012 19:46 1926851

GoshaPolo, Johny777, ок. А как скрыть страницу Дополнительные задачи? wpSelectTasks = 9; Ее штатными методами скрыть не получается. А через код я не понимаю что убирать. Поможете?
Скрипт: http://clck.ru/d/zxAyJVzi19yFX

Gnom_aka_Lexander 02-06-2012 19:55 1926856

Sanshalay, тебе нужно убрать родную страницу задач, или SelectTasksPage, которая создается в коде?
Если родную - то так:
Код:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := PageID = wpSelectTasks;
end;

Если ту, которую создаешь, то так:
Код:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := PageID = SelectTasksPage.ID;
end;


Sanshalay 02-06-2012 20:21 1926867

Gnom_aka_Lexander, теперь код вот такой:

Код:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if (PageID =wpSelectProgramGroup) then  Result:= True;
  Result := PageID = SelectTasksPage.ID;
end;

Задачи успешно скрылись. Но появилась страница wpSelectProgramGroup. блин. если бы код был мой я бы некогда так не делал (Не ставил эти страницы). А код не мой и поэтому приходится удалять их непонятно как. (Потому что я не понимаю, что надо в коде удалять)

Serega 02-06-2012 20:26 1926869

Цитата:

Цитата R.i.m.s.k.y.
но меня интересовал не MSGBox а алгоритм сравнения числа 50.6 с VersionMS и VersionLS »

Я просто показал пример работы и подумал, что сравнить труда не составит... вот вам функция:
читать дальше »

Код:

function CompareVersion(const FileName1, FileName2: string): Integer;
{ Данная функция сравнивает версии файлов указанных в FileName1 и FileName2.
  Возвращаемые значения:
    -2: если не смогли прочитать версию любого из файлов;
    -1: FileName1 > FileName2;
    0: FileName1 = FileName2;
    1: FileName1 < FileName2; }
var
  VerMS1, VerLS1, VerMS2, VerLS2: Cardinal;
  fMS1, fLS1, fMS2, fLS2: Extended;
begin
  Result := -2;
  if GetVersionNumbers(FileName1, VerMS1, VerLS1) and
    GetVersionNumbers(FileName2, VerMS2, VerLS2) then
    begin
      fMS1 := StrToFloat(IntToStr(VerMS1 shr 16) + '.' + IntToStr(VerMS1 and $FFFF));
      fLS1 := StrToFloat(IntToStr(VerLS1 shr 16) + '.' + IntToStr(VerLS1 and $FFFF));
      fMS2 := StrToFloat(IntToStr(VerMS2 shr 16) + '.' + IntToStr(VerMS2 and $FFFF));
      fLS2 := StrToFloat(IntToStr(VerLS2 shr 16) + '.' + IntToStr(VerLS2 and $FFFF));
      case fMS1 = fMS2 of
        True:
          case fLS1 = fLS2 of
            True : Result := 0;
            False:
              case fLS1 > fLS2 of
                True : Result := -1;
                False: Result := 1;
              end;
          end;
        False:
          case fMS1 > fMS2 of
            True : Result := -1;
            False: Result := 1;
          end;
      end;
    end;
end;


Gnom_aka_Lexander 02-06-2012 20:51 1926883

Sanshalay, тогда так будет более правильно:
Код:

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpSelectProgramGroup, SelectTasksPage.ID : // тут через запятую можно добавлять ID страниц, которые нужно скрыть
      Result:= True;
  end;
end;


Sanshalay 02-06-2012 20:56 1926887

Gnom_aka_Lexander, спасибо огромное!

Sanshalay 02-06-2012 22:49 1926940

Есть очень большой текст, который не влезает в строчку редактора кода Inno. Как перенести текст на следующую строчку?

R.i.m.s.k.y. 02-06-2012 22:54 1926943

Sanshalay, по операторам
к примеру
Код:

if (д л и н н о е  у с л о в и е)
then begin
...
д л и н н о е  в ы р а ж е н и е +
д р у г о е  д л и н н о е  в ы р а ж е н и е

НО
если это секция реестра в которой может одна строчка весить несколько килобайт, к примеру FilterData, то в таком случае нужно выносить в файл и импортировать его через reg import
К примеру вот такое

файл reg.reg
Код:

REGEDIT4

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{083863F1-70DE-11D0-BD40-00A0C911CE86}\Instance\{04FE9017-F873-410E-871E-AB91661A4EF7}]
"FriendlyName"="ffdshow Video Decoder"
"CLSID"="{04FE9017-F873-410E-871E-AB91661A4EF7}"
"FilterData"=hex:02,00,00,00,01,00,80,ff,03,00,00,00,00,00,00,00,30,70,69,33,\
  00,00,00,00,00,00,00,00,6f,00,00,00,00,00,00,00,00,00,00,00,30,74,79,33,00,\
  00,00,00,98,07,00,00,a8,07,00,00,31,74,79,33,00,00,00,00,b8,07,00,00,a8,07,\
  00,00,32,74,79,33,00,00,00,00,b8,07,00,00,c8,07,00,00,33,74,79,33,00,00,00,\
  00,b8,07,00,00,d8,07,00,00,34,74,79,33,00,00,00,00,b8,07,00,00,e8,07,00,00,\
  35,74,79,33,00,00,00,00,98,07,00,00,f8,07,00,00,36,74,79,33,00,00,00,00,98,\
  07,00,00,08,08,00,00,37,74,79,33,00,00,00,00,98,07,00,00,18,08,00,00,38,74,\
  79,33,00,00,00,00,98,07,00,00,28,08,00,00,39,74,79,33,00,00,00,00,98,07,00,\
  00,38,08,00,00,3a,74,79,33,00,00,00,00,98,07,00,00,48,08,00,00,3b,74,79,33,\
  00,00,00,00,98,07,00,00,58,08,00,00,3c,74,79,33,00,00,00,00,98,07,00,00,68,\
  08,00,00,3d,74,79,33,00,00,00,00,98,07,00,00,d8,07,00,00,3e,74,79,33,00,00,\
  00,00,98,07,00,00,78,08,00,00,3f,74,79,33,00,00,00,00,98,07,00,00,88,08,00,\
  00,40,74,79,33,00,00,00,00,98,07,00,00,98,08,00,00,41,74,79,33,00,00,00,00,\
  98,07,00,00,a8,08,00,00,42,74,79,33,00,00,00,00,98,07,00,00,b8,08,00,00,43,\
  74,79,33,00,00,00,00,98,07,00,00,c8,08,00,00,44,74,79,33,00,00,00,00,98,07,\
  00,00,d8,08,00,00,45,74,79,33,00,00,00,00,98,07,00,00,e8,08,00,00,46,74,79,\
  33,00,00,00,00,98,07,00,00,f8,08,00,00,47,74,79,33,00,00,00,00,98,07,00,00,\
  08,09,00,00,48,74,79,33,00,00,00,00,98,07,00,00,18,09,00,00,49,74,79,33,00,\
  00,00,00,98,07,00,00,28,09,00,00,4a,74,79,33,00,00,00,00,98,07,00,00,38,09,\
  00,00,4b,74,79,33,00,00,00,00,98,07,00,00,48,09,00,00,4c,74,79,33,00,00,00,\
  00,98,07,00,00,58,09,00,00,4d,74,79,33,00,00,00,00,98,07,00,00,68,09,00,00,\
  4e,74,79,33,00,00,00,00,98,07,00,00,78,09,00,00,4f,74,79,33,00,00,00,00,98,\
  07,00,00,88,09,00,00,50,74,79,33,00,00,00,00,98,07,00,00,98,09,00,00,51,74,\
  79,33,00,00,00,00,98,07,00,00,a8,09,00,00,52,74,79,33,00,00,00,00,98,07,00,\
  00,b8,09,00,00,53,74,79,33,00,00,00,00,98,07,00,00,c8,09,00,00,54,74,79,33,\
  00,00,00,00,98,07,00,00,d8,09,00,00,55,74,79,33,00,00,00,00,98,07,00,00,e8,\
  09,00,00,56,74,79,33,00,00,00,00,98,07,00,00,e8,07,00,00,57,74,79,33,00,00,\
  00,00,98,07,00,00,f8,09,00,00,58,74,79,33,00,00,00,00,98,07,00,00,08,0a,00,\
  00,59,74,79,33,00,00,00,00,98,07,00,00,18,0a,00,00,5a,74,79,33,00,00,00,00,\
  98,07,00,00,28,0a,00,00,5b,74,79,33,00,00,00,00,98,07,00,00,38,0a,00,00,5c,\
  74,79,33,00,00,00,00,98,07,00,00,48,0a,00,00,5d,74,79,33,00,00,00,00,98,07,\
  00,00,58,0a,00,00,5e,74,79,33,00,00,00,00,98,07,00,00,68,0a,00,00,5f,74,79,\
  33,00,00,00,00,98,07,00,00,78,0a,00,00,60,74,79,33,00,00,00,00,98,07,00,00,\
  88,0a,00,00,61,74,79,33,00,00,00,00,98,07,00,00,98,0a,00,00,62,74,79,33,00,\
  00,00,00,98,07,00,00,a8,0a,00,00,63,74,79,33,00,00,00,00,98,07,00,00,b8,0a,\
  00,00,64,74,79,33,00,00,00,00,98,07,00,00,c8,0a,00,00,65,74,79,33,00,00,00,\
  00,98,07,00,00,d8,0a,00,00,66,74,79,33,00,00,00,00,98,07,00,00,e8,0a,00,00,\
  67,74,79,33,00,00,00,00,98,07,00,00,f8,0a,00,00,68,74,79,33,00,00,00,00,98,\
  07,00,00,08,0b,00,00,69,74,79,33,00,00,00,00,98,07,00,00,18,0b,00,00,6a,74,\
  79,33,00,00,00,00,98,07,00,00,28,0b,00,00,6b,74,79,33,00,00,00,00,98,07,00,\
  00,38,0b,00,00,6c,74,79,33,00,00,00,00,98,07,00,00,c8,07,00,00,6d,74,79,33,\
  00,00,00,00,98,07,00,00,48,0b,00,00,6e,74,79,33,00,00,00,00,98,07,00,00,58,\
  0b,00,00,6f,74,79,33,00,00,00,00,98,07,00,00,68,0b,00,00,70,74,79,33,00,00,\
  00,00,98,07,00,00,78,0b,00,00,71,74,79,33,00,00,00,00,98,07,00,00,88,0b,00,\
  00,72,74,79,33,00,00,00,00,98,07,00,00,98,0b,00,00,73,74,79,33,00,00,00,00,\
  98,07,00,00,a8,0b,00,00,74,74,79,33,00,00,00,00,98,07,00,00,b8,0b,00,00,75,\
  74,79,33,00,00,00,00,98,07,00,00,c8,0b,00,00,76,74,79,33,00,00,00,00,98,07,\
  00,00,d8,0b,00,00,77,74,79,33,00,00,00,00,98,07,00,00,e8,0b,00,00,78,74,79,\
  33,00,00,00,00,98,07,00,00,f8,0b,00,00,79,74,79,33,00,00,00,00,98,07,00,00,\
  08,0c,00,00,7a,74,79,33,00,00,00,00,98,07,00,00,18,0c,00,00,7b,74,79,33,00,\
  00,00,00,98,07,00,00,28,0c,00,00,7c,74,79,33,00,00,00,00,98,07,00,00,38,0c,\
  00,00,7d,74,79,33,00,00,00,00,98,07,00,00,48,0c,00,00,7e,74,79,33,00,00,00,\
  00,98,07,00,00,58,0c,00,00,7f,74,79,33,00,00,00,00,98,07,00,00,68,0c,00,00,\
  80,74,79,33,00,00,00,00,98,07,00,00,78,0c,00,00,81,74,79,33,00,00,00,00,98,\
  07,00,00,88,0c,00,00,82,74,79,33,00,00,00,00,98,07,00,00,98,0c,00,00,83,74,\
  79,33,00,00,00,00,98,07,00,00,a8,0c,00,00,84,74,79,33,00,00,00,00,98,07,00,\
  00,b8,0c,00,00,85,74,79,33,00,00,00,00,98,07,00,00,c8,0c,00,00,86,74,79,33,\
  00,00,00,00,98,07,00,00,d8,0c,00,00,87,74,79,33,00,00,00,00,98,07,00,00,e8,\
  0c,00,00,88,74,79,33,00,00,00,00,98,07,00,00,f8,0c,00,00,89,74,79,33,00,00,\
  00,00,98,07,00,00,08,0d,00,00,8a,74,79,33,00,00,00,00,98,07,00,00,18,0d,00,\
  00,8b,74,79,33,00,00,00,00,98,07,00,00,28,0d,00,00,8c,74,79,33,00,00,00,00,\
  98,07,00,00,38,0d,00,00,8d,74,79,33,00,00,00,00,98,07,00,00,48,0d,00,00,8e,\
  74,79,33,00,00,00,00,98,07,00,00,58,0d,00,00,8f,74,79,33,00,00,00,00,98,07,\
  00,00,68,0d,00,00,90,74,79,33,00,00,00,00,98,07,00,00,78,0d,00,00,91,74,79,\
  33,00,00,00,00,98,07,00,00,88,0d,00,00,92,74,79,33,00,00,00,00,98,07,00,00,\
  98,0d,00,00,93,74,79,33,00,00,00,00,98,07,00,00,a8,0d,00,00,94,74,79,33,00,\
  00,00,00,98,07,00,00,b8,0d,00,00,95,74,79,33,00,00,00,00,98,07,00,00,c8,0d,\
  00,00,96,74,79,33,00,00,00,00,98,07,00,00,d8,0d,00,00,97,74,79,33,00,00,00,\
  00,98,07,00,00,e8,0d,00,00,98,74,79,33,00,00,00,00,98,07,00,00,f8,0d,00,00,\
  99,74,79,33,00,00,00,00,98,07,00,00,08,0e,00,00,9a,74,79,33,00,00,00,00,98,\
  07,00,00,18,0e,00,00,9b,74,79,33,00,00,00,00,98,07,00,00,28,0e,00,00,9c,74,\
  79,33,00,00,00,00,98,07,00,00,38,0e,00,00,9d,74,79,33,00,00,00,00,98,07,00,\
  00,48,0e,00,00,9e,74,79,33,00,00,00,00,98,07,00,00,58,0e,00,00,31,70,69,33,\
  08,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,30,74,79,33,00,\
  00,00,00,98,07,00,00,a8,07,00,00,32,70,69,33,00,00,00,00,00,00,00,00,04,00,\
  00,00,00,00,00,00,00,00,00,00,30,74,79,33,00,00,00,00,68,0e,00,00,a8,07,00,\
  00,31,74,79,33,00,00,00,00,78,0e,00,00,a8,07,00,00,32,74,79,33,00,00,00,00,\
  78,0e,00,00,88,0e,00,00,33,74,79,33,00,00,00,00,98,07,00,00,98,0e,00,00,76,\
  69,64,73,00,00,10,00,80,00,00,aa,00,38,9b,71,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,6a,91,0b,ed,4d,04,d1,11,aa,78,00,c0,4f,c3,1d,60,26,80,6d,\
  e0,46,db,cf,11,b4,d1,00,80,5f,6c,bb,ea,41,56,43,31,00,00,10,00,80,00,00,aa,\
  00,38,9b,71,57,56,43,31,00,00,10,00,80,00,00,aa,00,38,9b,71,58,56,49,44,00,\
  00,10,00,80,00,00,aa,00,38,9b,71,78,76,69,64,00,00,10,00,80,00,00,aa,00,38,\
  9b,71,44,49,56,58,00,00,10,00,80,00,00,aa,00,38,9b,71,64,69,76,78,00,00,10,\
  00,80,00,00,aa,00,38,9b,71,44,58,35,30,00,00,10,00,80,00,00,aa,00,38,9b,71,\
  64,78,35,30,00,00,10,00,80,00,00,aa,00,38,9b,71,48,32,36,34,00,00,10,00,80,\
  00,00,aa,00,38,9b,71,68,32,36,34,00,00,10,00,80,00,00,aa,00,38,9b,71,61,76,\
  63,31,00,00,10,00,80,00,00,aa,00,38,9b,71,43,43,56,31,00,00,10,00,80,00,00,\
  aa,00,38,9b,71,48,32,36,33,00,00,10,00,80,00,00,aa,00,38,9b,71,68,32,36,33,\
  00,00,10,00,80,00,00,aa,00,38,9b,71,44,49,56,33,00,00,10,00,80,00,00,aa,00,\
  38,9b,71,64,69,76,33,00,00,10,00,80,00,00,aa,00,38,9b,71,4d,50,34,33,00,00,\
  10,00,80,00,00,aa,00,38,9b,71,6d,70,34,33,00,00,10,00,80,00,00,aa,00,38,9b,\
  71,4d,50,34,32,00,00,10,00,80,00,00,aa,00,38,9b,71,6d,70,34,32,00,00,10,00,\
  80,00,00,aa,00,38,9b,71,4d,50,34,31,00,00,10,00,80,00,00,aa,00,38,9b,71,6d,\
  70,34,31,00,00,10,00,80,00,00,aa,00,38,9b,71,4d,50,34,56,00,00,10,00,80,00,\
  00,aa,00,38,9b,71,6d,70,34,76,00,00,10,00,80,00,00,aa,00,38,9b,71,4d,50,34,\
  53,00,00,10,00,80,00,00,aa,00,38,9b,71,6d,70,34,73,00,00,10,00,80,00,00,aa,\
  00,38,9b,71,53,45,44,47,00,00,10,00,80,00,00,aa,00,38,9b,71,73,65,64,67,00,\
  00,10,00,80,00,00,aa,00,38,9b,71,57,4d,56,31,00,00,10,00,80,00,00,aa,00,38,\
  9b,71,77,6d,76,31,00,00,10,00,80,00,00,aa,00,38,9b,71,57,4d,56,32,00,00,10,\
  00,80,00,00,aa,00,38,9b,71,77,6d,76,32,00,00,10,00,80,00,00,aa,00,38,9b,71,\
  57,4d,56,33,00,00,10,00,80,00,00,aa,00,38,9b,71,77,6d,76,33,00,00,10,00,80,\
  00,00,aa,00,38,9b,71,77,76,63,31,00,00,10,00,80,00,00,aa,00,38,9b,71,56,50,\
  35,30,00,00,10,00,80,00,00,aa,00,38,9b,71,76,70,35,30,00,00,10,00,80,00,00,\
  aa,00,38,9b,71,56,50,36,30,00,00,10,00,80,00,00,aa,00,38,9b,71,76,70,36,30,\
  00,00,10,00,80,00,00,aa,00,38,9b,71,56,50,36,31,00,00,10,00,80,00,00,aa,00,\
  38,9b,71,76,70,36,31,00,00,10,00,80,00,00,aa,00,38,9b,71,56,50,36,32,00,00,\
  10,00,80,00,00,aa,00,38,9b,71,76,70,36,32,00,00,10,00,80,00,00,aa,00,38,9b,\
  71,56,50,36,46,00,00,10,00,80,00,00,aa,00,38,9b,71,76,70,36,66,00,00,10,00,\
  80,00,00,aa,00,38,9b,71,46,4c,56,34,00,00,10,00,80,00,00,aa,00,38,9b,71,66,\
  6c,76,34,00,00,10,00,80,00,00,aa,00,38,9b,71,48,46,59,55,00,00,10,00,80,00,\
  00,aa,00,38,9b,71,68,66,79,75,00,00,10,00,80,00,00,aa,00,38,9b,71,33,49,56,\
  32,00,00,10,00,80,00,00,aa,00,38,9b,71,33,69,76,32,00,00,10,00,80,00,00,aa,\
  00,38,9b,71,33,49,56,58,00,00,10,00,80,00,00,aa,00,38,9b,71,33,69,76,78,00,\
  00,10,00,80,00,00,aa,00,38,9b,71,80,eb,36,e4,4f,52,ce,11,9f,53,00,20,af,0b,\
  a7,70,81,eb,36,e4,4f,52,ce,11,9f,53,00,20,af,0b,a7,70,4d,50,47,32,00,00,10,\
  00,80,00,00,aa,00,38,9b,71,6d,70,67,32,00,00,10,00,80,00,00,aa,00,38,9b,71,\
  45,4d,32,56,00,00,10,00,80,00,00,aa,00,38,9b,71,65,6d,32,76,00,00,10,00,80,\
  00,00,aa,00,38,9b,71,4d,4d,45,53,00,00,10,00,80,00,00,aa,00,38,9b,71,6d,6d,\
  65,73,00,00,10,00,80,00,00,aa,00,38,9b,71,56,50,33,31,00,00,10,00,80,00,00,\
  aa,00,38,9b,71,76,70,33,31,00,00,10,00,80,00,00,aa,00,38,9b,71,54,53,43,43,\
  00,00,10,00,80,00,00,aa,00,38,9b,71,74,73,63,63,00,00,10,00,80,00,00,aa,00,\
  38,9b,71,43,52,41,4d,00,00,10,00,80,00,00,aa,00,38,9b,71,63,72,61,6d,00,00,\
  10,00,80,00,00,aa,00,38,9b,71,41,56,52,4e,00,00,10,00,80,00,00,aa,00,38,9b,\
  71,61,76,72,6e,00,00,10,00,80,00,00,aa,00,38,9b,71,46,50,53,31,00,00,10,00,\
  80,00,00,aa,00,38,9b,71,66,70,73,31,00,00,10,00,80,00,00,aa,00,38,9b,71,57,\
  4d,56,50,00,00,10,00,80,00,00,aa,00,38,9b,71,77,6d,76,70,00,00,10,00,80,00,\
  00,aa,00,38,9b,71,57,56,50,32,00,00,10,00,80,00,00,aa,00,38,9b,71,77,76,70,\
  32,00,00,10,00,80,00,00,aa,00,38,9b,71,4d,4a,50,47,00,00,10,00,80,00,00,aa,\
  00,38,9b,71,6d,6a,70,67,00,00,10,00,80,00,00,aa,00,38,9b,71,4d,4a,50,41,00,\
  00,10,00,80,00,00,aa,00,38,9b,71,6d,6a,70,61,00,00,10,00,80,00,00,aa,00,38,\
  9b,71,41,4d,56,56,00,00,10,00,80,00,00,aa,00,38,9b,71,53,50,35,58,00,00,10,\
  00,80,00,00,aa,00,38,9b,71,44,56,53,44,00,00,10,00,80,00,00,aa,00,38,9b,71,\
  64,76,73,64,00,00,10,00,80,00,00,aa,00,38,9b,71,44,56,32,35,00,00,10,00,80,\
  00,00,aa,00,38,9b,71,64,76,32,35,00,00,10,00,80,00,00,aa,00,38,9b,71,44,56,\
  35,30,00,00,10,00,80,00,00,aa,00,38,9b,71,64,76,35,30,00,00,10,00,80,00,00,\
  aa,00,38,9b,71,43,44,56,43,00,00,10,00,80,00,00,aa,00,38,9b,71,63,64,76,63,\
  00,00,10,00,80,00,00,aa,00,38,9b,71,43,44,56,35,00,00,10,00,80,00,00,aa,00,\
  38,9b,71,63,64,76,35,00,00,10,00,80,00,00,aa,00,38,9b,71,44,56,49,53,00,00,\
  10,00,80,00,00,aa,00,38,9b,71,64,76,69,73,00,00,10,00,80,00,00,aa,00,38,9b,\
  71,50,44,56,43,00,00,10,00,80,00,00,aa,00,38,9b,71,70,64,76,63,00,00,10,00,\
  80,00,00,aa,00,38,9b,71,59,56,31,32,00,00,10,00,80,00,00,aa,00,38,9b,71,49,\
  59,55,56,00,00,10,00,80,00,00,aa,00,38,9b,71,59,55,59,32,00,00,10,00,80,00,\
  00,aa,00,38,9b,71,59,55,59,56,00,00,10,00,80,00,00,aa,00,38,9b,71,55,59,56,\
  59,00,00,10,00,80,00,00,aa,00,38,9b,71,56,59,55,59,00,00,10,00,80,00,00,aa,\
  00,38,9b,71,7e,eb,36,e4,4f,52,ce,11,9f,53,00,20,af,0b,a7,70,7d,eb,36,e4,4f,\
  52,ce,11,9f,53,00,20,af,0b,a7,70,7c,eb,36,e4,4f,52,ce,11,9f,53,00,20,af,0b,\
  a7,70,7b,eb,36,e4,4f,52,ce,11,9f,53,00,20,af,0b,a7,70,74,78,74,73,00,00,10,\
  00,80,00,00,aa,00,38,9b,71,08,eb,87,e4,26,6b,e9,4b,9d,d3,99,34,34,d3,13,fd,\
  3e,a5,eb,04,30,93,6c,43,91,33,55,3e,c8,70,31,dc,2d,80,6d,e0,46,db,cf,11,b4,\
  d1,00,80,5f,6c,bb,ea

импортирование
Код:

reg := ExpandConstant('{tmp}\\') + 'reg.reg';
Exec(RegEdit, ' import ' + ' ' + Add_Quotes(reg),ExpandConstant('{tmp}'),SW_HIDE, ewWaitUntilTerminated, res);


Sanshalay 02-06-2012 23:06 1926952

R.i.m.s.k.y., привет. Я в [CustomMessages] прописываю rus.License= и дальше пошел текст лицензии. А так как у меня Лицензия в TLabel, то она с файла не берется. (Хоть и указан LicenseFile=Project1.rtf в секции [Setup]) С плюсом не получается

R.i.m.s.k.y. 02-06-2012 23:15 1926958

Sanshalay, так бы сказал что нужно разрыв строки
в коде #13#10: 'первая строка' + #13#10 + 'вторая строка'
в CustomMessages %n: первая строка%nвторая строка

А вот автоперенос сам инно должен делать

Sanshalay 02-06-2012 23:34 1926964

Вот как раз мне автоперенос и нужен. А Inno его не делает почему то (Inno Setup Ultra)

Или по другому. Как загрузить содержимое rtm файла в TLabel

LinkOFF 03-06-2012 00:03 1926974

Здравствуйте. Как сделать так чтоб инсталлятор запретил доступ к интернету приложению? Заранее спасибо.

Sanshalay 03-06-2012 18:53 1927353

Помогите убрать ISDone и поставить нормальную распаковку файлов
Скрипт .iss http://clck.ru/d/rOWYxgAt1A8g8

решено

habib2302 03-06-2012 21:10 1927427

как сделать так чтобы во время удаления wizardsmallimage загружалась не из папки с прогой а из папки temp
я пытался сделать так

[Files]
Source: WiazrdSmallImage.bmp; DestDir: {tmp}; Flags: ignoreversion

[code]
procedure InitializeUninstallProgressForm();
begin
FileCopy(ExpandConstant('{tmp}\WiazrdSmallImage.bmp'), ExpandConstant('{tmp}\WiazrdSmallImage.bmp'), False);
with UninstallProgressForm.WizardSmallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}\WiazrdSmallImage.bmp'));
end;
end;

но мне выдает ошибку

я зашел в папку (путь на скрине с ошибкой)

а там изображения нету

Sanshalay 03-06-2012 23:06 1927509

Хочу что бы после установки запускались файлы по порядку (один запустился, закрылся, следующий запустился и так далее). Сделал вот так вот:
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
ErrorCode: Integer;
begin
if CurStep = ssInstall then
begin
StatusLabel.Caption:= ExpandConstant ('{cm:StatusLabel_Extracting}');
end;
if CurStep = ssPostInstall then
begin
StatusLabel.Caption:= ExpandConstant ('{cm:StatusLabel_Jerseys}');
ShellExec('', ExpandConstant('{app}\Jerseys.bat'),'', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
StatusLabel.Caption:= ExpandConstant ('{cm:StatusLabel_Arenas}');
ShellExec('', ExpandConstant('{app}\Boards.bat'),'', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
StatusLabel.Caption:= ExpandConstant ('{cm:StatusLabel_Ice}');
ShellExec('', ExpandConstant('{app}\Ice.bat'),'', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
end;
end;

Но ничего не запускается. Кто может помочь?

YURSHAT 04-06-2012 01:35 1927559

habib2302, при деинициализации инсталлятора временная папка уничтожается всместе со всем содержимым.

ЗЫ. И как вы себе это предствляете? :) Устанавливаете игру сегодня, к примеру, а удаляете через 2 месяца. И все эти два месяца в темпе будеть висеть временная папка :)

GoshaPolo 04-06-2012 13:16 1927747

Цитата:

Цитата Serega
Вы пишите в HKCU\Software, т.к. именно он является реестром текущего пользователя, а в HKU\текущий пользователь\Software он будет продублирован автоматом самой системой. »

Сейчас проверил и ничего не продублировалось. В HKCU ключ создается, но в HKU ничего не дублируется и соответственно приложение работает некорректно. Как добиться желаемого результата?

R.i.m.s.k.y. 04-06-2012 14:46 1927809

Подскажите, пожалуйста, чего надо в скрипт прописать чтобы в окне UAC не было слова unknown



Код:

AppName={#AppName}
AppVersion={#SVPVer}{#SVPVerLower}
AppPublisher={#SVPDefDir}
AppPublisherURL=http://www.SVP-Team.com
AppSupportURL=http://www.SVP-Team.com
AppUpdatesURL=http://www.SVP-Team.com
VersionInfoVersion={#SVPRev}
VersionInfoCompany={#AppName}
VersionInfoDescription={#AppName} {#SVPVer}{#SVPVerLower}
VersionInfoTextVersion={#SVPVer}{#SVPVerLower}

Переменные все естественно объявлены

Dark_Delphin 04-06-2012 19:27 1927997

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

alert30 04-06-2012 20:04 1928026

R.i.m.s.k.y., вот эти строчки по-моему надо разобрать:
Код:

AppPublisher={#SVPDefDir}
AppPublisherURL=http://www.SVP-Team.com


R.i.m.s.k.y. 04-06-2012 20:45 1928053

alert30, не-не-не, все нормально, сайт на месте, # define SVPDefDir "SVP" тоже прописано

R.i.m.s.k.y. 04-06-2012 21:12 1928070

alert30, ну а зачем пасту удалил
Цитата:

*R.i.m.s.k.y.*, вот что нашел, давненький ответ:


-----Цитата:-----
If you are using InnoSetup 5.2 or later, there is a signtool parameter you can add to your script.
Here's an excerpt from the InnoSetup documentation:

[Setup]: SignTool Valid values: A name followed by zero or more parameters, space separated

Description: Specifies the name and parameters of the Sign Tool to be used to digitally sign Setup (and Uninstall if SignedUninstaller is set to yes). When Setup has a valid digital signature, users will not see an "unidentified program" warning when launching it.

The specified Sign Tool name and its command have to be defined in the compiler IDE (via the Tools | Configure Sign Tools... menu) or on the compiler command line (via the "/S" parameter), else an error will occur.

The following special sequences may be used in Sign Tool parameters and commands:

$f, replaced by the quoted file name of the file to be signed.

$p, replaced by the Sign Tool parameters.

$q, replaced by a quote, usefull for defining a Sign Tool which contains quotes from the command line.
-----конец цитаты-----
Вопрос не по инно но все же: это оно?
где его можно скачать отдельно и какие параметры ему рисовать?

alert30 04-06-2012 21:44 1928105

R.i.m.s.k.y., боюсь, будешь спрашивать "причем тут это, а не Inno?" :(

SignTool, да это оно. Скачать этот чудный инструмент, цитирую:
Цитата:

This tool is automatically installed with Visual Studio and with the Windows SDK.
А насчет параметров, используется вместо долларов на делением "/" (или наоборот, не знаю).

R.i.m.s.k.y. 04-06-2012 21:48 1928108

alert30, значит оно
у меня канал всего 256к, я не могу позволить себе веб-инсталлеры
aep arse я даже картинки в нете отключаю!
Хотя бы поделитесь, пожалуйста, камрады, рабочим примером интеграции SignTool в Inno чтобы мне день сэкономить на экспериментах
Мурзилку по этой утилите я прочитал, в инно в меню Инструменты - инструменты подписания пошуровал, но все же

alert30 04-06-2012 22:06 1928122

R.i.m.s.k.y.
Цитата:

Цитата R.i.m.s.k.y.
у меня канал всего 256к, я не могу позволить себе веб-инсталлеры »

Будет время скоростью на 8 Мбит/с - скачай с ключом.
Цитата:

Цитата R.i.m.s.k.y.
Хотя бы поделитесь, пожалуйста, камрады, рабочим примером интеграции SignTool в Inno чтобы мне день сэкономить на экспериментах
Мурзилку по этой утилите я прочитал, в инно в меню Инструменты - инструменты подписания пошуровал, но все же »

Вот это я не понял, Вы это шуровали или выполнили?
Если эта ссылка не работает, то Вот цитата:
читать дальше »
Цитата:

As I discussed a couple of years ago, code signing your executables is important for a variety of reasons. Our installation creation tool of choice is Inno Setup and version 5.2.4 released in March 2009 made it easier to sign the setup executable through the new Signtool directive in the [Setup] section.

This directive works like this (assuming you already have a digital certificate):
Run the Inno Setup UI and choose Configure Sign Tools in the Tools menu.
Create a new “sign tool” by clicking Add and specifying a name and the command line to execute your signing application. For example, I created one called “Standard” with the following command line to call Microsoft’s SIGNTOOL.EXE:

"C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\signtool.exe" sign /f CertPath\mycert.pfx /p MyPassword

where CertPath\mycert.pfx is the name and location of the PFX file and MyPassword is the password.
In the [Setup] section of your Inno Setup script (ISS) file, add the following:

SignTool=Standard /d $qStonefield Query Installer$q $f

Specify the name of your “sign tool” in place of “Standard” and a descriptive name for your setup program in place of “Stonefield Query Installer.” $q is an Inno Setup constant representing a quote and $f is a constant containing the name and path of the setup EXE created by Inno Setup.

Now, every time you build your setup using the Inno Setup UI, your setup executable is automatically signed.

However, I also like to build setups as part of a build process, so I call the Inno Setup compiler via the command line. Once I added the SignTool directive in my ISS files, my command line builds failed.

Here’s the solution: you need to add the same “sign tool” definition you did to the UI to the command line. For example:

"C:\Program Files\Inno Setup 5\iscc" "/sStandard=C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\Bin\signtool.exe sign /f CertPath\mycert.pfx /p MyPassword $p" sfquery.iss

Now, whether I build using the UI or through a build process, my setup executable is always signed.



Я и сам знаю, где находится, но просто решил разобраться: этот или нет?

Sanshalay 05-06-2012 00:00 1928195

Актуальный вопрос: http://forum.oszone.net/post-1927509.html#post1927509

Решил проблему =)

Ivan_009 05-06-2012 00:53 1928229

Небольшой вопрос если я использую ISDone то значение AppID мне нужно или нет зараннее спасибо... :unsure:

R.i.m.s.k.y. 05-06-2012 07:40 1928306

alert30, спасибо
однако ничего у сертификатчиков не потрескается? от 179 до 499 уе за серт
Цитата:

a certificate with prices ranging from $179 USD to $499 USD per year

Johny777 05-06-2012 11:55 1928394

Ivan_009,
AppID никак не связан с ISDone и есть всегда, если ты принудительно не создаёшь создаваемый по умолчанию ключ реестра (CreateUninstallRegKey = no) или деинсталятор (Uninstallable=no)
если AppID не указан, то он берётся автоматом из AppName=
например при AppName=hl2 ключ реестра будет таким
HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\hl2_is1
рекомендую всегда делать настройку AppID и использовать его по двум причинам
1. имя не будет браться из AppName= , а будет твоим уникальным
2. ты каждый раз можешь находить директорию установки игры (если установлена) вот так
AppId=TheBestAppId
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID") }_is1,InstallLocation|{pf}\MyProgramm}
это удобно, если игру нужно переустановить (скажем сменить озвучку) или если ты делаешь патч
удобно тем, что не нужно указывать куда она установлена

os_my_zone 05-06-2012 16:36 1928579

Здраствуйте.
Как установить определенный файл, если будет выбрано в установщике 2 определенных компонента
Пробовал так: Components: c1 c6
Он видит только 1. и устанавливает файл, но мне нужно, чтобы файл устанавливался, если выделены эти два компонента.

nik1967 05-06-2012 16:50 1928594

os_my_zone, Components: c1 and c6

Ivan_009 05-06-2012 22:10 1928835

Как в ISVideo.dll v.1.5.0 сделать кнопки Пауза,Старт,Стоп на if CurPageID=wpInstalling then зараннее спасибо... :search:

Johny777 06-06-2012 00:09 1928956

вот тебе Ваня простенькие процедуры :)
назначь сам чему нужно
извиняюсь за изврат со "Стопом", тк процедура ISVideoStop почему-то ничем не отличается от ISVideoPause

читать дальше »
Код:

procedure Play(Sender: TObject);
begin
 ISVideoPlay();
end;

procedure Pause(Sender: TObject);
begin
  ISVideoPause();
end;

procedure Stop(Sender: TObject);
begin
  ISVideoClose();
  ISVideoInit(WizardForm.Handle, ExpandConstant('{tmp}\Video.avi'), ScaleX(65), ScaleY(65), ScaleX(320), ScaleY(200));
  ISVideoPause();
end;


наглядный пример в архиве http://sendfile.su/608592

Цитата:

Цитата Ivan_009
на if CurPageID=wpInstalling »

ну запускаешь видео на странице установки строкой
ISVideoInit(WizardForm.Handle, ExpandConstant('{tmp}\Video.avi'), ScaleX(65), ScaleY(65), ScaleX(320), ScaleY(200));
рекомендую извлекать видео на шаге ssinstall, те перед установкой
там же кнопки делаешь или чем ты управляешь действиями

Dark_Delphin 06-06-2012 13:20 1929352

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

Johny777 06-06-2012 14:42 1929418

Dark_Delphin,
опыта с внешними архивами у меня почти никакого, но думаю, что там где у тебя списком идут
внешние архивы(если это так) нужно после определённой строки создать форму и на ней эдит
с обзором или просто "Обзор" и указать расположение других архивов (как в вин раре)
покажи код распаковки

Dark_Delphin 06-06-2012 16:02 1929469

Johny777,
Код:

if not ISArcExtract    ( 0, 24, ExpandConstant('{src}\zdata.pro'),      ExpandConstant('{app}'),      false, '', '', '', PCFonFLY ) then break;
if not ISSRepExtract  ( 0, 25, ExpandConstant('{app}\zdata.srep'), ExpandConstant('{app}\zdata.pcf'),      true                          ) then break;
if not ISPrecompExtract( 0, 25, ExpandConstant('{app}\zdata.pcf'),  ExpandConstant('{app}\zdata.7z'),        true                          ) then break;
if not IS7ZipExtract  ( 0, 25, ExpandConstant('{app}\zdata.7z'),  ExpandConstant('{app}\'),            true,  ''                      ) then break;

или

Код:

if not ISArcExtract    ( 0, 100, ExpandConstant('{src}\zdata.pro'),      ExpandConstant('{app}'),      false, '', '', '', PCFonFLY ) then break;

Johny777 06-06-2012 17:17 1929518

Dark_Delphin,

дабы далеко не ходить вот тут есть готовый пример формы запроса от Winst@n для IsDone

http://176.9.1.113:52080/showthread.php?t=7&page=3

проще, чем нечто подобное с нуля рисовать

FrozenProtector 07-06-2012 09:19 1929861

Во время установки подгружаю нужные мне файлы через интернет. Для этих целей использую плагин Inno Tools Downloader.
Всё устраивает кроме одной мелочи - не могу русифицировать интерфейс загрузки. Плагин позволяет править ini файлы с языками, а потом подгружать их через команду ITD_LoadStrings. Но в результате вместо русских букв получаются иероглифы. Пробовал конвертировать ini в различные кодировки, но ничего не помогло. Функция ITD_SetString дает аналогичный результат.
Кто сталкивался, помогите ,пожалуйста, или подскажите аналогичные загрузчики файлов через интернет.

t16bz 07-06-2012 12:44 1929989

Здравствуйте, кто знает скажите, что нужно пропивать в caption, чтобы на кнопке был такой символ?
http://i25.fastpic.ru/big/2012/0607/...2824d38005.png

El Sanchez 07-06-2012 13:10 1930003

Цитата:

Цитата FrozenProtector
подскажите аналогичные загрузчики файлов через интернет. »

FrozenProtector, в один поток без докачки.
читать дальше »

Код:

[code]
const
    INTERNET_OPEN_TYPE_PRECONFIG = 0;
    INTERNET_FLAG_NO_CACHE_WRITE = $4000000;
    INTERNET_FLAG_NEED_FILE = $10;
    INTERNET_FLAG_NO_AUTO_REDIRECT = $200000;
    HTTP_QUERY_LOCATION = 33;
    FILE_END = 2;
    INVALID_SET_FILE_POINTER = $FFFFFFFF;

var
    ProgressPage: TOutputProgressWizardPage;
    DownSpeedLabel, PercentLabel, PassedLabel, RemainLabel: TLabel;
    StartDownload: DWORD;
    FStream: TFileStream;
    fSize: DWORD;
    fName: String;
    Timer:  TTimer;
    LastSize, CurrentTimerEvent, LastTimerEvent: DWORD;
   

function InternetOpen(lpszAgent: String; dwAccessType: DWORD; lpszProxyName, lpszProxyBypass: String; dwFlags: DWORD): Integer; external 'InternetOpenA@wininet.dll stdcall';
function InternetOpenUrl(hInternet: Integer; lpszUrl, lpszHeaders: String; dwHeadersLength, dwFlags: DWORD; dwContext: DWORD_PTR): Integer; external 'InternetOpenUrlA@wininet.dll stdcall';
function InternetSetFilePointer(hFile: Integer; lDistanceToMove: Longint; lpDistanceToMoveHigh: Variant; dwMoveMethod, dwContext: DWORD): DWORD; external 'InternetSetFilePointer@wininet.dll stdcall';
function InternetReadFile(hFile: Integer; var lpBuffer: Char; dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; external 'InternetReadFile@wininet.dll stdcall';
function InternetQueryDataAvailable(hFile: Integer; var lpdwNumberOfBytesAvailable: DWORD; dwFlags: DWORD; dwContext: DWORD_PTR): Boolean; external 'InternetQueryDataAvailable@wininet.dll stdcall';
function InternetCloseHandle(hInternet: Integer): BOOL; external 'InternetCloseHandle@wininet.dll stdcall';
function DeleteUrlCacheEntry(lpszUrlName: String): BOOL; external 'DeleteUrlCacheEntryA@wininet.dll stdcall';
function HttpQueryInfo(hRequest: Integer; dwInfoLevel: DWORD; var lpvBuffer: Char; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfoA@wininet.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function StrFromTimeInterval(var pszOut: Char; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeIntervalA@shlwapi.dll stdcall';


////////////////////////////////////////////
function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;

function TicksToTime(Ticks: DWORD): String;
var
    i: Byte;
    arr: array [0..31] of Char;
begin
    for i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;

function RoundDword(dwValue: DWORD): DWORD;
begin
    dwValue := dwValue or (dwValue shr 1);
    dwValue := dwValue or (dwValue shr 2);
    dwValue := dwValue or (dwValue shr 4);
    dwValue := dwValue or (dwValue shr 8);
    dwValue := dwValue or (dwValue shr 16);
    Result := dwValue - (dwValue shr 1);
end;

procedure DownloadProgress(Sender: TObject);
begin
    try
        CurrentTimerEvent := GetTickCount;
        ProgressPage.SetText('Файл: '#9#9 + fName, 'Загружено: '#9 + BytesToSize(FStream.Size) + ' из ' + BytesToSize(fSize));
        PassedLabel.Caption := 'Прошло: '#9 + TicksToTime(CurrentTimerEvent-StartDownload);
        RemainLabel.Caption := 'Осталось: '#9 + TicksToTime(StrToInt(FormatFloat('0',(fSize-FStream.Size)*(CurrentTimerEvent-StartDownload)/FStream.Size)));
        with PercentLabel do
        begin
            Caption := FormatFloat('0.#0 %', (FStream.Size*100)/fSize);
            if Left <= (ProgressPage.ProgressBar.Width - Width) then
                Left := StrToInt(FormatFloat('0', FStream.Size*ProgressPage.ProgressBar.Width/fSize));
        end;
        if CurrentTimerEvent - LastTimerEvent >= 1000 then
        begin
            DownSpeedLabel.Caption := 'Скорость: '#9 + BytesToSize(FStream.Size-LastSize) + '/сек';
            LastTimerEvent := CurrentTimerEvent;
            LastSize := FStream.Size;
        end;
    finally
    end;
end;

procedure DownloadFile(urlFilename: String);
var
    i: SmallInt;
    lpBuffer: array of Char;
    lpdwNumberOfBytesRead, lpdwNumberOfBytesAvailable, lpdwBufferLength, lpdwIndex: DWORD;
    hInt, hRedir, hFile: Integer;
    fBuf: String;
begin
    try
        hInt := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
        if hInt <> 0 then
        try
            //Get file name and size
            hRedir := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE or INTERNET_FLAG_NO_AUTO_REDIRECT, 0);
            if hRedir = 0 then Exit;
            try
                SetArrayLength(lpBuffer, 1024);
                fSize := InternetSetFilePointer(hRedir, 0, NULL, FILE_END, 0);
                if fSize = INVALID_SET_FILE_POINTER then
                begin
                    lpdwBufferLength := GetArrayLength(lpBuffer);
                    lpdwIndex := 0;
                    HttpQueryInfo(hRedir, HTTP_QUERY_LOCATION, lpBuffer[0], lpdwBufferLength, lpdwIndex);
                    urlFilename := '';
                    for i := 0 to lpdwBufferLength-1 do urlFilename := urlFilename + lpBuffer[i];
                    hFile := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE, 0);
                    if hFile <> 0 then
                    try
                        fSize := InternetSetFilePointer(hFile, 0, NULL, FILE_END, 0);
                    finally
                        InternetCloseHandle(hFile);
                        DeleteUrlCacheEntry(urlFilename);
                    end;
                end;
            finally
                fName := ExtractFileName(urlFilename);
                InternetCloseHandle(hRedir);
                DeleteUrlCacheEntry(urlFilename);
            end;
            //
            hFile := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE, 0);
            if hFile <> 0 then
            begin
                if GetSaveFileName('Сохранить как...', fName, '', '*' + ExtractFileExt(fName), ExtractFileExt(fName)) then
                try
                    DeleteFile(fName);
                    FStream := TFileStream.Create(fName, fmCreate);
                    ProgressPage.SetProgress(0, fSize);
                    ProgressPage.Show;
                    StartDownload := GetTickCount();
                    while (InternetQueryDataAvailable(hFile, lpdwNumberOfBytesAvailable, 0, 0) and (lpdwNumberOfBytesAvailable > 0)) do
                    begin
                        SetArrayLength(lpBuffer, RoundDword(lpdwNumberOfBytesAvailable));
                        InternetReadFile(hFile, lpBuffer[0], GetArrayLength(lpBuffer), lpdwNumberOfBytesRead);
                        ProgressPage.SetProgress(FStream.Size + lpdwNumberOfBytesRead, fSize);
                        fBuf := '';
                        for i := 0 to GetArrayLength(lpBuffer)-1 do fBuf := fBuf + lpBuffer[i];
                        FStream.WriteBuffer(fBuf, lpdwNumberOfBytesRead);
                        FStream.Seek(0, soFromEnd);
                        Timer.Enabled := FStream.Size <> fSize;
                    end;
                finally
                    Timer.Enabled := False;
                    FStream.Free;
                    ProgressPage.Hide;
                end;
            end;
        finally
            InternetCloseHandle(hFile);
            DeleteUrlCacheEntry(urlFilename);
        end;
    finally
        InternetCloseHandle(hInt);
    end;
end;

procedure CreateDownloadProgressPage;
begin
    ProgressPage := CreateOutputProgressPage('Загрузка файла', '');
    ProgressPage.ProgressBar.Top := ProgressPage.ProgressBar.Top + ProgressPage.ProgressBar.Height div 2;
    PercentLabel := TLabel.Create(WizardForm);
    with PercentLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := ProgressPage.ProgressBar.Top - Height - ScaleY(2);
        Transparent := True;
    end;
    DownSpeedLabel := TLabel.Create(WizardForm);
    with DownSpeedLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := ProgressPage.ProgressBar.Top + ScaleY(30);
        Transparent := True;
    end;
    PassedLabel := TLabel.Create(WizardForm);
    with PassedLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := DownSpeedLabel.Top + ScaleY(15);
        Transparent := True;
    end;
    RemainLabel := TLabel.Create(WizardForm);
    with RemainLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := PassedLabel.Top + ScaleY(15);
        Transparent := True;
    end;
    Timer := TTimer.Create(WizardForm);
    with Timer do
    begin
        Interval := 100;
        OnTimer := @DownloadProgress;
        Enabled := False;
    end;
end;

//
procedure InitializeWizard();
begin
    CreateDownloadProgressPage;
end;
//

function NextButtonClick(CurPageID: Integer): Boolean;
begin
    if CurPageID = wpWelcome then
    begin
        DownloadFile('http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe');
        Result := True;
    end;
    Result := True;
end;


P.S. Требуется расширенная версия Inno.

Johny777 07-06-2012 16:12 1930107

t16bz,
я бы например использовал SpeedButton с глифом (тебе понадобится расширенная версия инно http://forum.oszone.net/thread-148707-30.html)
пример с картинкой во вложенном архиве
хотя может на Unicode версии инно можно использовать такой символ

t16bz 07-06-2012 16:55 1930137

Цитата:

Цитата Johny777
я бы например использовал SpeedButton с глифом (тебе понадобится расширенная версия инно http://forum.oszone.net/thread-148707-30.html)
пример с картинкой во вложенном архиве
хотя может на Unicode версии инно можно использовать такой символ »

К сожалению, этот вариант не подходит

FrozenProtector 07-06-2012 17:25 1930153

t16bz
Непечтные символы вывожу так:
Button.Caption := #код_символа
например:
Button.Caption := #244;
или шестнадцатеричный код символа
Button.Caption := #$FE;

Конечно нужно знать код символа.

El Sanchez 07-06-2012 17:50 1930164

Цитата:

Цитата FrozenProtector
Конечно нужно знать код символа. »

t16bz, можно использовать символьный шрифт, где нужные глифы уже есть. Например, система для отрисовки стандартных контролов использует шрифт Marlett.
Код:

Button.Font.Name := 'Marlett';
Button.Caption := '8';


R.i.m.s.k.y. 07-06-2012 18:30 1930181

El Sanchez, способ хороший но есть нюанс: в говносборках частенько вырезают шрифты
В каждой венде есть "Таблица символов", интересующие меня символы я смотрю там

nik1967 07-06-2012 18:43 1930195

Цитата:

Цитата R.i.m.s.k.y.
В каждой венде есть "Таблица символов", интересующие меня символы я смотрю там »

С этим не прокатывает(по крайней мере у меня).

R.i.m.s.k.y. 07-06-2012 18:55 1930207

Цитата:

Цитата nik1967
С этим не прокатывает(по крайней мере у меня). »


Dark_Delphin 08-06-2012 00:47 1930353

Всем привет.

Кто знает как изменить окошко "Выбор языка инсталлятора" ?

Johny777 08-06-2012 02:36 1930370

Dark_Delphin,
http://176.9.1.113:52080/showthread.php?t=7&page=4
(в сообщении sergey3695)

__________________________________________________

скажите пожалуйста как можно короче записать обновление прогрессбара
извлекаются 92 файла и после каждой строки приписываю Позиция := число
может можно покороче и по проще
я не знаю :(

читать дальше »
Код:

  Form := CreateCustomForm();
  with Form do
  begin
    BorderIcons := [];
    ClientWidth := ScaleX(256);
    ClientHeight := ScaleY(338);
    BorderStyle := bsSingle;
    SetClassLong(Form.Handle, (-26), GetWindowLong(Form.Handle, (-26)) or $00020000); /// тень от окна
    Left := GetSystemMetrics(16) - ClientWidth - ScaleX(16);
    Top := GetSystemMetrics(17) - ClientHeight - ScaleY(16);
  end;

  with TBitmapImage.Create(Form) do
  begin
      .....
  end;

  LoadPrgsBar := TNewProgressBar.Create(Form);
  with LoadPrgsBar do
  begin
    Parent := Form;
    SetBounds(ScaleX(0), ScaleY(0), ScaleX(256), ScaleY(25))
    Position := 0;
  end;

  with TLabel.Create(Form) do
  begin
      .......
  end;
 

Form.Show();
Form.Repaint;
    /// конец

/////////////////////////////////////////
/// скроллбокс  /// 92 строки
with LoadPrgsBar do
begin
ExtractTemporaryFile('WizardForm.Intro_BitmapImage1.bmp');
Position := 1;

ExtractTemporaryFile('WizardForm.BitmapImage1.bmp');
Position := 2;

ExtractTemporaryFile('WizardForm.BitmapImage2.bmp');
Position := 3;

ExtractTemporaryFile('WizardForm.BitmapImage3.bmp');
Position := 4;

ExtractTemporaryFile('WizardForm.BitmapImage4.bmp');
Position := 5;

ExtractTemporaryFile('WizardForm.BitmapImage5.bmp');
Position := 6;

ExtractTemporaryFile('WizardForm.BitmapImage6.bmp');
Position := 7;

ExtractTemporaryFile('WizardForm.BitmapImage7.bmp');
Position := 8;

ExtractTemporaryFile('WizardForm.BitmapImage8.bmp');
Position := 9;

ExtractTemporaryFile('WizardForm.BitmapImage10.bmp');
Position := 10;

ExtractTemporaryFile('WizardForm.BitmapImage11.bmp');
Position := 11;

ExtractTemporaryFile('WizardForm.BitmapImage12.bmp');
Position := 12;

ExtractTemporaryFile('WizardForm.BitmapImage13.bmp');
Position := 13;

ExtractTemporaryFile('WizardForm.BitmapImage14.bmp');
Position := 14;

ExtractTemporaryFile('WizardForm.BitmapImage15.bmp');
Position := 15;

ExtractTemporaryFile('WizardForm.BitmapImage16.bmp');
Position := 16;

ExtractTemporaryFile('WizardForm.BitmapImage17.bmp');
Position := 17;

ExtractTemporaryFile('WizardForm.BitmapImage18.bmp');
Position := 18;

ExtractTemporaryFile('WizardForm.BitmapImage19.bmp');
Position := 19;

ExtractTemporaryFile('WizardForm.BitmapImage20.bmp');
Position := 20;

ExtractTemporaryFile('WizardForm.BitmapImage21.bmp');
Position := 21;

ExtractTemporaryFile('WizardForm.BitmapImage22.bmp');
Position := 22;

ExtractTemporaryFile('WizardForm.BitmapImage23.bmp');
Position := 23;

ExtractTemporaryFile('WizardForm.BitmapImage24.bmp');
Position := 24;

ExtractTemporaryFile('WizardForm.BitmapImage25.bmp');
Position := 25;

ExtractTemporaryFile('WizardForm.BitmapImage26.bmp');
Position := 26;

ExtractTemporaryFile('WizardForm.BitmapImage27.bmp');
Position := 27;

ExtractTemporaryFile('WizardForm.BitmapImage28.bmp');
Position := 28;

ExtractTemporaryFile('WizardForm.BitmapImage29.bmp');
Position := 29;

ExtractTemporaryFile('WizardForm.BitmapImage30.bmp');
Position := 30;

ExtractTemporaryFile('WizardForm.BitmapImage31.bmp');
Position := 31;

ExtractTemporaryFile('WizardForm.BitmapImage32.bmp');
Position := 32;

ExtractTemporaryFile('WizardForm.BitmapImage33.bmp');
Position := 33;

ExtractTemporaryFile('WizardForm.BitmapImage34.bmp');
Position := 34;

ExtractTemporaryFile('WizardForm.BitmapImage35.bmp');
Position := 35;

ExtractTemporaryFile('WizardForm.BitmapImage36.bmp');
Position := 36;

ExtractTemporaryFile('WizardForm.BitmapImage37.bmp');
Position := 37;

ExtractTemporaryFile('WizardForm.BitmapImage38.bmp');
Position := 38;

ExtractTemporaryFile('WizardForm.BitmapImage39.bmp');
Position := 39;

ExtractTemporaryFile('WizardForm.BitmapImage40.bmp');
Position := 40;

ExtractTemporaryFile('WizardForm.BitmapImage41.bmp');
Position := 42;

ExtractTemporaryFile('WizardForm.BitmapImage42.bmp');
Position := 44;

ExtractTemporaryFile('WizardForm.BitmapImage43.bmp');
Position := 45;

ExtractTemporaryFile('WizardForm.BitmapImage44.bmp');
Position := 46;

ExtractTemporaryFile('WizardForm.BitmapImage45.bmp');
Position := 47;

ExtractTemporaryFile('WizardForm.BitmapImage46.bmp');
Position := 48;

ExtractTemporaryFile('WizardForm.BitmapImage47.bmp');
Position := 49;

ExtractTemporaryFile('WizardForm.BitmapImage48.bmp');
Position := 50;

ExtractTemporaryFile('WizardForm.BitmapImage49.bmp');
Position := 51;

ExtractTemporaryFile('WizardForm.BitmapImage50.bmp');
Position := 52;

ExtractTemporaryFile('WizardForm.BitmapImage51.bmp');
Position := 53;

ExtractTemporaryFile('WizardForm.BitmapImage52.bmp');
Position := 54;

ExtractTemporaryFile('WizardForm.BitmapImage53.bmp');
Position := 55;

ExtractTemporaryFile('WizardForm.BitmapImage55.bmp');
Position := 56;

ExtractTemporaryFile('WizardForm.BitmapImage54.bmp');
Position := 57;

ExtractTemporaryFile('WizardForm.BitmapImage56.bmp');
Position := 58;

ExtractTemporaryFile('WizardForm.BitmapImage57.bmp');
Position := 59;

ExtractTemporaryFile('WizardForm.BitmapImage58.bmp');
Position := 60;

ExtractTemporaryFile('WizardForm.BitmapImage59.bmp');
Position := 61;

ExtractTemporaryFile('WizardForm.BitmapImage60.bmp');
Position := 62;

ExtractTemporaryFile('WizardForm.BitmapImage61.bmp');
Position := 63;

ExtractTemporaryFile('WizardForm.BitmapImage62.bmp');
Position := 64;

ExtractTemporaryFile('WizardForm.BitmapImage63.bmp');
Position := 65;

ExtractTemporaryFile('WizardForm.BitmapImage64.bmp');
Position := 66;

ExtractTemporaryFile('WizardForm.BitmapImage65.bmp');
Position := 67;

ExtractTemporaryFile('WizardForm.BitmapImage66.bmp');
Position := 68;

ExtractTemporaryFile('WizardForm.BitmapImage67.bmp');
Position := 69;

ExtractTemporaryFile('WizardForm.BitmapImage68.bmp');
Position := 70;

ExtractTemporaryFile('WizardForm.BitmapImage69.bmp');
Position := 71;

ExtractTemporaryFile('WizardForm.BitmapImage70.bmp');
Position := 72;

ExtractTemporaryFile('WizardForm.BitmapImage71.bmp');
Position := 73;

ExtractTemporaryFile('WizardForm.BitmapImage72.bmp');
Position := 74;

ExtractTemporaryFile('WizardForm.BitmapImage73.bmp');
Position := 75;

ExtractTemporaryFile('WizardForm.BitmapImage74.bmp');
Position := 76;

ExtractTemporaryFile('WizardForm.BitmapImage75.bmp');
Position := 77;

ExtractTemporaryFile('WizardForm.BitmapImage76.bmp');
Position := 79;

ExtractTemporaryFile('WizardForm.BitmapImage77.bmp');
Position := 80;

ExtractTemporaryFile('WizardForm.BitmapImage78.bmp');
Position := 81;

ExtractTemporaryFile('WizModernImage.bmp'); /// интеграция воды
Position := 82;

ExtractTemporaryFile('Trinagle_Info_bmp.bmp');
Position := 83;

ExtractTemporaryFile('Select_pic.bmp');
Position := 84;

ExtractTemporaryFile('WizardForm.PortalC_Image.bmp');
Position := 85;

ExtractTemporaryFile('WizardForm.SpeedBtn.bmp');
Position := 86;

ExtractTemporaryFile('TFormA.bmp'); /// распаковка картинки формы задач
Position := 87;

ExtractTemporaryFile('A_pic.bmp');
Position := 88;

ExtractTemporaryFile('C_pic.bmp');
Position := 89;

ExtractTemporaryFile('T1.bmp');
Position := 90;

ExtractTemporaryFile('T3.bmp');
Position := 93;

ExtractTemporaryFile('WizardForm.Scanner_pic.bmp');
Position := 95;

ExtractTemporaryFile('Ws_markings1.bmp'); /// распаковка картинки формы отмены
    /// распаковка скрина при отсутствии шрифиов /// начало
    if ActiveLanguage='Russian' then
    begin
      ExtractTemporaryFile('RU.jpg');
      RenameFile(ExpandConstant('{tmp}\RU.jpg'), ExpandConstant('{tmp}\NoFont.jpg'));
      Position := 97;
    end;
    if ActiveLanguage='English' then
    begin
      ExtractTemporaryFile('EN.jpg');
      RenameFile(ExpandConstant('{tmp}\EN.jpg'), ExpandConstant('{tmp}\NoFont.jpg'));
      Position := 97;
    end;
    /// конец
ExtractTemporaryFile('LIcon.ico');  /// извлекаем маленькую иконку
Position := 100;
end;



.........................

Sanshalay 08-06-2012 20:16 1930859

Как путь для установки игры извлечь из реестра (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\nhl2009.exe. Параметр Path)?

Gnom_aka_Lexander 10-06-2012 18:45 1931870

Цитата:

Цитата Johny777
может можно покороче и по проще »

Position := число; можно заменить на Position := Position +1;, чтоб строки не считать.
короче точно не порлучится, да и проще тоже. как вариант - забивать все имена распаковываемых файлов в стринглист и потом в цикле от нуля до количества итемов минус один стринглиста, извлекать файлы, беря из стринглиста названия по номеру текущего цикла.
тогда распаковка любого количества файлов займет буквально меньше десятка строчек кода.
но, добавление файлов в стринглист займет все остальное, в итоге проще не станет точно, да и короче не сильно.

El Sanchez 10-06-2012 22:18 1931994

Цитата:

Цитата Johny777
как можно короче записать обновление прогрессбара
извлекаются 92 файла и после каждой строки приписываю Позиция := число
может можно покороче и по проще »

Johny777, как вариант, дать картинкам имена, содержащих позицию прогрессбара, и использовать цикл.
Код:

with LoadPrgsBar do
begin
  for i := 1 to 100 do
  begin
    ExtractTemporaryFile('Image' + IntToStr(i) + '.bmp');
    Position := i;
  end;
end;


Johny777 11-06-2012 03:03 1932100

El Sanchez,
спасибо
так и сделал
только не сами файлы картинок переименовал а сделал/делаю как дизайнер

читать дальше »
Код:

DestName: "WizardForm.BitmapImage1.bmp"; Source: "prolog\Lambda_hand.bmp"; Flags: dontcopy solidbreak

....

    with LoadPrgsBar do
    begin
      for i := 1 to 85 do
      begin
        ExtractTemporaryFile('WizardForm.BitmapImage' + IntToStr(i) + '.bmp');
        Position := i;
      end;
    end;
    LoadPrgsBar.Position := 100;



,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

доработал немного "проценты установки" (под свои нужды) :grin:
а именно добавил при помощи этого примера (смена названия кнопки в панели задач)

читать дальше »
Код:

[Setup]
AppName=Test
AppVerName=Test
CreateAppDir=false
InternalCompressLevel=none
Compression=none

[  Code]
function SetWindowText(hWnd: Longint; lpString: PChar): Longint; external 'SetWindowTextA@user32.dll';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll';

procedure SetAppTitle(Value: String);
var n: HWND;
begin
  n:=GetWindowLong(MainForm.Handle, -8);
  if n <> 0 then SetWindowText(n, PChar(Value));
end;

procedure InitializeWizard;
begin
  SetAppTitle('NewTitle');
end;



отображение процентов (там же на кнопке)
Так же доработке подверглось создание процентного лейбла и функция отмены эксклюзивно для страницы установки

читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: compiler:innocallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs

[  code]
type
  TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
 

var
  PercentsTimer: LongWord;
  PercentsLabel: TLabel;
 

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';


function NumToStr(Float: Extended): String;
begin
  Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
  while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
end;


procedure PercentsProc(h, msg, idevent, dwTime: Longword);
begin
  with WizardForm.ProgressGauge do
  begin
    PercentsLabel.Caption := NumToStr((Position*100)/Max) + ' %';
    Application.Title := ' ' + NumToStr((Position*100)/Max) + ' %';
  end;
end;


procedure DeinitializeSetup();
begin
  KillTimer(0, PercentsTimer);
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
 
    PercentsLabel:= TLabel.Create(nil);
    with PercentsLabel do
    begin
      SetBounds(WizardForm.ProgressGauge.Left + ScaleX(30), WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10), WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
      AutoSize:= True;
      Transparent := True;
      Parent:= WizardForm.InstallingPage;
    end;

    PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
   
  end;
 
  if CurStep = ssPostInstall then
  begin
    KillTimer(0, PercentsTimer);
    Application.Title := ' Готово';
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID=wpInstalling then
  begin
    Confirm := False;
    case ExitSetupMsgBox of
      True :
      begin
        PercentsLabel.Free;
        Application.Title := ExpandConstant(' ' + SetupMessage(msgButtonCancel) + '...');
        Cancel := True;
      end;
      False : Cancel := False;
    end;
  end;
end;



вроде мелочи, но может кому пригодится
сам считаю отображение процентов (помимо прогрессбара) на кнопке в панели задач очень удобным, если окно свёрнуто

sergey3695 11-06-2012 11:10 1932184

Цитата:

Цитата Johny777
доработал немного "проценты установки" (под свои нужды)
а именно добавил при помощи этого примера (смена названия кнопки в панели задач) »

так короче
читать дальше »
Код:

[Setup]
AppName=Test
AppVerName=Test
CreateAppDir=false
InternalCompressLevel=none
Compression=none

[ Code]
procedure InitializeWizard;
begin
  Application.Title:='NewTitle';
end;


Неадекватный 11-06-2012 15:03 1932321

Привет всем!
Примеры смотрел, но это не то. Всё очень сложно. Код реализации xml большой и не понятный.

В общем задача такая
Имеется NetworkCfg.xml

Код:

<?xml version="1.0" encoding="UTF-8"?>
<AllNetworkConfigs>
        <NetworkConfig isNDIS="0" canbeDelete="1" isPreferred="1">
                <ConfigFileName></ConfigFileName>
                <UserName></UserName>
                <Password></Password>
                <LoginNumber></LoginNumber>
                <AutoGetAPN>0</AutoGetAPN>
                <APN></APN>
                <AutoGetDNS>1</AutoGetDNS>
                <MainDNS>0.0.0.0</MainDNS>
                <StandbyDNS>0.0.0.0</StandbyDNS>
                <AutoGetPDP>1</AutoGetPDP>
                <PDPAddress>0.0.0.0</PDPAddress>
                <PDPType>IP</PDPType>
                <AuthType>PAP</AuthType>
                <AskUserAndPwd>0</AskUserAndPwd>
                <SaveUserAndPwd>0</SaveUserAndPwd>
        </NetworkConfig>
</AllNetworkConfigs>

Пояснения к xml
Код:

<?xml version="1.0" encoding="UTF-8"?>                                        - Создаётся по умолчанию;
<AllNetworkConfigs>                                                        - Создаётся по умолчанию;
        <NetworkConfig isNDIS="0" canbeDelete="1" isPreferred="1">      - Создаётся по умолчанию;
                <ConfigFileName></ConfigFileName>                        - Создаётся по умолчанию, но между <ConfigFileName></ConfigFileName> должно вводиться Название профиля; Например <ConfigFileName>MTS Internet</ConfigFileName>
                <UserName></UserName>                                        - Создаётся по умолчанию, но между <UserName></UserName> должно вводиться Имя пользователя; Например <UserName>MTS</UserName>
                <Password></Password>                                        - Создаётся по умолчанию, но между <Password></Password>  должен вводиться Пароль; Например <Password>mts</Password>
                <LoginNumber></LoginNumber>                                - Создаётся по умолчанию, но между <LoginNumber></LoginNumber>  должен вводиться номер дозвона; Например <LoginNumber>*99***1#</LoginNumber>
                <AutoGetAPN>0</AutoGetAPN>                                - Создаётся по умолчанию;
                <APN></APN>                                                - Создаётся по умолчанию, но между <APN></APN> должна вводиться Точка доступа; Например <APN>internet.mts.ru</APN>
                <AutoGetDNS>1</AutoGetDNS>                                - Создаётся по умолчанию;
                <MainDNS>0.0.0.0</MainDNS>                                - Создаётся по умолчанию;
                <StandbyDNS>0.0.0.0</StandbyDNS>                        - Создаётся по умолчанию;
                <AutoGetPDP>1</AutoGetPDP>                                - Создаётся по умолчанию;
                <PDPAddress>0.0.0.0</PDPAddress>                        - Создаётся по умолчанию;
                <PDPType>IP</PDPType>                                        - Создаётся по умолчанию;
                <AuthType>PAP</AuthType>                                - Создаётся по умолчанию;
                <AskUserAndPwd>0</AskUserAndPwd>                        - Создаётся по умолчанию;
                <SaveUserAndPwd>0</SaveUserAndPwd>                        - Создаётся по умолчанию;
        </NetworkConfig>                                                - Создаётся по умолчанию;
</AllNetworkConfigs>                                                        - Создаётся по умолчанию;

Если быть точнее, этот NetworkCfg.xml должен создаваться в папке программы, т.е %ProgramFiles%\Моё Программное Обеспечение.
То что в коде "но между XXX должно вводиться Название XXX; Например XXX" это должно работать в инсталляторе "вводиться в окошках"

Вот код
Код:

[Setup]
AppName=Моё Программное Обеспечение
AppVersion=1.5
;AppVerName=Моё Программное Обеспечение 1.5
DefaultDirName={pf}\Моё Программное Обеспечение
DefaultGroupName=Моё Программное Обеспечение
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Icons]
Name: "{group}\{cm:UninstallProgram,Моё Программное Обеспечение}"; Filename: "{uninstallexe}"

[CustomMessages]
Russian.Caption=Настройка профиля по умолчанию
Russian.Description=Настройте профиль в соответствии с вашим оператором
Russian.SettingsProfile=Настройка профиля
Russian.Operator=Оператор:
Russian.UserName=Имя пользователя:
Russian.Password=Пароль:
Russian.NumberDial=Номер набора:
Russian.APN=Точка доступа:

[*Code]
var
  ISCustomPage1: TWizardPage;
  NewGroupBox1: TNewGroupBox;
  NewStaticText1: TNewStaticText;
  NewEdit1: TNewEdit;
  NewStaticText2: TNewStaticText;
  NewEdit2: TNewEdit;
  NewStaticText3: TNewStaticText;
  NewEdit3: TNewEdit;
  NewStaticText4: TNewStaticText;
  NewEdit4: TNewEdit;
  NewStaticText5: TNewStaticText;
  NewEdit5: TNewEdit;

procedure RedesignWizardForm;
begin
  ISCustomPage1 := CreateCustomPage(wpSelectDir, CustomMessage('Caption'), CustomMessage('Description'));

  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

  NewGroupBox1 := TNewGroupBox.Create(WizardForm);
  with NewGroupBox1 do
  begin
    Name := 'NewGroupBox1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(8);
    Width := ScaleX(377);
    Height := ScaleY(209);
    Caption := CustomMessage('SettingsProfile');
  end;

  NewStaticText1 := TNewStaticText.Create(WizardForm);
  with NewStaticText1 do
  begin
    Name := 'NewStaticText1';
    Parent := NewGroupBox1;
    Caption := CustomMessage('Operator');
    Left := ScaleX(32);
    Top := ScaleY(31);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit1 := TNewEdit.Create(WizardForm);
  with NewEdit1 do
  begin
    Name := 'NewEdit1';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(28);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText2 := TNewStaticText.Create(WizardForm);
  with NewStaticText2 do
  begin
    Name := 'NewStaticText2';
    Parent := NewGroupBox1;
    Caption := CustomMessage('UserName');
    Left := ScaleX(32);
    Top := ScaleY(57);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit2 := TNewEdit.Create(WizardForm);
  with NewEdit2 do
  begin
    Name := 'NewEdit2';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(53);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText3 := TNewStaticText.Create(WizardForm);
  with NewStaticText3 do
  begin
    Name := 'NewStaticText3';
    Parent := NewGroupBox1;
    Caption := CustomMessage('Password');
    Left := ScaleX(32);
    Top := ScaleY(80);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit3 := TNewEdit.Create(WizardForm);
  with NewEdit3 do
  begin
    Name := 'NewEdit3';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(77);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText4 := TNewStaticText.Create(WizardForm);
  with NewStaticText4 do
  begin
    Name := 'NewStaticText4';
    Parent := NewGroupBox1;
    Caption := CustomMessage('NumberDial');
    Left := ScaleX(32);
    Top := ScaleY(103);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit4 := TNewEdit.Create(WizardForm);
  with NewEdit4 do
  begin
    Name := 'NewEdit4';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(100);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText5 := TNewStaticText.Create(WizardForm);
  with NewStaticText5 do
  begin
    Name := 'NewStaticText5';
    Parent := NewGroupBox1;
    Caption := CustomMessage('APN');
    Left := ScaleX(32);
    Top := ScaleY(127);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit5 := TNewEdit.Create(WizardForm);
  with NewEdit5 do
  begin
    Name := 'NewEdit5';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(124);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText1.TabOrder := 0;
  NewEdit1.TabOrder := 1;
  NewStaticText2.TabOrder := 2;
  NewEdit2.TabOrder := 3;
  NewStaticText3.TabOrder := 4;
  NewEdit3.TabOrder := 5;
  NewStaticText4.TabOrder := 6;
  NewEdit4.TabOrder := 7;
  NewStaticText5.TabOrder := 8;
  NewEdit5.TabOrder := 9;

  NewGroupBox1.TabOrder := 0;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;

Как это реализовать?

Dark_Delphin 11-06-2012 15:10 1932325

Всем привет)

Кто знает как сделать кнопочку "Язык инсталлятора"?

Скриншот:

Johny777 11-06-2012 16:14 1932363

Цитата:

Цитата Dark_Delphin
как сделать кнопочку "Язык инсталлятора" »

вот пример
остальное сам допили
так NextButton.Caption := GetIniString('Messages', 'ButtonNext', '', ExpandConstant('{src}\Russian.ini'));
где Russian.ini это переименованный Russian.isl (для теста я его гружу снаружи, рядом с инсталлом, хоя в конечном итоге ему дорога в temp)
Messages это секция ини
ButtonNext это назвние ключа (в файле ButtonNext= )
можно было бы и не из ини брать, а напрямую вписывать названия, но тогда будет много копипаста
можешь смело подредактировать и укоротить ини для своего инсталла

читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[  code]
var
  Flag: boolean;


procedure HideShow(Sender: TObject);
begin
  If not Flag then
  begin
 
    with WizardForm do
    begin
      NextButton.Caption := GetIniString('Messages', 'ButtonNext', '', ExpandConstant('{src}\Russian.ini'));
      case
        WizardForm.CurPageID of
          wpReady: NextButton.Caption := GetIniString('Messages', 'ButtonInstall', '', ExpandConstant('{src}\Russian.ini'));
          wpFinished: NextButton.Caption := GetIniString('Messages', 'ButtonFinish', '', ExpandConstant('{src}\Russian.ini'));
      end;
      BackButton.Caption := GetIniString('Messages', 'ButtonBack', '', ExpandConstant('{src}\Russian.ini'));
      CancelButton.Caption := GetIniString('Messages', 'ButtonCancel', '', ExpandConstant('{src}\Russian.ini'));
      WelcomeLabel1.Caption := 'Вас приветствует мастер установки {#SetupSetting("AppName")}';
      WelcomeLabel2.Caption := 'Программа установит {#SetupSetting("AppName")} на Ваш компьютер.%n%nРекомендуется закрыть все прочие приложения перед тем, как продолжить.'
    end;
   
    TButton(Sender).Caption:='En';
    Flag:= True;
  end
 
else
                                                                                                                       
  begin
 
    with WizardForm do
    begin
      NextButton.Caption := GetIniString('Messages', 'ButtonNext', '', ExpandConstant('{src}\English.ini'));
      case
        WizardForm.CurPageID of
          wpReady: NextButton.Caption := GetIniString('Messages', 'ButtonInstall', '', ExpandConstant('{src}\English.ini'));
          wpFinished: NextButton.Caption := GetIniString('Messages', 'ButtonFinish', '', ExpandConstant('{src}\English.ini'));
      end;
      BackButton.Caption := GetIniString('Messages', 'ButtonBack', '', ExpandConstant('{src}\English.ini'));
      CancelButton.Caption := GetIniString('Messages', 'ButtonCancel', '', ExpandConstant('{src}\English.ini'));
      WelcomeLabel1.Caption := 'Welcome to the {#SetupSetting("AppName")} Setup Wizard';
      WelcomeLabel2.Caption := GetIniString('Messages', 'WelcomeLabel2', '', ExpandConstant('{src}\English.ini'));
    end;
   
    TButton(Sender).Caption:='Ru';
    Flag:= False;
  end;
 
end;


procedure InitializeWizard();
begin

  with TButton.Create(WizardForm) do
  begin
    SetBounds(ScaleX(20), ScaleY(325), ScaleX(25), ScaleY(25));
    OnClick:= @HideShow;
    Caption:= 'En';
    Parent:= WizardForm;
  end;
  Flag:= True;
 
end;



(хотя считаю, что эта кнопка чистой воды понт, тк смысл = 0, если ты уже выбрал язык перед запуском инсталла или он выбрался автоматически в зависимости от настроек )

El Sanchez 11-06-2012 21:27 1932532

Цитата:

Цитата Неадекватный
NetworkCfg.xml должен создаваться в папке программы, т.е %ProgramFiles%\Моё Программное Обеспечение.
То что в коде "но между XXX должно вводиться Название XXX; Например XXX" это должно работать в инсталляторе "вводиться в окошках" »

Неадекватный, способов несколько.
1. Использовать уже готовый шаблон без значений NetworkCfg.xml (как в вашем посте, первый код) и методы объекта XMLDOM:
читать дальше »

Код:

[Files]
Source: NetworkCfg.xml; Flags: dontcopy

[code]
procedure CreateNetworkCfg;
var
    objXMLDoc: Variant;
begin
    objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
    objXMLDoc.async := False;
    objXMLDoc.load(ExpandConstant('{tmp}\networkcfg.xml'));
    if objXMLDoc.parseError.errorCode <> 0 then Exit;
    objXMLDoc.selectSingleNode('//AllNetworkConfigs/NetworkConfig/ConfigFileName').Text := NewEdit1.Text;
    objXMLDoc.selectSingleNode('//AllNetworkConfigs/NetworkConfig/UserName').Text := NewEdit2.Text;
    objXMLDoc.selectSingleNode('//AllNetworkConfigs/NetworkConfig/Password').Text := NewEdit3.Text;
    objXMLDoc.selectSingleNode('//AllNetworkConfigs/NetworkConfig/LoginNumber').Text := NewEdit4.Text;
    objXMLDoc.selectSingleNode('//AllNetworkConfigs/NetworkConfig/APN').Text := NewEdit5.Text;
    objXMLDoc.save(ExpandConstant('{app}\networkcfg.xml'));
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    case CurStep of
        ssPostInstall: CreateNetworkCfg;
    end;
end;

procedure InitializeWizard();
begin
    ExtractTemporaryFile('networkcfg.xml');
    RedesignWizardForm;
end;



2. Использовать SaveStringToFile с длинной строкой.
читать дальше »

Код:

[code]
procedure CreateNetworkCfg;
begin
    SaveStringToFile(
        ExpandConstant('{app}\networkcfg.xml'),
        '<?xml version="1.0" encoding="UTF-8"?>'#13#10 +
        '<AllNetworkConfigs>'#13#10#9 +
        '<NetworkConfig isNDIS="0" canbeDelete="1" isPreferred="1">'#13#10#9#9 +
        '<ConfigFileName>' + NewEdit1.Text + '</ConfigFileName>'#13#10#9#9 +
        '<UserName>' + NewEdit2.Text + '</UserName>'#13#10#9#9 +
        '<Password>' + NewEdit3.Text + '</Password>'#13#10#9#9 +
        '<LoginNumber>' + NewEdit4.Text + '</LoginNumber>'#13#10#9#9 +
        '<AutoGetAPN>0</AutoGetAPN>'#13#10#9#9 +
        '<APN>' + NewEdit5.Text + '</APN>'#13#10#9#9 +
        '<AutoGetDNS>1</AutoGetDNS>'#13#10#9#9 +
        '<MainDNS>0.0.0.0</MainDNS>'#13#10#9#9 +
        '<StandbyDNS>0.0.0.0</StandbyDNS>'#13#10#9#9 +
        '<AutoGetPDP>1</AutoGetPDP>'#13#10#9#9 +
        '<PDPAddress>0.0.0.0</PDPAddress>'#13#10#9#9 +
        '<PDPType>IP</PDPType>'#13#10#9#9 +
        '<AuthType>PAP</AuthType>'#13#10#9#9 +
        '<AskUserAndPwd>0</AskUserAndPwd>'#13#10#9#9 +
        '<SaveUserAndPwd>0</SaveUserAndPwd>'#13#10#9 +
        '</NetworkConfig>'#13#10 +
        '</AllNetworkConfigs>'
        , False
    );
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    case CurStep of
        ssPostInstall: CreateNetworkCfg;
    end;
end;


R.i.m.s.k.y. 11-06-2012 22:02 1932559

El Sanchez, что такое objXMLDoc? стандартная функция? или какой-то модуль?

El Sanchez 11-06-2012 22:06 1932562

Цитата:

Цитата R.i.m.s.k.y.
что такое objXMLDoc? стандартная функция? или какой-то модуль? »

R.i.m.s.k.y., переменная типа Variant, результат функции CreateOleObject, короче, ссылка на объект.

Неадекватный 12-06-2012 06:16 1932679

Цитата:

Цитата El Sanchez
способов несколько. »

Код:

[Setup]
AppName=Моё Программное Обеспечение
AppVersion=1.5
;AppVerName=Моё Программное Обеспечение 1.5
DefaultDirName={pf}\Моё Программное Обеспечение
DefaultGroupName=Моё Программное Обеспечение
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Icons]
Name: "{group}\{cm:UninstallProgram,Моё Программное Обеспечение}"; Filename: "{uninstallexe}"

[CustomMessages]
Russian.Caption=Настройка профиля по умолчанию
Russian.Description=Настройте профиль в соответствии с вашим оператором
Russian.SettingsProfile=Настройка профиля
Russian.Operator=Оператор:
Russian.UserName=Имя пользователя:
Russian.Password=Пароль:
Russian.NumberDial=Номер набора:
Russian.APN=Точка доступа:

[*Code]
var
  ISCustomPage1: TWizardPage;
  NewGroupBox1: TNewGroupBox;
  NewStaticText1: TNewStaticText;
  NewEdit1: TNewEdit;
  NewStaticText2: TNewStaticText;
  NewEdit2: TNewEdit;
  NewStaticText3: TNewStaticText;
  NewEdit3: TNewEdit;
  NewStaticText4: TNewStaticText;
  NewEdit4: TNewEdit;
  NewStaticText5: TNewStaticText;
  NewEdit5: TNewEdit;

procedure RedesignWizardForm;
begin
  ISCustomPage1 := CreateCustomPage(wpSelectDir, CustomMessage('Caption'), CustomMessage('Description'));

  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

  NewGroupBox1 := TNewGroupBox.Create(WizardForm);
  with NewGroupBox1 do
  begin
    Name := 'NewGroupBox1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(8);
    Width := ScaleX(377);
    Height := ScaleY(209);
    Caption := CustomMessage('SettingsProfile');
  end;

  NewStaticText1 := TNewStaticText.Create(WizardForm);
  with NewStaticText1 do
  begin
    Name := 'NewStaticText1';
    Parent := NewGroupBox1;
    Caption := CustomMessage('Operator');
    Left := ScaleX(32);
    Top := ScaleY(31);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit1 := TNewEdit.Create(WizardForm);
  with NewEdit1 do
  begin
    Name := 'NewEdit1';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(28);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText2 := TNewStaticText.Create(WizardForm);
  with NewStaticText2 do
  begin
    Name := 'NewStaticText2';
    Parent := NewGroupBox1;
    Caption := CustomMessage('UserName');
    Left := ScaleX(32);
    Top := ScaleY(57);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit2 := TNewEdit.Create(WizardForm);
  with NewEdit2 do
  begin
    Name := 'NewEdit2';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(53);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText3 := TNewStaticText.Create(WizardForm);
  with NewStaticText3 do
  begin
    Name := 'NewStaticText3';
    Parent := NewGroupBox1;
    Caption := CustomMessage('Password');
    Left := ScaleX(32);
    Top := ScaleY(80);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit3 := TNewEdit.Create(WizardForm);
  with NewEdit3 do
  begin
    Name := 'NewEdit3';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(77);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText4 := TNewStaticText.Create(WizardForm);
  with NewStaticText4 do
  begin
    Name := 'NewStaticText4';
    Parent := NewGroupBox1;
    Caption := CustomMessage('NumberDial');
    Left := ScaleX(32);
    Top := ScaleY(103);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit4 := TNewEdit.Create(WizardForm);
  with NewEdit4 do
  begin
    Name := 'NewEdit4';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(100);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText5 := TNewStaticText.Create(WizardForm);
  with NewStaticText5 do
  begin
    Name := 'NewStaticText5';
    Parent := NewGroupBox1;
    Caption := CustomMessage('APN');
    Left := ScaleX(32);
    Top := ScaleY(127);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit5 := TNewEdit.Create(WizardForm);
  with NewEdit5 do
  begin
    Name := 'NewEdit5';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(124);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText1.TabOrder := 0;
  NewEdit1.TabOrder := 1;
  NewStaticText2.TabOrder := 2;
  NewEdit2.TabOrder := 3;
  NewStaticText3.TabOrder := 4;
  NewEdit3.TabOrder := 5;
  NewStaticText4.TabOrder := 6;
  NewEdit4.TabOrder := 7;
  NewStaticText5.TabOrder := 8;
  NewEdit5.TabOrder := 9;

  NewGroupBox1.TabOrder := 0;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;

Т.е один из способов нужно вписать в код выше так?

Mafia_forever 12-06-2012 08:29 1932705

как сделать чтоб инсталл выводил окошко . идет подготовка к установке и отображения точного прогресса . в прогресс баре или в процентах . плиз хелп .

alert30 12-06-2012 08:32 1932709

Mafia_forever, по моему должен по-умолчанию производится.

Johny777 12-06-2012 10:22 1932743

Неадекватный,
небольшой апдейт к твоему скрипту
блокировка/разблокировка кнопки "далее" в зависимости от того есть ли текст во всех эдитах
припиши всем эдитам OnChange := @EditsOnChange; *(или в дизайнере во вкладке события назначь)

читать дальше »
Код:

procedure EditsOnChange(Sender: TObject);
begin
  WizardForm.NextButton.Enabled := (NewEdit1.Text <> '') and (NewEdit2.Text <> '') and (NewEdit3.Text <> '')  and (NewEdit4.Text <> '')and (NewEdit5.Text <> '');
end;

procedure RedesignWizardForm;
begin

 ....

  NewEdit1 := TNewEdit.Create(WizardForm);
  with NewEdit1 do
  begin

    ....
    OnChange := @EditsOnChange;  /// пример
  end;

 ....

end;

procedure CurPageChanged(CurPageID: Integer);
begin
    case CurPageID of
        ISCustomPage1.ID: WizardForm.NextButton.Enabled := (NewEdit1.Text <> '') and (NewEdit2.Text <> '') and (NewEdit3.Text <> '')  and (NewEdit4.Text <> '')and (NewEdit5.Text <> '');
    end;
end;



хотя не знаю являются ли твои настройки xml опициональными

полный код:

читать дальше »
Код:

[Setup]
AppName=Моё Программное Обеспечение
AppVersion=1.5
;AppVerName=Моё Программное Обеспечение 1.5
DefaultDirName={pf}\Моё Программное Обеспечение
DefaultGroupName=Моё Программное Обеспечение
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Icons]
Name: "{group}\{cm:UninstallProgram,Моё Программное Обеспечение}"; Filename: "{uninstallexe}"

[CustomMessages]
Russian.Caption=Настройка профиля по умолчанию
Russian.Description=Настройте профиль в соответствии с вашим оператором
Russian.SettingsProfile=Настройка профиля
Russian.Operator=Оператор:
Russian.UserName=Имя пользователя:
Russian.Password=Пароль:
Russian.NumberDial=Номер набора:
Russian.APN=Точка доступа:


[  code]
var
  ISCustomPage1: TWizardPage;
  NewGroupBox1: TNewGroupBox;
  NewStaticText1: TNewStaticText;
  NewEdit1: TNewEdit;
  NewStaticText2: TNewStaticText;
  NewEdit2: TNewEdit;
  NewStaticText3: TNewStaticText;
  NewEdit3: TNewEdit;
  NewStaticText4: TNewStaticText;
  NewEdit4: TNewEdit;
  NewStaticText5: TNewStaticText;
  NewEdit5: TNewEdit;



procedure EditsOnChange(Sender: TObject);
begin
  WizardForm.NextButton.Enabled := (NewEdit1.Text <> '') and (NewEdit2.Text <> '') and (NewEdit3.Text <> '')  and (NewEdit4.Text <> '')and (NewEdit5.Text <> '');
end;


procedure RedesignWizardForm;
begin
  ISCustomPage1 := CreateCustomPage(wpSelectDir, CustomMessage('Caption'), CustomMessage('Description'));

  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

  NewGroupBox1 := TNewGroupBox.Create(WizardForm);
  with NewGroupBox1 do
  begin
    Name := 'NewGroupBox1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(8);
    Width := ScaleX(377);
    Height := ScaleY(209);
    Caption := CustomMessage('SettingsProfile');

  end;

  NewStaticText1 := TNewStaticText.Create(WizardForm);
  with NewStaticText1 do
  begin
    Name := 'NewStaticText1';
    Parent := NewGroupBox1;
    Caption := CustomMessage('Operator');
    Left := ScaleX(32);
    Top := ScaleY(31);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit1 := TNewEdit.Create(WizardForm);
  with NewEdit1 do
  begin
    Name := 'NewEdit1';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(28);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
    OnChange := @EditsOnChange;
  end;

  NewStaticText2 := TNewStaticText.Create(WizardForm);
  with NewStaticText2 do
  begin
    Name := 'NewStaticText2';
    Parent := NewGroupBox1;
    Caption := CustomMessage('UserName');
    Left := ScaleX(32);
    Top := ScaleY(57);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit2 := TNewEdit.Create(WizardForm);
  with NewEdit2 do
  begin
    Name := 'NewEdit2';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(53);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
    OnChange := @EditsOnChange;
  end;

  NewStaticText3 := TNewStaticText.Create(WizardForm);
  with NewStaticText3 do
  begin
    Name := 'NewStaticText3';
    Parent := NewGroupBox1;
    Caption := CustomMessage('Password');
    Left := ScaleX(32);
    Top := ScaleY(80);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit3 := TNewEdit.Create(WizardForm);
  with NewEdit3 do
  begin
    Name := 'NewEdit3';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(77);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
    OnChange := @EditsOnChange;
  end;

  NewStaticText4 := TNewStaticText.Create(WizardForm);
  with NewStaticText4 do
  begin
    Name := 'NewStaticText4';
    Parent := NewGroupBox1;
    Caption := CustomMessage('NumberDial');
    Left := ScaleX(32);
    Top := ScaleY(103);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit4 := TNewEdit.Create(WizardForm);
  with NewEdit4 do
  begin
    Name := 'NewEdit4';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(100);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
    OnChange := @EditsOnChange;
  end;

  NewStaticText5 := TNewStaticText.Create(WizardForm);
  with NewStaticText5 do
  begin
    Name := 'NewStaticText5';
    Parent := NewGroupBox1;
    Caption := CustomMessage('APN');
    Left := ScaleX(32);
    Top := ScaleY(127);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit5 := TNewEdit.Create(WizardForm);
  with NewEdit5 do
  begin
    Name := 'NewEdit5';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(124);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
    OnChange := @EditsOnChange;
  end;

  NewStaticText1.TabOrder := 0;
  NewEdit1.TabOrder := 1;
  NewStaticText2.TabOrder := 2;
  NewEdit2.TabOrder := 3;
  NewStaticText3.TabOrder := 4;
  NewEdit3.TabOrder := 5;
  NewStaticText4.TabOrder := 6;
  NewEdit4.TabOrder := 7;
  NewStaticText5.TabOrder := 8;
  NewEdit5.TabOrder := 9;

  NewGroupBox1.TabOrder := 0;
end;

procedure InitializeWizard();
begin
    RedesignWizardForm;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
    case CurPageID of
        ISCustomPage1.ID: WizardForm.NextButton.Enabled := (NewEdit1.Text <> '') and (NewEdit2.Text <> '') and (NewEdit3.Text <> '')  and (NewEdit4.Text <> '')and (NewEdit5.Text <> '');
    end;
end;


R.i.m.s.k.y. 12-06-2012 13:01 1932834

Цитата:

Цитата El Sanchez
R.i.m.s.k.y., переменная типа Variant, результат функции CreateOleObject, короче, ссылка на объект. »

пример выше достаточен или надо что-то еще?

El Sanchez 12-06-2012 15:20 1932903

Цитата:

Цитата Неадекватный
Т.е один из способов нужно вписать в код выше так? »

Цитата:

Цитата R.i.m.s.k.y.
пример выше достаточен или надо что-то еще? »

Неадекватный, да, вставьте один из вариантов в ваш код.

Dark_Delphin 12-06-2012 16:16 1932927

Всем привет!

Подскажите код, чтобы картинка (PNG) вылазила за пределы инсталлятора и не было фона?

Пример

Johny777 12-06-2012 18:35 1933022

Dark_Delphin,
думаю через ботву
могу предложить такой вариант :) на основе ...\Inno Setup 5\Scripts\WindowEffects\Transperent Color.iss

читать дальше »
Код:

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

[Files]
Source: "S17Logo.bmp"; Flags: dontcopy solidbreak

[ Code]
const
  TransparentPercent = 80; // процент прозрачности
  TransparentColor = $506a5a; // прозрачный цвет
  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';
//
type
  TANewStatic = record
    Static  : TNewStaticText;
  end;

var
  ANewStatic : array of TANewStatic;

function ReleaseCapture(): Longint; external 'ReleaseCapture@user32.dll stdcall';

procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(WizardForm.Handle,$0112,$F012,0)
end;

procedure AddStaticToArray(st:TNewStaticText);
var
  i:integer;
begin
  i:=GetArrayLength(ANewStatic);
  SetArrayLength(ANewStatic,i+1);
  ANewStatic[i].Static:=st;
  ANewStatic[i].Static.OnMouseDown:=@MouseDown;
end;

procedure StaticChange(c:TWinControl);
var
  i:integer;
begin
  for i:=0 to c.ControlCount-1 do
    if c.Controls[i] is TWinControl then begin
      if c.Controls[i] is TNewStaticText then AddStaticToArray(TNewStaticText(c.Controls[i]));
      if TWinControl(c.Controls[i]).ControlCount>0 then StaticChange(TWinControl(c.Controls[i]));
    end;
end;
//
procedure InitializeWizard();
begin
  with WizardForm do
  begin
    OuterNotebook.Hide;
    WizardForm.Width := ScaleX(470);
    WizardForm.Height := ScaleY(525);
    BorderStyle := bsNone;
    CancelButton.Left := ScaleX(200);
    CancelButton.Top := ScaleY(230);
  end;
 
  with TBitmapImage.Create(WizardForm) do
  begin
    Parent := WizardForm;
    Align := alClient;
    Left := ScaleX(0);
    Top := ScaleY(0);
    ExtractTemporaryFile('S17Logo.bmp');
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\S17Logo.bmp'));
    OnMouseDown := @MouseDown;
  end;

  SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_LAYERED)
  SetLayeredWindowAttributes(WizardForm.Handle, TransparentColor, (255 * TransparentPercent) / 100, LWA_COLORKEY)
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.NextButton.Hide;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;



наглядный пример в архиве
прозрачный цвет здесь
$5а6a50 (фотошоп)
$506a5a (инно)

Dark_Delphin 12-06-2012 20:40 1933069

Johny777, Спасибо. Щас буду пробовать)

Неадекватный 13-06-2012 14:28 1933466

Цитата:

Цитата El Sanchez
да, вставьте один из вариантов в ваш код. »

При первой инсталляции не работает не создаёт XML, если установить поверх ещё раз то XML создаётся. В чём может быть ошибка?
Код:

[Setup]
AppName=Моё Программное Обеспечение
AppVersion=1.5
;AppVerName=Моё Программное Обеспечение 1.5
DefaultDirName={pf}\Моё Программное Обеспечение
DefaultGroupName=Моё Программное Обеспечение
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Languages]
Name: "Russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Icons]
Name: "{group}\{cm:UninstallProgram,Моё Программное Обеспечение}"; Filename: "{uninstallexe}"

[CustomMessages]
Russian.Caption=Настройка профиля по умолчанию
Russian.Description=Настройте профиль в соответствии с вашим оператором
Russian.SettingsProfile=Настройка профиля
Russian.Operator=Оператор:
Russian.UserName=Имя пользователя:
Russian.Password=Пароль:
Russian.NumberDial=Номер набора:
Russian.APN=Точка доступа:

[*Code]
var
  ISCustomPage1: TWizardPage;
  NewGroupBox1: TNewGroupBox;
  NewStaticText1: TNewStaticText;
  NewEdit1: TNewEdit;
  NewStaticText2: TNewStaticText;
  NewEdit2: TNewEdit;
  NewStaticText3: TNewStaticText;
  NewEdit3: TNewEdit;
  NewStaticText4: TNewStaticText;
  NewEdit4: TNewEdit;
  NewStaticText5: TNewStaticText;
  NewEdit5: TNewEdit;

procedure RedesignWizardForm;
begin
  ISCustomPage1 := CreateCustomPage(wpSelectDir, CustomMessage('Caption'), CustomMessage('Description'));

  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

  NewGroupBox1 := TNewGroupBox.Create(WizardForm);
  with NewGroupBox1 do
  begin
    Name := 'NewGroupBox1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(8);
    Width := ScaleX(377);
    Height := ScaleY(209);
    Caption := CustomMessage('SettingsProfile');
  end;

  NewStaticText1 := TNewStaticText.Create(WizardForm);
  with NewStaticText1 do
  begin
    Name := 'NewStaticText1';
    Parent := NewGroupBox1;
    Caption := CustomMessage('Operator');
    Left := ScaleX(32);
    Top := ScaleY(31);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit1 := TNewEdit.Create(WizardForm);
  with NewEdit1 do
  begin
    Name := 'NewEdit1';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(28);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText2 := TNewStaticText.Create(WizardForm);
  with NewStaticText2 do
  begin
    Name := 'NewStaticText2';
    Parent := NewGroupBox1;
    Caption := CustomMessage('UserName');
    Left := ScaleX(32);
    Top := ScaleY(57);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit2 := TNewEdit.Create(WizardForm);
  with NewEdit2 do
  begin
    Name := 'NewEdit2';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(53);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText3 := TNewStaticText.Create(WizardForm);
  with NewStaticText3 do
  begin
    Name := 'NewStaticText3';
    Parent := NewGroupBox1;
    Caption := CustomMessage('Password');
    Left := ScaleX(32);
    Top := ScaleY(80);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit3 := TNewEdit.Create(WizardForm);
  with NewEdit3 do
  begin
    Name := 'NewEdit3';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(77);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText4 := TNewStaticText.Create(WizardForm);
  with NewStaticText4 do
  begin
    Name := 'NewStaticText4';
    Parent := NewGroupBox1;
    Caption := CustomMessage('NumberDial');
    Left := ScaleX(32);
    Top := ScaleY(103);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit4 := TNewEdit.Create(WizardForm);
  with NewEdit4 do
  begin
    Name := 'NewEdit4';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(100);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText5 := TNewStaticText.Create(WizardForm);
  with NewStaticText5 do
  begin
    Name := 'NewStaticText5';
    Parent := NewGroupBox1;
    Caption := CustomMessage('APN');
    Left := ScaleX(32);
    Top := ScaleY(127);
    Width := ScaleX(100);
    Height := ScaleY(14);
  end;

  NewEdit5 := TNewEdit.Create(WizardForm);
  with NewEdit5 do
  begin
    Name := 'NewEdit5';
    Parent := NewGroupBox1;
    Left := ScaleX(136);
    Top := ScaleY(124);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := '';
  end;

  NewStaticText1.TabOrder := 0;
  NewEdit1.TabOrder := 1;
  NewStaticText2.TabOrder := 2;
  NewEdit2.TabOrder := 3;
  NewStaticText3.TabOrder := 4;
  NewEdit3.TabOrder := 5;
  NewStaticText4.TabOrder := 6;
  NewEdit4.TabOrder := 7;
  NewStaticText5.TabOrder := 8;
  NewEdit5.TabOrder := 9;

  NewGroupBox1.TabOrder := 0;
end;

procedure CreateNetworkCfg;
begin
    SaveStringToFile(
        ExpandConstant('{app}\NetworkCfg.xml'),
        '<?xml version="1.0" encoding="UTF-8"?>'#13#10 +
        '<AllNetworkConfigs>'#13#10#9 +
        '<NetworkConfig isNDIS="0" canbeDelete="1" isPreferred="1">'#13#10#9#9 +
        '<ConfigFileName>' + NewEdit1.Text + '</ConfigFileName>'#13#10#9#9 +
        '<UserName>' + NewEdit2.Text + '</UserName>'#13#10#9#9 +
        '<Password>' + NewEdit3.Text + '</Password>'#13#10#9#9 +
        '<LoginNumber>' + NewEdit4.Text + '</LoginNumber>'#13#10#9#9 +
        '<AutoGetAPN>0</AutoGetAPN>'#13#10#9#9 +
        '<APN>' + NewEdit5.Text + '</APN>'#13#10#9#9 +
        '<AutoGetDNS>1</AutoGetDNS>'#13#10#9#9 +
        '<MainDNS>0.0.0.0</MainDNS>'#13#10#9#9 +
        '<StandbyDNS>0.0.0.0</StandbyDNS>'#13#10#9#9 +
        '<AutoGetPDP>1</AutoGetPDP>'#13#10#9#9 +
        '<PDPAddress>0.0.0.0</PDPAddress>'#13#10#9#9 +
        '<PDPType>IP</PDPType>'#13#10#9#9 +
        '<AuthType>PAP</AuthType>'#13#10#9#9 +
        '<AskUserAndPwd>0</AskUserAndPwd>'#13#10#9#9 +
        '<SaveUserAndPwd>0</SaveUserAndPwd>'#13#10#9 +
        '</NetworkConfig>'#13#10 +
        '</AllNetworkConfigs>'
        , False
    );
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
    Result := True;
    case CurPageID of
        ISCustomPage1.ID: CreateNetworkCfg;
    end;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;


Johny777 13-06-2012 14:55 1933491

Открыл для себя классное решение при использовании скина!
при закрытии окна на секунду появляется виндовсовские границы окна, что не есть красиво:


поэтому в процедуре деинициализации использую Sleep и Hide
код:

читать дальше »
Код:

procedure DeinitializeSetup;
begin
  if Initialize then
  begin
    WizardForm.Hide; /// или с формой Autorun.Hide;
    Sleep(200); 
    ShowWindow(WizardForm.Handle,0);
    UnloadSkin();
  end;
end;


при сокрытии формы (Hide) вин-границы окна не появляется, а окно плавно исчезает
но если сразу после сокрытия выгружать библиотеку, то вин-границы всё же видно
поэтому у нас есть ещё и Sleep (у меня настройка на 200 миллисекунд)
в итоге библиотека выгружается так же некрасиво, но мы этого уже не видим ! :grin:

Мелочь, но классная

два наглядных примера на основе Авторана в архиве http://sendfile.su/613062

El Sanchez 13-06-2012 17:18 1933579

Цитата:

Цитата Неадекватный
При первой инсталляции не работает не создаёт XML, если установить поверх ещё раз то XML создаётся. В чём может быть ошибка? »

Неадекватный, пардон, я тестировал сохранение не в {app}. Конечно же, при первой установке папки {app} еще не существует, сохранять нужно позже, поэтому вместо блока функции NextButtonClick напишите:
Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssPostInstall: CreateNetworkCfg;
  end;
end;


91892823 13-06-2012 18:49 1933647

Здравствуйте!
Мне интересен вопрос более высокой скорости распаковки.. Что-то читал за Фриарк, но не совсем понял. Как же ускорить процесс распаковки? Возможно ли использовать какие-либо библиотеки для ускорения процесса распаковки? Или какими методами достичь этого? Прошу расписать в деталях! Заранее благодарю всех, кто поможет.

Ivan_009 13-06-2012 20:08 1933682

91892823, Используй IsDone там все подробно расписано... :)

Johny777 13-06-2012 20:20 1933689

91892823,
От себя замечу, что скорость распаковки зависит от степени сжатия (у медали две стороны)
ты должен найти компромисс между нужным размером сжатого архива и нужной скоростью распаковки того самого архива
если такой компромисс не найден, то тебе придётся смириться с медленной распаковкой или сравнительно большим размером архива

В инно тоже при максимальном сжатии распаковка занимает хорошее время
особо пока не тестировал, но если приписать ко всем строкам секции Files флаг solidbreak, то при незначительном
увеличении размера конечного инстлла скорость извлечения вроде как выше
( это нужно проверить )

моё мнение:
если игра влезает на двухслойный DVD и при этом никак не сжимается до ёмкости однослойного, то и не стоить особо напрягаться ужимая 7.5 гигов до 5 или 6 :)

Неадекватный 13-06-2012 23:47 1933767

Привет всем!
Подскажите пожалуйста люди добрые, как сделать так чтобы не копировался файл если выбран другой?

Код
Код:

[Files]
Source: Config,1.ini; DestDir: {app}; Check: not CoonfCheck
Source: Config,2.ini; DestDir: {app}; Check: CoonfCheck

[*Code]
var
  MyPage: TWizardPage;
  MyCheckBox: TNewCheckBox;

procedure MyForm;
begin
  MyPage := CreateCustomPage(wpWelcome, 'Caption', 'Description');
  with MyPage.Surface do
  begin
    Name := 'Automatic';
  end;
 
  MyCheckBox := TNewCheckBox.Create(WizardForm);
  with MyCheckBox do
  begin
    Name := 'Automatic';
    Parent := MyPage.Surface;
    Left := ScaleX(32);
    Top := ScaleY(24);
    Width := ScaleX(97);
    Height := ScaleY(17);
  end;

  MyCheckBox.TabOrder := 0;
end;

procedure InitializeWizard();
begin
  MyForm;
end;

El Sanchez, Благодарствую, работает отлично.

YURSHAT 14-06-2012 04:29 1933845

Цитата:

Цитата Dark_Delphin
Подскажите код, чтобы картинка (PNG) вылазила за пределы инсталлятора и не было фона? »

скрпит который на скрине тут лежит http://forum.ru-board.com/topic.cgi?...&limit=1&m=6#1

Johny777 14-06-2012 11:41 1933974

Цитата:

Цитата Неадекватный
как сделать так чтобы не копировался файл если выбран другой »

тебе не хватало функции возвращающей True/False строкам секциям Files
вот такой, завязанной на Checked :
Код:

function CoonfCheck: Boolean;
begin
  Result := MyCheckBox.Checked;
end;

полностью:
читать дальше »
Код:

[Setup]
AppName=Name
AppVerName=Name
DefaultDirName={pf}\Name
compression=none

[Files]
Source: Config,1.ini; DestDir: {app}; Check: not CoonfCheck
Source: Config,2.ini; DestDir: {app}; Check: CoonfCheck

[  Code]
var
  MyPage: TWizardPage;
  MyCheckBox: TNewCheckBox;
 
function CoonfCheck: Boolean;
begin
  Result := MyCheckBox.Checked;
end;

procedure MyForm;
begin
  MyPage := CreateCustomPage(wpWelcome, 'Caption', 'Description');

  MyCheckBox := TNewCheckBox.Create(WizardForm);
  with MyCheckBox do
  begin
    Parent := MyPage.Surface;
    SetBounds(ScaleX(32), ScaleY(24), ScaleX(97), ScaleY(17));
  end;
end;

procedure InitializeWizard();
begin
  MyForm;
end;


Ivan_009 14-06-2012 13:31 1934063

Подскажите пожалуйста как на png картинку наложить jpg в примерах botva ничего непонятно заранее спасибо :unsure:

Johny777 14-06-2012 16:00 1934159

Ivan_009,
а может всё же фотошопом наложишь с прозрачностью или другими эффектами и сохранишь в одно png изображение?
и код короче будет и тебе проще

alert30 14-06-2012 17:05 1934195

Возможна такая реализация, чтобы типа к примеру, файлы-русификаторы копировался автоматом (после установки программ) в C:\Program Files\MyProgram или еще куда-то без каких-либо сторонних упаковщиков?

Johny777 14-06-2012 17:09 1934197

alert30,
не совсем понял
хочешь копировать внешние файлы из папки, что лежит рядом с инсталлом, в директорию установки?
если да, то используй флаг external
если папка опциональна и не всегда есть, то дополнительно флаг "пропустить, если источника нет" - skipifsourcedoesntexist

alert30 14-06-2012 17:17 1934200

Johny777
Цитата:

Цитата Johny777
хочешь копировать внешние файлы из папки, что лежит рядом с инсталлом, в директорию установки? »

Да.
Цитата:

Цитата Johny777
если да, то используй флаг external »

Если включу флаг, и как будет копировать? Там должно вписывать скрипт в путь назначения для копирования.

Johny777 14-06-2012 17:40 1934216

Цитата:

Цитата alert30
Если включу флаг, и как будет копировать »

да
Цитата:

Цитата alert30
Там должно вписывать скрипт в путь назначения для копирования. »

{app}, те куда задашь в DefaultDirName= или в эдите не странице выбора директории установки
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,пример,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Source: {src}\common\half-life 2 episode one\episodic\SAVE\*; DestDir: {app}\half-life 2 episode one\episodic\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs skipifsourcedoesntexist;
....снаружи\папка\папка\*(* - означает из этой папки всё) ; куда: в {app}(сам выбираешь в эдите пути)\папка\папка : Флаги : "внешний" "игнорировать версию" "обрабатывать каталоги в источнике" "создавать эти самые каталоги/подкаталоги в {app}" "пропускать (не выдавать ошибку) если источника, откуда копируем, нет"

Примечание: при копировании из внешней папки отображается прогресбар. Короче всё как и при распаковке

alert30 14-06-2012 18:15 1934233

Johny777, а-а-а, я протупил. :)
DestDir отвечает куда копировать. Все понятно.

Ivan_009 14-06-2012 18:31 1934251

Почему при использовании botva2p загрузка картинок проходит нормально но стоит нажать на кнопку отмена установки и выход так возникает звук ошибки....Вот код загрузки картинок.... :unsure:

Gnom_aka_Lexander 14-06-2012 18:52 1934263

Ivan_009, Проверь, есть у тебя такой момент?
Код:

procedure DeinitializeSetup;
begin
  gdipShutdown;
end;


Ivan_009 14-06-2012 18:59 1934270

Gnom_aka_Lexander, Спасибо большое :up как раз этот момент я упустил...

Ivan_009 16-06-2012 20:46 1935420

Подскажите пожалуйста как сдесь прописать чтобы музыка воспроизводилась...BASS_Init(ExpandConstant('{tmp}\*')) //Поиск по маске... :o

Johny777 16-06-2012 22:20 1935486

Ivan_009,
может так:
BASS_Init(ExpandConstant('{tmp}\*.mp3'))

попробуй

Raf-9600 18-06-2012 23:05 1936593

Ктонить может сделать так чтобы в коде на отображение комментария к компонентам, комментарий к первому компоненту различался на разных Windows? Ну грубо говоря нужно к одному описанию как-то присобачить правило MinVersion: 4.90.3000,4.0.1381; OnlyBelowVersion: 0,6.0.5999, а если у юзера другой Windows, чтобы отображалось другое описание.

Собстно код на описание компонентов:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: Version; Description: Версия; Flags: fixed; Types: full compact custom;
Name: Version\101; Description: 1.01; Flags: exclusive;
Name: Version\102; Description: 1.02; Flags: exclusive;
Name: Version\103; Description: 1.03; Flags: exclusive;
Name: Version\104; Description: 1.04; Flags: exclusive; Types: full;

[C0de]
var
  DRTF: TRichEditViewer;
 
 
procedure MemoKeyPress(Sender: TObject; var Key: Char);
begin
  Key := #0;
end;

procedure MemoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Key := 0;
end;

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Width := ScaleX(212);
  end;

  DRTF := TRichEditViewer.Create(WizardForm);
  with DRTF do
  begin
    Name := 'DRTF';
    Parent := WizardForm.SelectComponentsPage;
    Left := ScaleX(220);
    Top := WizardForm.ComponentsList.Top;
    Width := ScaleX(197);
    Height := WizardForm.ComponentsList.Height;
    Color := clMenu;
    ReadOnly := True;
    ScrollBars := ssVertical;
    Text := '';
    OnKeyDown := @MemoKeyDown;
    OnKeyPress := @MemoKeyPress;
  end;
  DRTF.TabOrder := 4;
end;

type
  TComponentDesc = record Description: String; Index: Integer; end;

var
  Descs: array of TComponentDesc;
  Indx: Integer;

procedure ShowDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var i: Integer;
begin
  Indx:=-1;
  for i:= 0 to GetArrayLength(Descs)-1 do begin
  if (Descs[i].Index=Index) then begin Indx:=i; Break end; end;
  if (Indx >=0)and(Area=iaItem) then DRTF.Text:= Descs[Indx].Description;
end;

procedure AddDescription(AIndex: Integer; ADescription: String);
var i, k: Integer;
begin
i:= GetArrayLength(Descs); SetArrayLength(Descs, i+1);
Descs[i].Description:= ADescription; Descs[i].Index:= AIndex-1
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
  WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription
 
  AddDescription(1, 'текст 1.');
  AddDescription(2, 'текст 2.');
  AddDescription(3, 'текст 3.');
  AddDescription(3, 'текст 4.');
 
end;


Johny777 19-06-2012 09:12 1936724

Raf-9600,
вот если бы кто-нибудь подкинул код на определение версии винды через код, то думаю можно б было так сделать
Код:

procedure InitializeWizard();
begin
 ... 
  if  версия такоя then AddDescription(1, 'при такой версии') else (те др. версия) AddDescription(1, 'описание при другой версии') ;
...
end;


nik1967 19-06-2012 12:19 1936832

Raf-9600,
типа так?
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: Version; Description: Версия; Flags: fixed; Types: full compact custom;
Name: Version\101; Description: 1.01; Flags: exclusive;
Name: Version\102; Description: 1.02; Flags: exclusive;
Name: Version\103; Description: 1.03; Flags: exclusive;
Name: Version\104; Description: 1.04; Flags: exclusive; Types: full;

[ Code]
var
  DRTF: TRichEditViewer;
 
 
procedure MemoKeyPress(Sender: TObject; var Key: Char);
begin
  Key := #0;
end;

procedure MemoKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  Key := 0;
end;

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Width := ScaleX(212);
  end;

  DRTF := TRichEditViewer.Create(WizardForm);
  with DRTF do
  begin
    Name := 'DRTF';
    Parent := WizardForm.SelectComponentsPage;
    Left := ScaleX(220);
    Top := WizardForm.ComponentsList.Top;
    Width := ScaleX(197);
    Height := WizardForm.ComponentsList.Height;
    Color := clMenu;
    ReadOnly := True;
    ScrollBars := ssVertical;
    Text := '';
    OnKeyDown := @MemoKeyDown;
    OnKeyPress := @MemoKeyPress;
  end;
  DRTF.TabOrder := 4;
end;

type
  TComponentDesc = record Description: String; Index: Integer; end;

var
  Descs: array of TComponentDesc;
  Indx: Integer;
  Version: TWindowsVersion;

procedure ShowDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var i: Integer;
begin
  Indx:=-1;
  for i:= 0 to GetArrayLength(Descs)-1 do begin
  if (Descs[i].Index=Index) then begin Indx:=i; Break end; end;
  if (Indx >=0)and(Area=iaItem) then DRTF.Text:= Descs[Indx].Description;
end;

procedure AddDescription(AIndex: Integer; ADescription: String);
var i, k: Integer;
begin
  i:= GetArrayLength(Descs); SetArrayLength(Descs, i+1);
  Descs[i].Description:= ADescription; Descs[i].Index:= AIndex-1;
end;

function needversion():boolean;
var Version: TWindowsVersion;
begin
  GetWindowsVersionEx (Version);
  Result:= (Version.Major = 6) and (Version.Minor = 0) and (Version.Build = 5999);
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
  WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription;
if needversion then AddDescription(2, 'текст 1.') else AddDescription(2, 'текст 1.1');
  AddDescription(3, 'текст 2.');
  AddDescription(4, 'текст 3.');
  AddDescription(5, 'текст 4.');
end;


Raf-9600 19-06-2012 12:52 1936863

Цитата:

Цитата nik1967
типа так? »

Что-то там не так, ибо и под WinXP и под Win7 одно и то же описание =\

nik1967 19-06-2012 12:57 1936867

Цитата:

Цитата Raf-9600
Что-то там не так, ибо и под WinXP и под Win7 одно и то же описание =\ »

Правильно, ты сам просил версию OnlyBelowVersion: 0,6.0.5999 - я так и сделал. Чтобы определял Win7, нужно изменить строчку
Код:

Result:= (Version.Major = 6) and (Version.Minor = 0) and (Version.Build = 5999);
на
Код:

Result:= (Version.Major = 6) and (Version.Minor = 1);
Ибо
Код:

Windows versions:

4.0.950    Windows 95
4.0.1111  Windows 95 OSR 2 & OSR 2.1
4.0.1212  Windows 95 OSR 2.5
4.10.1998  Windows 98
4.10.2222  Windows 98 Second Edition
4.90.3000  Windows Me

Windows NT versions:

4.0.1381  Windows NT 4.0
5.0.2195  Windows 2000
5.1.2600  Windows XP
or Windows XP 64-Bit Edition Version 2002 (Itanium)
5.2.3790  Windows Server 2003
or Windows XP x64 Edition (AMD64/EM64T)
or Windows XP 64-Bit Edition Version 2003 (Itanium)
6.0.6000  Windows Vista
6.0.6001  Windows Vista with Service Pack 1
or Windows Server 2008
6.1.7600  Windows 7
or Windows Server 2008 R2
6.1.7601  Windows 7 with Service Pack 1
or Windows Server 2008 R2 with Service Pack 1
6.2.8102  Windows 8 Developer Preview


Ivan_009 20-06-2012 11:34 1937469

Как сделать данную область прозрачной, чтобы был только текст... :search: Заранее спасибо за помощь...

Johny777 20-06-2012 12:41 1937508

Ivan_009,
либо используй юникодную версию инно
либо создавай рядом с неименованным чекбоксом лейбл, прозрачный, и при нажатии на него нажимай на чекбокс
потом пример дам в этом сообщении
цвет надписи меняется при наведении на чекбокс?

есть ещё вариант
отбей привычку создавать контролы на картинках и делай их рядом или снизу и ещё где
меня например твоя проблемка ни разу ещё не тревожила :)

вот пример:
сделал при наведении, но не уверен что работает
о вот с "поставить/снять" галку вроде всё в порядке!
читать дальше »
Код:

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

[ code]
var
  Label1: TLabel;
  Label_CheckBox: TNewCheckBox;

procedure LabelOnEnter(Sender: TObject);
begin
  Label_CheckBox.OnEnter;
end;

procedure LabelOnClick(Sender: TObject);
begin
  if Label_CheckBox.Checked = True then
  begin
    Label_CheckBox.Checked := False;
    Exit;
  end;
 
  if Label_CheckBox.Checked = False then
  begin
    Label_CheckBox.Checked := True;
    Exit;
  end;
end;


procedure InitializeWizard();
begin

  { Label1 }
  Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Parent := WizardForm;
    Caption := 'название чекбокса';
    Transparent := True;
    OnClick := @LabelOnClick;
    OnMouseEnter := @LabelOnEnter;
    SetBounds(ScaleX(56),ScaleY(332),ScaleX(96),ScaleY(13));
  end;

  with WizardForm.WizardBitmapImage do
  begin
    Parent := WizardForm;
  end;

  { Label_CheckBox }
  Label_CheckBox := TNewCheckBox.Create(WizardForm);
  with Label_CheckBox do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(40),ScaleY(328),ScaleX(17),ScaleY(17));
    Caption := '';
  end;
 
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;


Ivan_009 20-06-2012 13:16 1937523

Johny777, А это как убрать :o

nik1967 20-06-2012 13:30 1937533

Ivan_009, уменьши размеры чекбокса.

Johny777 20-06-2012 14:02 1937545

Ivan_009,
лейбл можно сделать безымянным
так же можно убрать функцию при наведении
вот используй обновлённый пример


читать дальше »

Код:

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

[ code]
var
  Label_CheckBox: TNewCheckBox;


procedure LabelOnClick(Sender: TObject);
begin
  case Label_CheckBox.Checked of
    False:
      begin
        Label_CheckBox.Checked := True;
        Exit;
      end;
    True:
      begin
        Label_CheckBox.Checked := False;
        Exit;
      end;
  end;
end;


procedure InitializeWizard();
begin

  with WizardForm do
  begin
    OuterNotebook.Hide
    with WizardBitmapImage do
    begin
      Parent := WizardForm;
      Align := alClient;
      Stretch := True
    end;
  end;

  Label_CheckBox := TNewCheckBox.Create(WizardForm);
  with Label_CheckBox do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(40),ScaleY(328),ScaleX(12),ScaleY(12));
    Caption := '';
  end;

  with TLabel.Create(WizardForm) do
  begin
    Parent := WizardForm;
    Caption := 'название чекбокса';
    Transparent := True;
    OnClick := @LabelOnClick;
    SetBounds(Label_CheckBox.Left + Label_CheckBox.Width + ScaleX(4),Label_CheckBox.Top - ScaleY(1),ScaleX(96),ScaleY(12));
    Font.Color := clWhite;
  end;
 
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;



если несколько чкебоксов с неименными лейблами, то используй Tag := у лейблов

Ivan_009 20-06-2012 14:22 1937552

Johny777, У меня вопрос а почему при выделении установить дополнительное ПО при отказе установки все равно оно устанавливается.... :o Код:

Johny777 20-06-2012 14:30 1937555

У тебя Ваня, насколько я вижу всё правильно
чекбокс точно не отмечен?
меня только смущает, что на шаге на котором ПО ставится отмену нажать нельзя (если только ты не юзаешь всякие библиотеки или коды, чтоб можно было)
вижу незнакомый мне IsDoneUnpack(CurStep)
может его тоже нужно отменять в процедуре отмены, чтоб до него не доходило

Ivan_009 20-06-2012 16:21 1937610

Johny777, IsDoneUnpack(CurStep) это от IsDone код.... :drug: Можно как нибудь переделать...

nik1967 20-06-2012 19:25 1937708

Цитата:

Цитата Ivan_009
почему при выделении установить дополнительное ПО при отказе установки все равно оно устанавливается »

Попробуй так
Код:

If Label_CheckBox.Checked and not CheckError then begin

Ivan_009 20-06-2012 19:33 1937715

nik1967, Все равно устанавливается :( вот код

nik1967 20-06-2012 19:49 1937722

Ivan_009, тогда так
Код:

if (CurStep = ssPostInstall) and not ISDoneError then begin
If Label_CheckBox.Checked then begin
---------------


insombia 20-06-2012 19:54 1937731

почему то линия стала кривой http://i39.fastpic.ru/big/2012/0620/...17e1ca91f0.jpg
полосы не видно

Johny777 20-06-2012 23:57 1937887

insombia,
эдит пути перекрывается лейблом
тут одно из 2-х

1. Этот лейбл родной. Ты просто своё сообщение вставил. Родной лейбл не поддерживает прозрачность и потому перекрывает. Поэтому уменьши его размер по вертикали
так : Height := ScaleY(15);
или так (я ж не знаю как ты координаты записываешь)
SetBounds(ScaleX(0), ScaleY(0), ScaleX(256), ScaleY(15))
..................слева ........сверху.........ширина.......высота

2. этот лейбл кастомный, те самопальный
поэтому поставь ему в совойствах прозрачность True
Transparent:= True;
и отправь на задний план
SendToBack;
но лучше уменьши по вертикали его размер

insombia 21-06-2012 11:36 1938057

del

t16bz 21-06-2012 15:50 1938259

Здравствуйте, возможно ли использовать iswin 7 на деинсталляторе?

El Sanchez 21-06-2012 16:36 1938282

Цитата:

Цитата t16bz
Здравствуйте, возможно ли использовать iswin 7 на деинсталляторе? »

t16bz, http://forum.ru-board.com/topic.cgi?...1&start=2300#6
Цитата:

Цитата Johny777
2. этот лейбл кастомный, те самопальный
поэтому поставь ему в совойствах прозрачность True
Transparent:= True;
и отправь на задний план
SendToBack; »

Johny777, TLabel не окно, его на задний/передний план никак.

Johny777 22-06-2012 14:39 1938766

El Sanchez,
у меня вопрос касательно мутекса
для деинсталятора (использую форму Autorun)
раскидал так

читать дальше »
Код:

[Setup]
AppMutex=MutexName



var
    hMutex: THandle;

function WINAPI_CreateMutex(lpMutexAttributes: Longint; bInitialOwner: BOOL; lpName: String): THandle; external 'CreateMutexA@kernel32.dll stdcall';
function ReleaseMutex(hMutex: THandle): BOOL; external 'ReleaseMutex@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';


procedure CreateAutoRun();   
begin
  hMutex := WINAPI_CreateMutex(0, False, '{#SetupSetting("AppMutex")}'); /// мутекс /// часть 2 из 3 /// начало
 ...
end;


procedure DeinitializeSetup;
begin
  AutoRun.Hide;
  UnloadSkin();
   

  ReleaseMutex(hMutex);
  CloseHandle(hMutex);
end;



если запущен деинсталятор и я запускаю основной инсталл, то вылетает месседж бокс "Ок/Отмена"
если запущен основной инсталл и потом запустить деинсталятор, то этого месседж бокса нет

скажи пожалуйста как его добавить

El Sanchez 22-06-2012 17:23 1938911

Цитата:

Цитата Johny777
если запущен деинсталятор и я запускаю основной инсталл, то вылетает месседж бокс "Ок/Отмена"
если запущен основной инсталл и потом запустить деинсталятор, то этого месседж бокса нет »

Johny777, не знаю, что ты там сделал, по коду этого не видно, но ругань работает в обоих случаях. Пример для наглядности:
читать дальше »

Код:

[Setup]
AppMutex=ggghhhgggfxgxdfgzdfg

[code]
function WINAPI_CreateMutex(lpMutexAttributes: Longint; bInitialOwner: BOOL; lpName: String): Longint; external 'CreateMutexA@kernel32.dll stdcall';
function ReleaseMutex(hMutex: Longint): BOOL; external 'ReleaseMutex@kernel32.dll stdcall';
function CloseHandle(hObject: Longint): BOOL; external 'CloseHandle@kernel32.dll stdcall';

var
    hMutex: Longint;

procedure InitializeWizard();
begin
    hMutex := WINAPI_CreateMutex(0, False, ExpandConstant('{#SetupSetting("AppMutex")}'));
end;

procedure DeinitializeSetup();
begin
    ReleaseMutex(hMutex);
    CloseHandle(hMutex);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    case CurUninstallStep of
        usUninstall: begin
            with TForm.Create(nil) do  //it's my own uninstaller form
            begin
                UninstallProgressForm.Hide;
                SetBounds(0, 0, 200, 100);
                ShowModal;
            end;
        end;
    end;
end;


Johny777 22-06-2012 18:16 1938933

El Sanchez,

в твоём примере мутекс освобождается по завершении работы инсталла и форма деинсталятора создаётся в procedure CurUninstallStepChanged
этот вариант отличный
для него хватило бы и родного (уже делал так)
Setup
AppMutex=ggghhhgggfxgxdfgzdfg
...
CreateMutex('ggghhhgggfxgxdfgzdfg');
у меня была задумка перенести деинсталятор в основной скрипт, но с этим я обломался,
вот наработка
читать дальше »
Код:

procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload';

var
    Delete_Form: TSetupForm;




function InitializeUninstall(): Boolean;
var
  hl2_Checkbox, ep1_Checkbox, ep2_Checkbox, portal_Checkbox: TCheckBox;


begin
  FileCopy(ExpandConstant('{app}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), False);
  FileCopy(ExpandConstant('{app}\steam.cjstyles'), ExpandConstant('{tmp}\steam.cjstyles'), False);

  begin
    LoadSkinU(ExpandConstant('{tmp}\steam.cjstyles'), '');
    Delete_Form := CreateCustomForm();
    with Delete_Form do
    begin
      Position := poScreenCenter;
      ClientWidth := ScaleX(500);
      ClientHeight := ScaleY(500);
      Color := clBtnFace;
      DeleteMenu(GetSystemMenu(Delete_Form.Handle,False), $F060,0); /// ñäåëàòü êíîïêó "çàêðûòü" íåàêòèâíîé
      SetClassLong(Delete_Form.Handle, -26, GetClassLong(Delete_Form.Handle, -26) or $200); /// áëîêèðîâêà êîìáèíàöèè alt + f4
      SendMessage(Delete_Form.Handle, $0080, 0, LoadImage(0,ExpandConstant('{tmp}')+'\LIcon.ico',1,16,16,$1010));  /// èêîíêà â óãëó
    end;

    with TButton.Create(Delete_Form) do
    begin
      Parent := Delete_Form;
      Caption := ExpandConstant(SetupMessage(msgButtonNo));
      SetBounds(ScaleX(3), ScaleY(100), ScaleX(71), ScaleY(25));
      ModalResult:= mrCancel;
    end;
   
    with TButton.Create(Delete_Form) do
    begin
        Caption := ExpandConstant(SetupMessage(msgButtonYes));
        Parent := Delete_Form;
        SetBounds(ScaleX(80), ScaleY(100), ScaleX(71), ScaleY(25));
        ModalResult := mrYes;
    end;

    hl2_Checkbox := TCheckBox.Create(Delete_Form);
    with hl2_Checkbox do
    begin
      Parent := Delete_Form;
      Caption := 'hl2';
      SetBounds(ScaleX(80), ScaleY(127), ScaleX(80), ScaleY(15));
      Checked := False;
      Enabled := FileExists(ExpandConstant('{app}\common\half-life 2\hl2.exe'));
    end;

    ep1_Checkbox := TCheckBox.Create(Delete_Form);
    with ep1_Checkbox do
    begin
      Parent := Delete_Form;
      Caption := 'ep1';
      SetBounds(ScaleX(80), hl2_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
      Checked := False;
      Enabled := FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe'));
    end;

    ep2_Checkbox := TCheckBox.Create(Delete_Form);
    with ep2_Checkbox do
    begin
      Parent := Delete_Form;
      Caption := 'ep2';
      SetBounds(ScaleX(80), ep1_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
      Checked := False;
      Enabled := FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe'));
    end;

    portal_Checkbox := TCheckBox.Create(Delete_Form);
    with portal_Checkbox do
    begin
      Parent := Delete_Form;
      Caption := 'portal';
      SetBounds(ScaleX(80), ep2_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
      Checked := False;
      Enabled := FileExists(ExpandConstant('{app}\common\portal\hl2.exe'));
    end;
  end;


  case
    Delete_Form.ShowModal() of
    mrNo :
      begin
        UnloadSkinU();
        Delete_Form.Free;
      end;

    mrYes :
    begin
      if hl2_Checkbox.Checked = true then
      begin
        DelTree(ExpandConstant('{app}\common\half-life 2'), True, True, True)
        DeleteFile(ExpandConstant('{app}\half-life 2 buka russian.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 2007 base content.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 content.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 game dialog.gcf'));
        DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));

        SetIniString('Installed', 'hl2', '', ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'AuroraB', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'hl2_ru', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'hl2_ru_buka', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'hl2_en', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'hl2_ru_en', '', ExpandConstant('{app}\uninstall\parameters.ini'));
      end;

      if ep1_Checkbox.Checked = true then
      begin
        DelTree(ExpandConstant('{app}\common\half-life 2 episode one'), True, True, True)
        DeleteFile(ExpandConstant('{app}\episode one 2007 content.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 episode one.gcf'));
        DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2 Episode One.lnk'));

        SetIniString('Installed', 'ep1', '', ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'ep1_ru', '', ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'ep1_en', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'ep1_ru_en', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
      end;

      if ep2_Checkbox.Checked = true then
      begin
        DelTree(ExpandConstant('{app}\common\half-life 2 episode two'), True, True, True)
        DeleteFile(ExpandConstant('{app}\episode two content.gcf'));
        DeleteFile(ExpandConstant('{app}\episode two maps.gcf'));
        DeleteFile(ExpandConstant('{app}\episode two materials.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 episode two english.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 episode two russian.gcf'));
        DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2 Episode Two.lnk'));

        SetIniString('Installed', 'ep2', '', ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'ep2_ru', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'ep2_en', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'ep2_ru_en', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
      end;

      if portal_Checkbox.Checked = true then
      begin
        DelTree(ExpandConstant('{app}\common\portal'), True, True, True);
        DeleteFile(ExpandConstant('{app}\portal content.gcf'));
        DeleteFile(ExpandConstant('{app}\portal english.gcf'));
        DeleteFile(ExpandConstant('{app}\portal russian.gcf'));
        DeleteFile(ExpandConstant('{userdesktop}\Portal.lnk'));

        SetIniString('Installed', 'portal', '', ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'portal_ru', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'portal_en', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
        SetIniString('Installed', 'portal_ru_en', '',  ExpandConstant('{app}\uninstall\parameters.ini'));
      end;


            //

      if  not(FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe'))) and
          not(FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe'))) then

          begin
            DeleteFile(ExpandConstant('{app}\episode 1 shared.gcf'));
            DeleteFile(ExpandConstant('{app}\episodic 2007 shared.gcf'));
            DeleteFile(ExpandConstant('{app}\half-life 2 episode one russian.gcf'));
          end;

      if  not(FileExists(ExpandConstant('{app}\common\half-life 2\hl2.exe'))) and
          not(FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe'))) and
          not(FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe'))) then

            DeleteFile(ExpandConstant('{app}\half-life 2_russian.gcf'));
            //
      if  not(FileExists(ExpandConstant('{app}\common\half-life 2\hl2.exe'))) and
          not(FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe'))) and
          not(FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe'))) and
          not(FileExists(ExpandConstant('{app}\common\portal\hl2.exe'))) then

          begin
            DelTree(ExpandConstant('{userprograms}\Source Engine 15'), True, True, True);
            UnloadSkinU();
            Delete_Form.Free;
            Result := True;
          end;
    end;
  end;
end;


не смог в конце Case Yes, если нет всех четырёх экзешников не дать появиться стандартным:
1 месседжбокс "Вы уверены, что хотите удалить "да/Нет""
2 Создание UninstallProgressForm
короче как в параметре VERYSILIENT для деинсталятора, хотя месседж бокс в самом конце с текстом "Приложение полностью удалено" не помешал бы

поэтому, как изначально задумывалось
деинсталятор это отдельно скомпилированная программа (отдельный скрипт),
которая копируется вместе с остальными файлами во время установки в app\uninstall
вот так в основном инсталле
читать дальше »
Код:

Files
Source: uninstall\Setup\Uninstall.exe; DestDir: {app}\uninstall; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension solidbreak;


Code

procedure CurStepChanged(CurStep: TSetupStep);


begin
  case CurStep of
    ssInstall :
    begin
      ...

        if FileExists(ExpandConstant('{app}\uninstall\unins000.exe')) then DeleteFile(ExpandConstant('{app}\uninstall\unins000.exe'));
        if FileExists(ExpandConstant('{app}\uninstall\unins007.dat')) then DeleteFile(ExpandConstant('{app}\uninstall\unins007.dat'));
        if FileExists(ExpandConstant('{app}\uninstall\unins007.exe')) then DeleteFile(ExpandConstant('{app}\uninstall\unins007.exe'));


...

    ssDone :
    begin

            if FileExists(ExpandConstant('{app}\uninstall\unins000.exe')) then RenameFile(ExpandConstant('{app}\uninstall\unins000.exe'), ExpandConstant('{app}\uninstall\unins007.exe'));
            if FileExists(ExpandConstant('{app}\uninstall\unins000.dat')) then RenameFile(ExpandConstant('{app}\uninstall\unins000.dat'), ExpandConstant('{app}\uninstall\unins007.dat'));
            if FileExists(ExpandConstant('{app}\uninstall\Uninstall.exe')) then RenameFile(ExpandConstant('{app}\uninstall\Uninstall.exe'), ExpandConstant('{app}\uninstall\unins000.exe'));

            SetFileAttributes(PChar(ExpandConstant('{app}\uninstall\unins007.exe')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
            SetFileAttributes(PChar(ExpandConstant('{app}\uninstall\unins007.dat')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);


те подменяю созданный автоматом родной инсталл, на свой, который = форма , а родной запускается так (в конце процедуры Uninstall переменная типа Boolean, которая, если Тру даёт команду на запуск родного в очень тихом режиме, в конце деинициализации )
Цитата:

Цитата El Sanchez
не знаю, что ты там сделал, по коду этого не видно »

вот код самой последней версии деинсталятора (вариант на форме)
читать дальше »
Код:

#define MyAppName "Uninstall"

[Setup]
AppId=proto15
SourceDir=.
OutputDir=C:\Program Files (x86)\Source Engine 15\uninstall
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false
//SetupIconFile=hl2.ico
//BitmapResource=bgnd:orangebox.bmp
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no
BitmapResource=bgnd:Cremator2.bmp
AppMutex=Mutex_proto15


[CustomMessages]
ru.Cremator=дворник Альянса
en.Cremator=A Combine janitor of sorts

ru.remove=ему подмести?
en.remove=should he sweep?

ru.Save=или сначала
en.Save=would you like to

ru.Save_Btn=сохранишь ?
en.Save_Btn=save ?

en.rem=sweep
ru.rem=смести


[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl
Name: en; MessagesFile: compiler:Languages\English.isl

[Files]
Source: ISSkin.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: steam.cjstyles; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: icon.ico; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[ Code]
////////////////////////////////////////////////////////////////////////
var
  AutoRun: TForm;
  ResultCode: Integer;
  hl2_Checkbox, ep1_Checkbox, ep2_Checkbox, portal_Checkbox: TCheckBox;
  ExitButton, UninstallButton: TButton;
  SaveBtn: TNewSpeedButton;
  Delete_All: Boolean;
/// мутекс /// часть 1 из 3 /// начало

var
    hMutex: THandle;

function WINAPI_CreateMutex(lpMutexAttributes: Longint; bInitialOwner: BOOL; lpName: String): THandle; external 'CreateMutexA@kernel32.dll stdcall';
function ReleaseMutex(hMutex: THandle): BOOL; external 'ReleaseMutex@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
/// конец


/// тень окна /// начало
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint; external 'SetClassLongA@user32 stdcall';
/// конец
function LoadImage(hInst: THandle; ImageName: PChar; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle; external 'LoadImageA@user32.dll stdcall delayload';  /// иконка на папку часть 1

////////// скин /// часть 1 из 2 /// начало
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';



/////////// таскать окно за любую область /// начало
type
  TANewStatic = record
  Static  : TNewStaticText;
end;

var
  ANewStatic : array of TANewStatic;

function ReleaseCapture(): Longint; external 'ReleaseCapture@user32.dll stdcall';

procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(AutoRun.Handle,$0112,$F012,0)
end;

procedure AddStaticToArray(st:TNewStaticText);
var
    i:integer;
begin
  i:=GetArrayLength(ANewStatic);
  SetArrayLength(ANewStatic,i+1);
  ANewStatic[i].Static:=st;
  ANewStatic[i].Static.OnMouseDown:=@MouseDown;
end;

procedure StaticChange(c:TWinControl);
var
  i:integer;
begin
  for i:=0 to c.ControlCount-1 do
  if c.Controls[i] is TWinControl then
  begin
    if c.Controls[i] is TNewStaticText then AddStaticToArray(TNewStaticText(c.Controls[i]));
    if TWinControl(c.Controls[i]).ControlCount>0 then StaticChange(TWinControl(c.Controls[i]));
  end;
end;
/// конец
//////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////

procedure Unstall(Sender: TObject);
begin
  Delete_All := False;
 
  if hl2_Checkbox.Checked = true then
  begin
    DelTree(ExpandConstant('{src}\..\common\half-life 2'), True, True, True)
    DeleteFile(ExpandConstant('{src}\..\half-life 2 buka russian.gcf'));
    DeleteFile(ExpandConstant('{src}\..\half-life 2 2007 base content.gcf'));
    DeleteFile(ExpandConstant('{src}\..\half-life 2 content.gcf'));
    DeleteFile(ExpandConstant('{src}\..\half-life 2 game dialog.gcf'));
    DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));

    SetIniString('Installed', 'hl2', '', ExpandConstant('{src}\parameters.ini'));
    SetIniString('Installed', 'AuroraB', '',  ExpandConstant('{src}\parameters.ini'));
    SetIniString('Installed', 'hl2_ru', '',  ExpandConstant('{src}\parameters.ini'));
    SetIniString('Installed', 'hl2_ru_buka', '',  ExpandConstant('{src}\parameters.ini'));
    SetIniString('Installed', 'hl2_en', '',  ExpandConstant('{src}\parameters.ini'));
    SetIniString('Installed', 'hl2_ru_en', '', ExpandConstant('{src}\parameters.ini'));
  end;

  if ep1_Checkbox.Checked = true then
  begin
    DelTree(ExpandConstant('{src}\..\common\half-life 2 episode one'), True, True, True)
    DeleteFile(ExpandConstant('{src}\..\episode one 2007 content.gcf'));
    DeleteFile(ExpandConstant('{src}\..\half-life 2 episode one.gcf'));
    DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2 Episode One.lnk'));

    SetIniString('Installed', 'ep1', '', ExpandConstant('{src}\uninstall\parameters.ini'));
    SetIniString('Installed', 'ep1_ru', '', ExpandConstant('{src}\uninstall\parameters.ini'));
    SetIniString('Installed', 'ep1_en', '',  ExpandConstant('{src}\uninstall\parameters.ini'));
    SetIniString('Installed', 'ep1_ru_en', '',  ExpandConstant('{src}\uninstall\parameters.ini'));
  end;

  if ep2_Checkbox.Checked = true then
  begin
    DelTree(ExpandConstant('{src}\..\common\half-life 2 episode two'), True, True, True)
    DeleteFile(ExpandConstant('{src}\..\episode two content.gcf'));
    DeleteFile(ExpandConstant('{src}\..\episode two maps.gcf'));
    DeleteFile(ExpandConstant('{src}\..\episode two materials.gcf'));
    DeleteFile(ExpandConstant('{src}\..\half-life 2 episode two english.gcf'));
    DeleteFile(ExpandConstant('{src}\..\half-life 2 episode two russian.gcf'));
    DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2 Episode Two.lnk'));

    SetIniString('Installed', 'ep2', '', ExpandConstant('{src}\uninstall\parameters.ini'));
    SetIniString('Installed', 'ep2_ru', '',  ExpandConstant('{src}\uninstall\parameters.ini'));
    SetIniString('Installed', 'ep2_en', '',  ExpandConstant('{src}\uninstall\parameters.ini'));
    SetIniString('Installed', 'ep2_ru_en', '',  ExpandConstant('{src}\uninstall\parameters.ini'));
  end;

  if portal_Checkbox.Checked = true then
  begin
    DelTree(ExpandConstant('{src}\..\common\portal'), True, True, True);
    DeleteFile(ExpandConstant('{src}\..\portal content.gcf'));
    DeleteFile(ExpandConstant('{src}\..\portal english.gcf'));
    DeleteFile(ExpandConstant('{src}\..\portal russian.gcf'));
    DeleteFile(ExpandConstant('{userdesktop}\Portal.lnk'));

    SetIniString('Installed', 'portal', '', ExpandConstant('{src}\uninstall\parameters.ini'));
    SetIniString('Installed', 'portal_ru', '',  ExpandConstant('{src}\uninstall\parameters.ini'));
    SetIniString('Installed', 'portal_en', '',  ExpandConstant('{src}\uninstall\parameters.ini'));
    SetIniString('Installed', 'portal_ru_en', '',  ExpandConstant('{src}\uninstall\parameters.ini'));
  end;
   

    if  not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode one\hl2.exe'))) and
        not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode two\hl2.exe'))) then

    begin
      DeleteFile(ExpandConstant('{src}\..\episode 1 shared.gcf'));
      DeleteFile(ExpandConstant('{src}\..\episodic 2007 shared.gcf'));
      DeleteFile(ExpandConstant('{src}\..\half-life 2 episode one russian.gcf'));
    end;


    if  not(FileExists(ExpandConstant('{src}\..\common\half-life 2\hl2.exe'))) and
        not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode one\hl2.exe'))) and
        not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode two\hl2.exe'))) then

      DeleteFile(ExpandConstant('{src}\..\half-life 2_russian.gcf'));
               
               
    if  not(FileExists(ExpandConstant('{src}\..\common\half-life 2\hl2.exe'))) and
        not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode one\hl2.exe'))) and
        not(FileExists(ExpandConstant('{src}\..\common\half-life 2 episode two\hl2.exe'))) and
        not(FileExists(ExpandConstant('{src}\..\common\portal\hl2.exe'))) then

      begin
        DelTree(ExpandConstant('{userprograms}\Source Engine 15'), True, True, True);
        Delete_All := True;
      end;

  AutoRun.Close;
 
end;

procedure Run_SAVE(Sender: TObject);
begin
  if ActiveLanguage = 'en' then Exec(ExpandConstant('{src}\SAVE.exe'), '/LANG=English', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
  if ActiveLanguage = 'ru' then Exec(ExpandConstant('{src}\SAVE.exe'), '/LANG=Russian', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;

///////////////////////////////////////////////////////////

procedure CreateAutoRun();
var
  Save_Label: TLabel;
   
begin
  hMutex := WINAPI_CreateMutex(0, False, '{#SetupSetting("AppMutex")}'); /// мутекс /// часть 2 из 3 /// начало

  AutoRun := TForm.Create(nil);
  with AutoRun do
  begin
    BorderStyle := bsDialog;
    SetClassLong(AutoRun.Handle, (-26), GetWindowLong(AutoRun.Handle, (-26)) or $00020000); //тень окна
    Position := poScreenCenter;
    Caption := 'Uninstall';
    ClientWidth := ScaleX(634);
    ClientHeight := ScaleY(586);
       
    with TBitmapImage.Create(AutoRun) do
    begin
      Parent := AutoRun;
      Bitmap.LoadFromResourceName(HInstance, '_IS_BGND');
      SetBounds(ScaleX(0), ScaleY(0), ScaleX(640), ScaleY(586));
      Hint := ExpandConstant('{cm:Cremator}');
      ShowHint := True
      ParentShowHint := False;
      OnMouseDown := @MouseDown;
    end;
       
    Save_Label := Tlabel.Create(AutoRun)
    with Save_Label do
    begin
      Left := ScaleX(400);
      Top := ScaleY(27);
      AutoSize := True;
      Caption := ExpandConstant('{cm:remove}');
      Font.Color := clWindowText;
      Font.Height := -16;
      Font.Name := 'Tahoma';
      ParentFont := False;
      Transparent := False;
      Parent := AutoRun;
      Font.Color := $48c1ca;
    end;
       
    with Tlabel.Create(AutoRun) do
    begin
      SetBounds(ScaleX(460), ScaleY(50), ScaleX(270), ScaleY(16));
      AutoSize := False;
      Caption := ExpandConstant('{cm:Save}');
      Transparent := True;
      WordWrap := True;
      Parent := AutoRun;
      Font.Color := $48c1ca;
      Font.Size := 8;
    end;
       
    with Tlabel.Create(AutoRun) do
    begin
      SetBounds(ScaleX(343), ScaleY(0), ScaleX(297), ScaleY(586));
      AutoSize := False;
      Caption := '';
      Transparent := True;
      Parent := AutoRun;
      OnMouseDown := @MouseDown;
    end;
  end;

    ///

  ExtractTemporaryFile('icon.ico');
  SendMessage(AutoRun.Handle, $0080, 0, LoadImage(0,ExpandConstant('{tmp}')+'\icon.ico',1,16,16,$1010));

    ///
   
  UninstallButton := TButton.Create(AutoRun);
  with UninstallButton do
  begin
    Parent := AutoRun;
    SetBounds(ScaleX(500), ScaleY(527), ScaleX(69), ScaleY(23));
    Cursor := crHand;
    Caption := ExpandConstant(SetupMessage(msgButtonYes));
    OnClick := @Unstall;
  end;

  ExitButton := TButton.Create(AutoRun);
  with ExitButton do
  begin
    Parent := AutoRun;
    SetBounds(UninstallButton.Left - UninstallButton.Width - ScaleX(16), UninstallButton.Top, UninstallButton.Width, UninstallButton.Height);
    Caption := ExpandConstant(SetupMessage(msgButtonNo));;
    Cursor := crHand;
    ModalResult := mrCancel;
  end;


  SaveBtn := TNewSpeedButton.Create(AutoRun);
  with SaveBtn do
  begin
    Parent := AutoRun;
    if ActiveLanguage = 'ru' then SetBounds(Save_Label.Left + Save_Label.Width + ScaleX(20), Save_Label.Top + ScaleY(19), ScaleX(73), ScaleY(20));
    if ActiveLanguage = 'en' then SetBounds(Save_Label.Left + Save_Label.Width + ScaleX(20), Save_Label.Top + ScaleY(19), ScaleX(40), ScaleY(20));
    Caption := ExpandConstant('{cm:Save_Btn}');
    OnClick := @Run_SAVE;
    Enabled := FileExists(ExpandConstant('{src}\SAVE.exe'));
    ThemeEnabled := False;
    Style := nsbButton;
    Font.Size := 8;
    Font.Color := $48c1ca;
  end;
   

  hl2_Checkbox := TCheckBox.Create(AutoRun);
  with hl2_Checkbox do
  begin
    Parent := AutoRun;
    Caption := ExpandConstant('{cm:rem}');
    SetBounds(UninstallButton.Left, ScaleY(127), ScaleX(80), ScaleY(15));
    Checked := False;
    Enabled := FileExists(ExpandConstant('{src}\..\common\half-life 2\hl2.exe'));
  end;

  ep1_Checkbox := TCheckBox.Create(AutoRun);
  with ep1_Checkbox do
  begin
    Parent := AutoRun;
    Caption := ExpandConstant('{cm:rem}');
    SetBounds(UninstallButton.Left, hl2_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
    Checked := False;
    Enabled := FileExists(ExpandConstant('{src}\..\common\half-life 2 episode one\hl2.exe'));
  end;

  ep2_Checkbox := TCheckBox.Create(AutoRun);
  with ep2_Checkbox do
  begin
    Parent := AutoRun;
    Caption := ExpandConstant('{cm:rem}');
    SetBounds(UninstallButton.Left, ep1_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
    Checked := False;
    Enabled := FileExists(ExpandConstant('{src}\..\common\half-life 2 episode two\hl2.exe'));
  end;

  portal_Checkbox := TCheckBox.Create(AutoRun);
  with portal_Checkbox do
  begin
    Parent := AutoRun;
    Caption := ExpandConstant('{cm:rem}');
    SetBounds(UninstallButton.Left, ep2_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
    Checked := False;
    Enabled := FileExists(ExpandConstant('{src}\..\common\portal\hl2.exe'));
  end;

  AutoRun.Repaint;
  AutoRun.ShowModal;
end;

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('steam.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\steam.cjstyles'), '');
  CreateAutoRun();
  Result := False;
end;

procedure DeinitializeSetup;
begin
  AutoRun.Hide;
  Sleep(200);
  UnloadSkin();
    /// мутекс /// часть 3 из 3 /// начало
  ReleaseMutex(hMutex);
  CloseHandle(hMutex);
    /// конец
  if Delete_All = True then Exec(ExpandConstant('{src}\unins007.exe'),'/VERYSILENT','', SW_SHOW, ewNoWait, ResultCode);
end;


если нужно с файлам, то выложу :)

с этим удалением (у этого кода) и отсутствует месседжбокс при конфликте мутекса,
те код который у тебя в примере выполняется у меня в деинсталяторе, но без месседжбокса не дающего ему, деинсталятору, запуститься
в основном скрипте я товй код пока не использую
там стоит просто
Setup
AppMutex=ggghhhgggfxgxdfgzdfg
...
CreateMutex('ggghhhgggfxgxdfgzdfg');

================================================== нашёл
procedure CreateAutoRun();

begin
if CheckForMutexes('{#SetupSetting("AppMutex")}') then MsgBox('Мутекс', mbError, MB_ICONINFORMATION ); /// мутекса ещё нет и месседжбокса не будет
hMutex := WINAPI_CreateMutex(0, False, '{#SetupSetting("AppMutex")}'); создаём мутекс
if CheckForMutexes('{#SetupSetting("AppMutex")}') then MsgBox('Мутекс', mbError, MB_ICONINFORMATION ); /// появляется месседж бокс
думаю мутекс так и надо создавать в InitializeWizard, а проверку делать в InitializeSetup
буду разбирать!

alert30 23-06-2012 12:24 1939247

Некоторые инсталляторы (хоть из оригинального, и из диска) в середине установки может выполнять приложения, скрипты, исполняемые файлы и пр. Вот как бы это сделать? Выполнение приложения не после установки, а в середине установки; то что уже распаковалось в папку назначения.

R.i.m.s.k.y. 23-06-2012 12:31 1939253

alert30, почитать в хелпе / поискать в теме про CurStepChanged и CurPageChanged

Johny777 23-06-2012 12:43 1939257

alert30,
вот пример подобных действий
вместо блокнота можно запустить архив с параметрами и извлечь куда надо
(библиотеки для примера лежат, как файлы)
можно ещё и к позиции прогрессбара прикрутить, но не думаю, что это правильно
делал так со звуками (ну чтоб говорило 10%, 20%...), но дело в том, что позиция скажем на середине может быть там секунды две
поэтому файлы начинали проигрываться несколько раз
в пример в архиве (или коде ниже) действие после распаковки какого-то файла (а это намного лучше)
если тебе нужно запустить архив ближе к началу установки или концу, то из справки мы узнаём о том, что файлы извлекаются в том порядке в котором записаны
в секции, а удаляются в обратном
те ты можешь прикинуть где лучше и после какого файла извлечь, чтоб достичь желаемого результата

код:
читать дальше »
Код:

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg

[Files]
Source: 1.dll; DestDir: {app}; AfterInstall: Patch()
Source: 2.dll; DestDir: {app}; AfterInstall: Patch()

[  Code]
procedure Patch;
var
  ResultCode: Integer;
begin
  case ExtractFileName(ExpandConstant(CurrentFileName)) of
    '1.dll': begin
              if Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
                MsgBox('Hello.', mbInformation, MB_OK);
              if ResultCode=0 then WizardForm.CancelButton.OnClick(nil);
            end;
    '2.dll': if Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
              MsgBox('Hello 2.', mbInformation, MB_OK);
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=False;
end;



наглядный пример в архиве:

alert30 23-06-2012 12:47 1939258

Johny777, да, спасибо, уже нашел.

El Sanchez 23-06-2012 15:07 1939326

Johny777, держи, это писать в основном коде, код деинсталлятора не нужен.
читать дальше »

Код:

#define MyAppName "test"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
UninstallIconFile=icon.ico
AppMutex=testmutex
BitmapResource=unins:Cremator_poster.bmp

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl
Name: en; MessagesFile: compiler:Default.isl

[CustomMessages]
ru.Cremator=äâîðíèê Àëüÿíñà
en.Cremator=A Combine janitor of sorts

ru.remove=åìó ïîäìåñòè?
en.remove=should he sweep?

ru.Save=èëè ñíà÷àëà
en.Save=would you like to

ru.Save_Btn=ñîõðàíèøü ?
en.Save_Btn=save ?

en.rem=sweep
ru.rem=ñìåñòè

[Files]
Source: steam.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}

[code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
function WINAPI_CreateMutex(lpMutexAttributes: Longint; bInitialOwner: BOOL; lpName: String): THandle; external 'CreateMutexA@kernel32.dll stdcall';
function ReleaseMutex(hMutex: THandle): BOOL; external 'ReleaseMutex@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

var
    UninstallForm: TSetupForm;
    Save_Label: TLabel;
    hl2_Checkbox, ep1_Checkbox, ep2_Checkbox, portal_Checkbox: TCheckBox;
    ExitButton, UninstallButton: TButton;
    ResultCode: Integer;
    hMutex: THandle;

procedure InitializeWizard();
begin
    //create installer mutex
    hMutex := WINAPI_CreateMutex(0, False, ExpandConstant('{#SetupSetting("AppMutex")}'));
   
    //skin
    ExtractTemporaryFile('steam.cjstyles');
    LoadSkin(ExpandConstant('{tmp}\steam.cjstyles'), '');
end;

procedure Run_SAVE(Sender: TObject);
begin
    if ActiveLanguage = 'en' then Exec(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\SAVE.exe'), '/LANG=English', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
    if ActiveLanguage = 'ru' then Exec(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\SAVE.exe'), '/LANG=Russian', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
end;

function CreateUninstallForm: Integer;
begin
    UninstallForm := CreateCustomForm;
    with UninstallForm do
    begin
        BorderStyle := bsSingle;
        BorderIcons := [biSystemMenu,biMinimize];
        Position := poScreenCenter;
        Caption := 'Uninstall';
        ClientWidth := ScaleX(634);
        ClientHeight := ScaleY(586);

        //unins background bitmap image
        with TBitmapImage.Create(nil) do
        begin
            Parent := UninstallForm;
            Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS');
            SetBounds(ScaleX(0), ScaleY(0), ScaleX(640), ScaleY(586));
            Hint := ExpandConstant('{cm:Cremator}');
            ShowHint := True;
            ParentShowHint := False;
        end;

        //should he sweep label
        Save_Label := TLabel.Create(nil);
        with Save_Label do
        begin
            Parent := UninstallForm;
            Left := ScaleX(400);
            Top := ScaleY(27);
            AutoSize := True;
            Caption := ExpandConstant('{cm:remove}');
            Font.Color := clWindowText;
            Font.Height := -16;
            Font.Name := 'Tahoma';
            ParentFont := False;
            Transparent := False;
            Font.Color := $48c1ca;
        end;

        //would you like to label
        with TLabel.Create(nil) do
        begin
            Parent := UninstallForm;
            SetBounds(ScaleX(460), ScaleY(50), ScaleX(270), ScaleY(16));
            AutoSize := False;
            Caption := ExpandConstant('{cm:Save}');
            Transparent := True;
            WordWrap := True;
            Font.Color := $48c1ca;
            Font.Size := 8;
        end;

        //uninstall button
        UninstallButton := TButton.Create(nil);
        with UninstallButton do
        begin
            Parent := UninstallForm;
            SetBounds(ScaleX(500), ScaleY(527), ScaleX(69), ScaleY(23));
            Cursor := crHand;
            Caption := SetupMessage(msgButtonYes);
            ModalResult := mrOk;
        end;

        //exit button
        ExitButton := TButton.Create(nil);
        with ExitButton do
        begin
            Parent := UninstallForm;
            SetBounds(UninstallButton.Left - UninstallButton.Width - ScaleX(16), UninstallButton.Top, UninstallButton.Width, UninstallButton.Height);
            Caption := SetupMessage(msgButtonNo);
            Cursor := crHand;
            ModalResult := mrCancel;
        end;

        //save button
        with TNewSpeedButton.Create(nil) do
        begin
            Parent := UninstallForm;
            if ActiveLanguage = 'ru' then SetBounds(Save_Label.Left + Save_Label.Width + ScaleX(20), Save_Label.Top + ScaleY(19), ScaleX(73), ScaleY(20));
            if ActiveLanguage = 'en' then SetBounds(Save_Label.Left + Save_Label.Width + ScaleX(20), Save_Label.Top + ScaleY(19), ScaleX(40), ScaleY(20));
            Caption := ExpandConstant('{cm:Save_Btn}');
            Enabled := FileExists(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\SAVE.exe'));
            ThemeEnabled := False;
            Style := nsbButton;
            Font.Size := 8;
            Font.Color := $48c1ca;
            OnClick := @Run_SAVE;
        end;

        //hl2 checkbox
        hl2_Checkbox := TCheckBox.Create(nil);
        with hl2_Checkbox do
        begin
            Parent := UninstallForm;
            Caption := ExpandConstant('{cm:rem}');
            SetBounds(UninstallButton.Left, ScaleY(127), ScaleX(80), ScaleY(15));
            Checked := False;
            Enabled := FileExists(ExpandConstant('{app}\common\half-life 2\hl2.exe'));
        end;

        //ep1 checkbox
        ep1_Checkbox := TCheckBox.Create(nil);
        with ep1_Checkbox do
        begin
            Parent := UninstallForm;
            Caption := ExpandConstant('{cm:rem}');
            SetBounds(UninstallButton.Left, hl2_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
            Checked := False;
            Enabled := FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe'));
        end;

        //ep2 checkbox
        ep2_Checkbox := TCheckBox.Create(nil);
        with ep2_Checkbox do
        begin
            Parent := UninstallForm;
            Caption := ExpandConstant('{cm:rem}');
            SetBounds(UninstallButton.Left, ep1_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
            Checked := False;
            Enabled := FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe'));
        end;

        //portal checkbox
        portal_Checkbox := TCheckBox.Create(nil);
        with portal_Checkbox do
        begin
            Parent := UninstallForm;
            Caption := ExpandConstant('{cm:rem}');
            SetBounds(UninstallButton.Left, ep2_Checkbox.Top + ScaleY(116), ScaleX(70), ScaleY(15));
            Checked := False;
            Enabled := FileExists(ExpandConstant('{app}\common\portal\hl2.exe'));
        end;
        Result := ShowModal;
    end;
end;

function Unstall(): Boolean;
begin
    Result := False;

    //del hl2
    if hl2_Checkbox.Checked then
    begin
        DelTree(ExpandConstant('{app}\common\half-life 2'), True, True, True);
        DeleteFile(ExpandConstant('{app}\half-life 2 buka russian.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 2007 base content.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 content.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 game dialog.gcf'));
        DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));

        SetIniString('Installed', 'hl2', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'AuroraB', '',  ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'hl2_ru', '',  ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'hl2_ru_buka', '',  ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'hl2_en', '',  ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'hl2_ru_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
    end;

    //del ep1
    if ep1_Checkbox.Checked then
    begin
        DelTree(ExpandConstant('{app}\common\half-life 2 episode one'), True, True, True);
        DeleteFile(ExpandConstant('{app}\episode one 2007 content.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 episode one.gcf'));
        DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2 Episode One.lnk'));

        SetIniString('Installed', 'ep1', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'ep1_ru', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'ep1_en', '',  ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'ep1_ru_en', '',  ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
    end;

    //del ep2
    if ep2_Checkbox.Checked then
    begin
        DelTree(ExpandConstant('{app}\common\half-life 2 episode two'), True, True, True);
        DeleteFile(ExpandConstant('{app}\episode two content.gcf'));
        DeleteFile(ExpandConstant('{app}\episode two maps.gcf'));
        DeleteFile(ExpandConstant('{app}\episode two materials.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 episode two english.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 episode two russian.gcf'));
        DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2 Episode Two.lnk'));

        SetIniString('Installed', 'ep2', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'ep2_ru', '',  ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'ep2_en', '',  ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'ep2_ru_en', '',  ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
    end;

    //del portal
    if portal_Checkbox.Checked then
    begin
        DelTree(ExpandConstant('{app}\common\portal'), True, True, True);
        DeleteFile(ExpandConstant('{app}\portal content.gcf'));
        DeleteFile(ExpandConstant('{app}\portal english.gcf'));
        DeleteFile(ExpandConstant('{app}\portal russian.gcf'));
        DeleteFile(ExpandConstant('{userdesktop}\Portal.lnk'));

        SetIniString('Installed', 'portal', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'portal_ru', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'portal_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
        SetIniString('Installed', 'portal_ru_en', '', ExpandConstant('{#SetupSetting("UninstallFilesDir")}\parameters.ini'));
    end;

    //del episodes gcf
    if not FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe')) and
    not FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe')) then
    begin
        DeleteFile(ExpandConstant('{app}\episode 1 shared.gcf'));
        DeleteFile(ExpandConstant('{app}\episodic 2007 shared.gcf'));
        DeleteFile(ExpandConstant('{app}\half-life 2 episode one russian.gcf'));
    end;

    //del russian hl2 gcf
    if not FileExists(ExpandConstant('{app}\common\half-life 2\hl2.exe')) and
    not FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe')) and
    not FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe')) then
        DeleteFile(ExpandConstant('{app}\half-life 2_russian.gcf'));

    //full uninstall
    if not FileExists(ExpandConstant('{app}\common\half-life 2\hl2.exe')) and
    not FileExists(ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe')) and
    not FileExists(ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe')) and
    not FileExists(ExpandConstant('{app}\common\portal\hl2.exe')) then
    begin
        MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#MyAppName}']), mbInformation, MB_OK);
        Result := True;
    end;

    //release deinstall mutex
    ReleaseMutex(hMutex);
    CloseHandle(hMutex);

    UninstallForm.Close;
end;

function InitializeUninstall(): Boolean;
begin
    Result := False;

    //skin
    if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\steam.cjstyles'), ExpandConstant('{tmp}\steam.cjstyles'), True) and
    FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True) then
        LoadSkinU(ExpandConstant('{tmp}\steam.cjstyles'), '');

    if not UninstallSilent then
    begin
        Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ResultCode);
        Exit;
    end;

    //check install mutex
    if CheckForMutexes(ExpandConstant('{#SetupSetting("AppMutex")}')) then
    begin
        MsgBox(FmtMessage(SetupMessage(msgUninstallAppRunningError), ['{#MyAppName}']), mbError, MB_OK);
        Exit;
    end;

    //create deinstall mutex
    hMutex := WINAPI_CreateMutex(0, False, ExpandConstant('{#SetupSetting("AppMutex")}'));

    if CreateUninstallForm = mrOk then Result := Unstall();
    UninstallForm.Free;
end;

procedure DeinitializeUninstall();
begin
    if FileExists(ExpandConstant('{tmp}\steam.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;

procedure DeinitializeSetup;
begin
    UnloadSkin();
    ReleaseMutex(hMutex);
    CloseHandle(hMutex);
end;


LinkOFF 24-06-2012 07:44 1939607

Здравствуйте. Извините что не по теме, но как настроить FreeArc чтоб максимально сжималось? А то у меня ОЗУ 16 гб а используется только 2 гб.

alert30 24-06-2012 08:17 1939611

LinkOFF, никак, только от без сжатия до ультры. Вроде говорят, как очень сжатый архиватор; это NanoZip.

t16bz 24-06-2012 13:16 1939673

Как называется окно выбора папки установки?

R.i.m.s.k.y. 24-06-2012 13:34 1939681

Цитата:

Цитата t16bz
Как называется окно выбора папки установки? »

я тебе точно не отвечу тк инно нет под рукой, но посмотреть названия можно:
1. В справке поищи описание CurPageChanged, там есть названия страниц
2. в расширенном инно в Inno Form Designer видны все названия окон и элементов с "родителями"

Ivan_009 24-06-2012 14:33 1939689

Как избавится от моргания картинок при переходе с одной странницы на другую :( пользуюсь b2p v0.3.9.2 от VoLT

t16bz 24-06-2012 14:38 1939690

R.i.m.s.k.y., мне нужно название не страница выбора папки установки, а окна, которое появляется при нажатии на кнопку "Обзор"

Johny777 24-06-2012 20:33 1939810

t16bz,
можно поинтересоваться зачем оно тебе?

появляется форма с TFolderTreeView, эдитом и двумя кнопками
в дизайнере это окно не редактируется

не хочу сморозить чушь, но вроде оно вообще не редактируется (разве что в исходном коде самой инно), но его можно воссоздать двумя способами
1. - самый простой - использовать встроенную функцию
function BrowseForFolder(const Prompt: String; var Directory: String; const NewFolderButton: Boolean): Boolean;
наглядный пример
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DirExistsWarning=no


[  Code]
procedure DirBrowseButtonOnClick(Sender: TObject);
var
  Dir: String;
begin
  if BrowseForFolder(SetupMessage(msgBrowseDialogLabel), Dir, False) then
    WizardForm.DirEdit.Text:=Dir + '\My Program'
end;

procedure InitializeWizard();
begin
  WizardForm.DirBrowseButton.OnClick:=@DirBrowseButtonOnClick
end;


жирным False отвечает за появление кнопки "создать папку" (False - нет кнопки, True - есть)

2. - рисовать свою форму и всё, что нужно на ней

Ivan_009 25-06-2012 17:32 1940299

Как добавить чекбокс "Не создавать папку в меню пуск" :sorry: подскажите кто знает заранее спасибо...

Johny777 25-06-2012 18:37 1940342

Ivan_009,

[Setup]
AllowNoIcons=yes или no

или тебе кастомный нужен?

Ivan_009 25-06-2012 18:46 1940348

Johny777, мне кастомный нужен :)

Johny777 25-06-2012 19:06 1940354

Цитата:

Цитата Ivan_009
мне кастомный нужен »

вот:
читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
EnableDirDoesntExistWarning=false


[Icons]
Name: {group}\Notepad; Filename: notepad.exe; Check:  not  Is_No_Ico_CheckBox_Checked

[code]
var
  No_Icons_CheckBox: TNewCheckBox;


function Is_No_Ico_CheckBox_Checked: Boolean;
begin
  Result := No_Icons_CheckBox.Checked;
end;


procedure No_Icons_CheckBox_OnClick(Sender: TObject);
begin
  with WizardForm do
  begin
    GroupEdit.Enabled := not TNewCheckBox(Sender).Checked;
    GroupBrowseButton.Enabled := not TNewCheckBox(Sender).Checked;
  end;
end;


procedure InitializeWizard();
begin

  { No_Icons_CheckBox }
  No_Icons_CheckBox := TNewCheckBox.Create(WizardForm);
  with No_Icons_CheckBox do
  begin
    Parent := WizardForm.SelectProgramGroupPage;
    SetBounds(ScaleX(32), ScaleY(168), ScaleX(200), ScaleY(17));
    Caption := SetupMessage(msgNoProgramGroupCheck2);
    OnClick :=@No_Icons_CheckBox_OnClick;
  end;
 
end;



если через код значки создаёшь (не через секцию [Icons]), то переделаю

Ivan_009 25-06-2012 19:14 1940360

Johny777, Респект и большое спасибо :clapping: :up

Yury_Prizrak 26-06-2012 18:04 1940923

Всем привет! Вопрос следующий(искал, чесно, чет не нашел - если было - плиз, дайте линку на ответ) - мне в инсталяции надо сделать чекбокс "полная версия" - его я сделал, а как "объяснить" инсталу, что если он не нажат - некоторые файлы устанавливать не надо? Т.е. есть например 5 файлов - 1 2 3 4 5, если чекбокс нажат - устанавливаем все, если нет - устанавливаем 1, 3, 4 а 2 и 5 нет. Заранее спасибо :)

detiedyatosla 27-06-2012 07:48 1941169

Вложений: 1
Помогите плз
Как это сделать прозрачным ?

bond07 27-06-2012 11:29 1941277

Парни, большая просьба.
Путь установки: "C:\Program Files\Games\Selena6000
В реестре это выглядит так:
[HKEY_LOCAL_MACHINE\SOFTWARE\BaseGame\FileSystem]
"DataPath"="C:\Program Files\Games\Selena6000"

После установки программы нужно заменить "\Selena6000" на "\SELENA~1/>;"
То есть поменять название конечной папки, прога иначе не работает. Выручайте!

Johny777 27-06-2012 11:29 1941278

Yury_Prizrak,
вот такой пример есть:
читать дальше »

Код:

[Setup]
AppName=Quake Live
AppVerName="Quake Live"
AppPublisher=Mio Dark Project
CreateAppDir=no

[Languages]
Name: ru; MessagesFile: compiler:Languages\Russian.isl;

[Types]
Name: "full"; Description: "Все компоненты";
Name: "custom"; Description: "Выбрать компоненты"; Flags:  iscustom

[Components]
Name: "main"; Description: "Cтандартные файлы Quake Live"; Types: full custom; Flags: fixed
Name: "main2"; Description: "Премиум файлы Quake Live"; Types: full custom;
Name: "plug"; Description: "Плагин Quake Live"; Types: full custom;
Name: "browser"; Description: "Портативный Firefox под Quake Live"; Types: full custom;
Name: "manual"; Description: "Руководство и Награды"; Types: full custom;
Name: "anti"; Description: "Античит PunkBuster"; Types: full custom;

[CustomMessages]
HeaderLabelPage=Выберите тип вашего аккаунта
MyRadioCaption_1=Standart
MyRadioCaption_2=Premium / Pro
PageTextHeader=На этой странице Вы можете выбрать тип вашего аккаунта, который вы используете в игре.
MyText_1=Будут установлены файлы которые доступны для игроков без подписки.
MyText_2=Будут установлены файлы которые доступны для игроков с Premium/Pro подпиской.


[code]
var
  MyNewPage: TWizardPage;
  MyRadioBtn:ArraY[0..1]of TNewRadioButton;

procedure GetInstType;
begin
  WizardForm.ComponentsList.ItemEnabled[1]:= MyRadioBtn[1].Checked or not MyRadioBtn[0].Checked;
  WizardForm.ComponentsList.Checked[1]:=MyRadioBtn[1].Checked or not MyRadioBtn[0].Checked;
  WizardForm.ComponentsList.Checked[4]:=MyRadioBtn[1].Checked or not MyRadioBtn[0].Checked;
end;

procedure GetInstTypePage;
var
  i:integer;
begin
  MyNewPage := CreateCustomPage(wpWelcome,
  ExpandConstant('{cm:HeaderLabelPage}'), '');

  with TNewStaticText.Create(WizardForm) do
  begin
    Width := WizardForm.InnerNotebook.Width;
    Height := ScaleY(26);
    WordWrap := True;
    Caption := ExpandConstant('{cm:PageTextHeader}');
    Parent := MyNewPage.Surface;
  end;

  for i:=0 to 1 do
  begin
    MyRadioBtn[i] := TNewRadioButton.Create(WizardForm);
    with MyRadioBtn[i] do
    begin
      Parent := MyNewPage.Surface;
      Top := ScaleY(50+i*70);
      Width := ScaleX(150);
      case i of
        0: begin
          Caption := ExpandConstant('{cm:MyRadioCaption_1}');
          Checked := True;
        end;
        1:Caption := ExpandConstant('{cm:MyRadioCaption_2}');
      end;
    end;

    with TNewStaticText.Create(WizardForm) do
    begin
      Parent := MyNewPage.Surface;
      SetBounds(ScaleX(16),ScaleY(68+i*70),WizardForm.InnerNotebook.Width - ScaleX(60),ScaleY(26));
      WordWrap := True;
      case i of
        0:Caption := ExpandConstant('{cm:MyText_1}');
        1:Caption := ExpandConstant('{cm:MyText_2}');
      end;
    end;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if (PageID <= wpSelectDir)
    and (PageID = wpReady)
      and (MyRadioBtn[1].Checked)
        then Result := True;
end;

procedure InitializeWizard();
begin
  GetInstTypePage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpSelectComponents then GetInstType;
end;


или на основе предыдущего, но попроще и как ты хотел
читать дальше »

Код:

#define MyAppName "test"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false


[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c; Description: 3;
Name: d; Description: 4;
Name: e; Description: 5;


[code]
var
  Page: TInputOptionWizardPage;

procedure InitializeWizard();
begin
  Page:= CreateInputOptionPage(wpSelectDir, 'тип установки', '', '', false, false);
        Page.Add('полная версия');
        WizardForm.TypesCombo.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectComponents then
  begin
    WizardForm.ComponentsList.ItemEnabled[1]:= Page.Values[0];
    WizardForm.ComponentsList.ItemEnabled[4]:= Page.Values[0];
  end;
end;



detiedyatosla,
никак
родные лейблы не поддерживают прозрачность
пересоздавай и используй прозрачность
http://forum.oszone.net/post-1937887-305.html

Yury_Prizrak 27-06-2012 13:24 1941391

Цитата:

Цитата Yury_Prizrak
Всем привет! Вопрос следующий(искал, чесно, чет не нашел - если было - плиз, дайте линку на ответ) - мне в инсталяции надо сделать чекбокс "полная версия" - его я сделал, а как "объяснить" инсталу, что если он не нажат - некоторые файлы устанавливать не надо? Т.е. есть например 5 файлов - 1 2 3 4 5, если чекбокс нажат - устанавливаем все, если нет - устанавливаем 1, 3, 4 а 2 и 5 нет. Заранее спасибо »

Все, с этим разобрался, извините. Возник другой вопрос - мне надо проверять была ли предустановлена эта программа(а точнее есть ли конфиг файл этой программы) и если нет - завершать установку. Думал сделать через function InitializeSetup() но есть одно но - ExpandConstant('{app}\Configuration\Config.xml') - в этот момент {app} еще не определен. Может что подскажете? Заранее спасибо :)

Johny777, я сделал все еще проще:
[code][Files]
Source: {#AppSrcPathAdmin}\1; DestDir: {app}; Flags: ignoreversion
Source: {#AppSrcPathAdmin}\2; DestDir: {app}; Flags: ignoreversion; Check: ServiceCheck
Source: {#AppSrcPathAdmin}\3; DestDir: {app}; Flags: ignoreversion
Source: {#AppSrcPathAdmin}\4; DestDir: {app}; Flags: ignoreversion
Source: {#AppSrcPathAdmin}\5; DestDir: {app}; Flags: ignoreversion; Check: ServiceCheck

Код:

//Функция проверки чекбокса сервиса
        function ServiceCheck: Boolean;
begin
  Result := ServiceCheckBox.Checked;
end;


Johny777 27-06-2012 13:43 1941407

Yury_Prizrak,

читать дальше »
Код:

#define MyAppName "test"

[Setup]
AppID=The_Best_AppID_Ever_Made
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\{#MyAppName}}

[Files]
Source: "config.xml"; DestDir: {app}\Configuration;

[Dirs]
Name: "{app}\Configuration"

[code]
function InitializeSetup:boolean;
var
  AppPath: string;

begin
    Result := True;
    AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}'));
    if FileExists(AppPath + '\Configuration\config.xml') then
    begin
      case MsgBox('Программа установлена и Файл config.xml там лежит. Продолжить?', mbError, MB_YESNO) of

        IDYES: Result := True;
     
        IDNO: Result := False;

      end;
    end;
end;


Yury_Prizrak 27-06-2012 14:07 1941420

Johny777, а нельзя без прописи в реестр? Т.е. у меня
DefaultDirName={pf}\test\test - и он все равно как то выковыривает значение папки при новой инсталляции...

rasim933 27-06-2012 16:24 1941494

Вроде не потеме: делаю репак игры. Обязательно доставать ключи реестра от игры? Нельзя добавить свои ключи?

R.i.m.s.k.y. 27-06-2012 19:26 1941601

Цитата:

Цитата bond07
Парни, большая просьба.
Путь установки: "C:\Program Files\Games\Selena6000
В реестре это выглядит так:
[HKEY_LOCAL_MACHINE\SOFTWARE\BaseGame\FileSystem]
"DataPath"="C:\Program Files\Games\Selena6000"
После установки программы нужно заменить "\Selena6000" на "\SELENA~1/>;"
То есть поменять название конечной папки, прога иначе не работает. Выручайте! »

Только нюанс, насколько я знаю ДОСовские проги надо сокращать всё: c:\progra~1\Games\Selena~1
Выручаю:

Код:

Root: HKLM; SubKey: SOFTWARE\BaseGame\FileSystem; ValueType: string; ValueName: DataPath; ValueData: {code:GetShortName|{app}\Selena6000}; Flags: uninsdeletekeyifempty uninsdeletevalue deletevalue noerror


Цитата:

Цитата rasim933
Вроде не потеме: »

да, не по теме
Цитата:

Цитата rasim933
Обязательно доставать ключи реестра от игры? »

да, обязательно
Цитата:

Цитата rasim933
Нельзя добавить свои ключи? »

можно, добавляй

Johny777 27-06-2012 23:57 1941740

Yury_Prizrak,
извини, но я не совсем врубаю чего тебе хочется
Цитата:

Цитата Yury_Prizrak
и он все равно как то выковыривает значение папки при новой инсталляции... »

так и будет
ставь хоть куда
Цитата:

Цитата Yury_Prizrak
а нельзя без прописи в реестр? »

можно конечно
вот так:
CreateUninstallRegKey=no
или так
Uninstallable=no
во втором случае деинсталятор не будет создаваться

в примере который я тебе дал при первой установке создаётся ключ реестра (ну и файл копируется соответственно)
по нему при повторном запуске находит путь инсталл
это выражается в эдите пути на странице выбора директории установки, те там будет путь туда, куда ты в прошлый раз установил (это можно и убрать, но смысл?. Тогда ставишь по новому в другую папку, а ищет в предыдущей в выдаёт сообщение)
и этот же путь считывается в процедуре инициализации, по этому пути ищет файл и выдаёт месседж бокс, если файл найден
ты хотел
Цитата:

Цитата Yury_Prizrak
проверять была ли предустановлена эта программа »

эта проверка есть
Цитата:

Цитата Yury_Prizrak
а точнее есть ли конфиг файл этой программы »

через ключ реестра сначала находим программу и там ищем файл. Реализовано
Цитата:

Цитата Yury_Prizrak
и если нет - завершать установку »

если файла нет и завершать, то это бред. Как же тогда его ставить?

Короче без ключа никак. Он всего один

или скажи поподробнее (на основе примера) как тебе нужно :). Скорее всего я тебя недопонял
там видно будет!

bond07 28-06-2012 05:03 1941813

Цитата:

Цитата R.i.m.s.k.y.
R.i.m.s.k.y. »

Спасибо, получилось:
ValueData: {code:GetShortName|{app}}/>

Raf-9600 28-06-2012 16:25 1942148

Можно ли сделать так, чтобы если выбран компонент Game\Pottable то в меню Пуск вообще не создавались ни ярлыки ни папки?

Johny777 28-06-2012 16:38 1942159

Raf-9600,

читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
DefaultGroupName=The_Most_Beautiful_Group_Name_Ever
EnableDirDoesntExistWarning=false

[Components]
Name: a; Description: portable;

[Icons]
Name: {group}\new\Notepad; Filename: notepad.exe; Check: not IsComponentSelected('a')


R.i.m.s.k.y. 28-06-2012 19:16 1942247

Raf-9600
Johny777
,
будь проще
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
DefaultGroupName=The_Most_Beautiful_Group_Name_Ever
EnableDirDoesntExistWarning=false

[Components]
Name: abc; Description: portable;

[Icons]
Components: not abc; Name: {group}\new\Notepad; Filename: notepad.exe;


Raf-9600 28-06-2012 21:57 1942335

А можно сделать чтобы если выбран компонент "abc", то инсталлятор начинал использовать эти параметры?
Код:

DisableProgramGroupPage=yes
AlwaysShowGroupOnReadyPage=no


R.i.m.s.k.y. 28-06-2012 22:08 1942342

Raf-9600, точно так же как в примерах выше

Raf-9600 29-06-2012 00:27 1942408

R.i.m.s.k.y., не получается =(
Код:

[Setup]
DisableProgramGroupPage=yes; Components=abc


Johny777 29-06-2012 01:19 1942430

Raf-9600,
страница пропускается так:
Код:

function  ShouldSkipPage(PageID: Integer): Boolean;
begin
  if PageID = wpSelectProgramGroup then Result := IsComponentSelected('a');
end;

а вот как удалить строки из ReadyMemo без понятия

R.i.m.s.k.y. 29-06-2012 08:41 1942510

Raf-9600,
Код:

[Setup]
DisableProgramGroupPage={code:IsComponentSelected('abc')}
//или
DisableProgramGroupPage={code:IsComponentSelected|'abc'}
//нет инно под рукой чтобы проверить

только нюанс: такой вызов должен быть после страницы компонентов, иначе инсталлер выдаст ошибку при выполнении
Порядок выполнения можно прочитать в справке по словам Installation order

Gnom_aka_Lexander 29-06-2012 09:10 1942522

Цитата:

Цитата R.i.m.s.k.y.
только нюанс: такой вызов должен быть после страницы компонентов »

Не обязательно. При запуске инсталла компоненты уже созданы. Вот с задачами - да, есть такая беда - они создаются только на странице задач и обращение к ним должно быть строге после страницы задач. Но в любом случае:
DisableProgramGroupPage=yes - обрабатывается по нажатию на кнопку далее перед страницей выбора папки, тоесть на странице компонентов.
AlwaysShowGroupOnReadyPage=no обрабатывается по нажатию на кнопку далее перед страницей готовности, поскольку текст PeadiMemo строится в момент перехода на страницу готовности.
Ну и нужно учитывать, что не все параметры в секции [Setup] позволяют управлять ими снаружи, многие являются настроечными на уровне компиляции и требуют однозначного ответа. тут уже только пробовать.

R.i.m.s.k.y. 29-06-2012 09:48 1942538

Цитата:

Цитата Gnom_aka_Lexander
Ну и нужно учитывать, что не все параметры в секции [Setup] позволяют управлять ими снаружи »

Это ясно-понятно.
К примеру с параметрами сжатия так не прокатит, а вот перезагрузкой снаружи в конце установки управлять вполне возможно

Raf-9600 29-06-2012 10:24 1942554

Цитата:

Цитата R.i.m.s.k.y.
Код:

[Setup] DisableProgramGroupPage={code:IsComponentSelected('abc')}
//или
DisableProgramGroupPage={code:IsComponentSelected|'abc'}

»

Не компилируеться =\

Ivan_009 29-06-2012 11:22 1942596

Как обьеденить 2 прогресс бара ssInstall и ssPostInstall в IsDone :search: заранее спасибо за помощь...

gmspy 29-06-2012 12:31 1942638

Доброго времени суток, помогите с решением такой задачи:
Как сделать перемещения (Архив содержит уже готовый setup файл софта + в директории есть папка).
Задача после установки софта инсталятор из своей корневой папки копировал в папку в которую установился софт.
Или 2рое решения как научить инсталятор качать файл с фтп или веб сервера и записывать в директорию устанавливаемой программы.

Johny777 29-06-2012 17:11 1942868

Raf-9600,
научился удалять строки из ReadyMemo, но он не удаляет строки типа "Тип установки"
сделал просто
если выбран компонент "Portable"(внутренне название port) и переходим на страницу готовности, то полностью очищаем мемо(!) и вносим свои строки, но без строки говорящей нам о создании папки в меню "Пуск"
короче как ты хотел :)

читать дальше »
Код:

[Setup]
AppName=Portable
VersionInfoVersion=5.0
AppVerName=Portable
DefaultDirName={pf}\Portable_Or_Not_Test
DefaultGroupName=The_Most_Beautiful_Group_Name_Ever


[Components]
Name: port; Description: Portable; Types: full custom;

[Icons]
Name: {group}\new\Notepad; Filename: notepad.exe; Components: not port

[code]
function  ShouldSkipPage(PageID: Integer): Boolean;
begin
  if PageID = wpSelectProgramGroup then Result := IsComponentSelected('port');
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if (CurPageID = wpReady) and (IsComponentSelected('port')) then
  begin
    with WizardForm.ReadyMemo do
    begin
      Clear;
      Lines.Add(SetupMessage(msgReadyMemoDir) + #13#10 +
                '      ' + WizardForm.DirEdit.Text + #13#10 +
                + #13#10 +
                SetupMessage(msgReadyMemoType) + #13#10 +
                '      ' + WizardForm.TypesCombo.Text)
    end;
  end;
end;



,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Цитата:

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

эту тему полистай
в сообщении El Sanchez

Raf-9600 29-06-2012 18:01 1942890

Johny777, полная очистка не подходит, потому что кроме Portable, компонентов будет дофига (которые можно выбрать вместе с Portable). И хотелось бы чтобы юзер знал что он понавыберал.
Может быть, возможно, удалить только определённую строчку? Хотя это наверно уже из разряда извращений.

Johny777 29-06-2012 18:06 1942892

Raf-9600,
смотри
if (CurPageID = wpReady) and (IsComponentSelected('port'))
если страница готовности и выбран компонент port
те для всех остальных компонентов не буден никаких действий с мемо на странице готовности если не выбран компонент port
дай мне список всех компонетов, которые выбираются с портабельной
там просто нужно строки вписывать и всё.
Цитата:

Цитата Raf-9600
удалить только определённую строчку »

писал выше почему не слелал этого
к тому же там строки по индексам
ну их. С одного компонента галку снимешь и номера опустятся или наооборот

Raf-9600 29-06-2012 18:40 1942907

Цитата:

Цитата Johny777
дай мне список всех компонетов, которые выбираются с портабельной »

Дело в том, что их 113 штук. Точно давать?

Вот несколько начальных:
Код:

[Components]               
Name: "Game"; Description: "{cm:TypeOfInstallation}"; Flags: disablenouninstallwarning;
Name: "Game\Full"; Description: "{cm:Game}"; Flags: exclusive disablenouninstallwarning; Types: full
Name: "Game\Pottable"; Description: "Портативная"; Flags: exclusive disablenouninstallwarning;
Name: "Game\Lokal"; Description: "{cm:OnlyLocalization}"; Flags: collapsed exclusive disablenouninstallwarning;
Name: "Game\Lokal\Backup"; Description: "{cm:backup}"; Flags: disablenouninstallwarning;


Johny777 29-06-2012 18:49 1942912

Raf-9600,
вот тебе пример как вносить строки в мемо в зависимости от выбора (надеюсь не накосячил с проверкой "выбран ли хоть один из компонентов")
разбирай

читать дальше »
Код:

[Setup]
AppName=Portable
VersionInfoVersion=5.0
AppVerName=Portable
DefaultDirName={pf}\Portable_Or_Not_Test
DefaultGroupName=The_Most_Beautiful_Group_Name_Ever


[Components]
Name: port; Description: Portable; Types: full custom;
Name: port\add1; Description: Patch_for_Portable; Types: full custom; Flags: exclusive;
Name: port\add2; Description: Portable_Rusian_Language; Types: full custom; Flags: exclusive;

Name: dr_port; Description: Another_Portable; Types: full custom;



[Icons]
Name: {group}\new\Notepad; Filename: notepad.exe; Components: not port

[code]
function  ShouldSkipPage(PageID: Integer): Boolean;
begin
  if PageID = wpSelectProgramGroup then Result := IsComponentSelected('port');
end;

procedure CurPageChanged(CurPageID: Integer);
var
  i: Integer;
 
begin
  if (CurPageID = wpReady) and (IsComponentSelected('port')) then
  begin
    with WizardForm.ReadyMemo do
    begin
      Clear;
      Lines.Add(SetupMessage(msgReadyMemoDir) + #13#10 +                     
                '      ' + WizardForm.DirEdit.Text + #13#10 +
                + #13#10 +
                SetupMessage(msgReadyMemoType) + #13#10 +
                '      ' + WizardForm.TypesCombo.Text);
      if WizardForm.ComponentsList.Checked[i] then /// если отмечен хоть один из компонентов
      begin
        Lines.Add('');  /// пустая строка
        Lines.Add(SetupMessage(msgReadyMemoComponents));  /// "Выбранные компоненты:"
       
        if IsComponentSelected('port') then Lines.Add('      ' + 'Portable'); /// если выбран компонет port, то добавить строку  '      '  - пробелы от левого края + 'описание компонента'
        if IsComponentSelected('port\add1') then Lines.Add('      ' + 'Patch_for_Portable');  /// по аналогии и дальше
        if IsComponentSelected('port\add2') then Lines.Add('      ' + 'Portable_Rusian_Language');
        if IsComponentSelected('dr_port') then Lines.Add('      ' + 'Another_Portable');
      end;
    end;
  end;
end;



И вообще ты уверен что есть люди которые читают страницу готовности ?

Raf-9600 29-06-2012 18:58 1942917

Цитата:

Цитата Johny777
Неужели есть люди которые читают страницу готовности ? »

Это дело вкуса. Когда у меня только-только появился компьютер, то я её читал.
Ну и если что, я не предполагал что для удаления той строчки придёться так извращаться :)

Цитата:

Цитата Johny777
вот тебе пример как вносить строки в мемо в зависимости от выбора (надеюсь не накосячил с проверкой "выбран ли хоть один из компонентов")
разбирай »

Всё работает. Благодарю

El Sanchez 29-06-2012 19:01 1942919

Johny777, Raf-9600, дабы покончить с извращениями, направляю обоих в нужном направлении:
Код:

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
begin
    if IsComponentSelected('portable') then
        Result := MemoComponentsInfo
    else
        Result := MemoDirInfo + NewLine + NewLine + MemoTypeInfo + NewLine + NewLine + MemoComponentsInfo + NewLine + NewLine + MemoGroupInfo;
end;


Johny777 29-06-2012 19:11 1942924

El Sanchez,
А что такое MemoTypeInfo и MemoDirInfo и откуда ты их взял? (часом не встроенные обозначения, которые используются только в WizardForm.ReadyMemo ?)

WizardForm.TypesCombo.Text и WizardForm.DirEdit.Text например понимаю хорошо в отличии от тех, что в твоей функции

Raf-9600 29-06-2012 19:15 1942927

El Sanchez, Спасибо!!! Я знал что должен быть элегантный способ! Теперь заодно уберу и ненужный MemoTypeInfo

R.i.m.s.k.y. 29-06-2012 19:17 1942928

El Sanchez, подскажи, пожалуйста
вроде же можно писать так
Код:

[Setup]
DisableProgramGroupPage={code:IsComponentSelected('abc')}
//или
DisableProgramGroupPage={code:IsComponentSelected|'abc'}

но вот у Raf-9600 не компилится а у меня нет инно под рукой чтобы проверить

El Sanchez 29-06-2012 20:44 1942981

Цитата:

Цитата Johny777
А что такое MemoTypeInfo и MemoDirInfo и откуда ты их взял? »

Johny777, выбранные тип и директория установки, отображаемых в ReadyMemo. Cм. в справке Pascal Scripting - Event Functions - UpdateReadyMemo.

Цитата:

Цитата R.i.m.s.k.y.
вроде же можно писать так »

R.i.m.s.k.y., нельзя. DisableProgramGroupPage имеет только 3 предустановленных значения auto, yes, or no. А подобная запись может встретиться только у 2 директив - Uninstallable
и CreateUninstallRegKey, понимающих булевы выражения. Делай, как Johny777 предложил - http://forum.oszone.net/post-1942430-347.html

Ivan_009 29-06-2012 22:20 1943048

Подскажите пожалуйста как загрузить скин на юникод версии инно :search:

Johny777 29-06-2012 23:58 1943106

Вань
качни отсюда http://isskin.codejock.com/visualstyles.asp инсталл
установи
в директории установки будут 2 библиотеки
1. ISSkin.dll

2. ISSkinU.dll
U от Unicode
вот её и используй (переименуй в ISSkin.dll и замени)

источник информации: http://krinkels.org/showthread.php?t=358&page=47

Ivan_009 30-06-2012 00:47 1943137

Johny777, меня интересует код для загрузки скина с обычным кодом для ANSI не пашет :( Все разобрался :gamer: спасибо :hi:

Yury_Prizrak 30-06-2012 15:17 1943336

Цитата:

Цитата Johny777
если файла нет и завершать, то это бред. Как же тогда его ставить »

Да, я немного некорректно сформулировал идею. Никак, в этом и смысл. Я пишу 2 инсталятора. 1-ый ставит программу - с кучей настроек и прочей ерунды, которую пользователь указывает. А вторая инсталяция - это апдейт. Т.е. там один раз нажать далее и один раз установить :) Соответственно если стартовая версия не поставлена то апдейт не станет. Как то так.
По поводу рееста - извините, сразу не разобрался.
{#SetupSetting("AppID")} - вот эта хрень у меня так и не заработала - выдает внутренее исключение - указал сразу жестко.

mariolast 02-07-2012 18:14 1944459

Кто о наверняка сталкивался...
Как в английской винде сделать так, чтобы инсталлятор на русском не крякозябрами показывал а нормальными буквами?
Окромя такого вот решения как здесь описано http://www.wylek.ru/forum/31-153-5718-16-1341169828
есть что то получше?

L1nk3R 03-07-2012 06:51 1944698

Вложений: 1
Привет. Кто подскажет как сделать рамочку как на http://forum.oszone.net/attachment.p...1&d=1341283641 скриншоте?
И второй вопрос. Есть два ключа реестра и один из них привязан к компоненту, как сделать чтоб если на компоненте галочка стоит то то второй не вносился а если снята то второй вносился а первый нет?

Johny777 03-07-2012 09:29 1944736

Цитата:

Цитата L1nk3R
И второй вопрос. »

L1nk3R, таким же макаром как здесь. Какая ссылка на тебя смотрит ту и выбирай :)
http://forum.oszone.net/post-1942159-340.html
http://forum.oszone.net/post-1942247-341.html

Цитата:

Цитата L1nk3R
как сделать рамочку »

это вероятнее всего панель с двумя чекбоксами
используй дизайнер расширенной http://forum.oszone.net/thread-148707-30.html версии
создай там панель и настрой BevelInner и BevelOuter

а также вот тебе русская справка http://sendfile.su/570136

nik1967 03-07-2012 10:39 1944773

Цитата:

Цитата L1nk3R
как сделать рамочку »

Цитата:

Цитата Johny777
это вероятнее всего панель с двумя чекбоксами »

Да бевел это.
читать дальше »
Код:

TBevelShape = (bsBox, bsFrame, bsTopLine, bsBottomLine, bsLeftLine, bsRightLine, bsSpacer);

TBevelStyle = (bsLowered, bsRaised);

TBevel = class(TGraphicControl)
  property Shape: TBevelShape; read write;
  property Style: TBevelStyle; read write;
end;


L1nk3R 03-07-2012 11:00 1944788

Цитата:

Цитата Johny777
используй дизайнер расширенной http://forum.oszone.net/thread-148707-30.html версии
создай там панель и настрой BevelInner и BevelOuter »

Расширенный это там где Редактор форм?
Что за BevelInner и BevelOuter, как мне их найти?

L1nk3R 03-07-2012 11:19 1944806

Цитата:

Цитата nik1967
Да бевел это. »

Что-то разобратся не могу что мне с ними сделать.

alert30 03-07-2012 11:44 1944831

Цитата:

Цитата L1nk3R
Что-то разобратся не могу что мне с ними сделать. »

Ну так скрипт от nik1967 копипастить в секции Code.

nik1967 03-07-2012 12:00 1944846

Цитата:

Цитата L1nk3R
Что-то разобратся не могу что мне с ними сделать. »

Простой пример
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить DirectX
Name: Redist\PhysXCheck; Description: Установить Nvidia PhysX

[_Code]
procedure InitializeWizard();
begin
  with TBevel.Create(WizardForm) do begin
    SetBounds(ScaleX(0),ScaleY(30),ScaleX(365),ScaleY(80));
    Shape:= bsBox;
    Parent:= WizardForm.SelectTasksPage;
  end;
  with WizardForm.TasksList do
    SetBounds(ScaleX(5),ScaleY(35),ScaleX(350),ScaleY(70));
end;


L1nk3R 03-07-2012 13:23 1944913

Всем спасибо разобрался наконец. В итоге вот что мне нужно было
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить DirectX
Name: Redist\PhysXCheck; Description: Установить Nvidia PhysX

[_Code]
procedure InitializeWizard();
begin
  WizardForm.TasksList.BorderStyle := bsSingle;
  with WizardForm.TasksList do SetBounds(ScaleX(5),ScaleY(35),ScaleX(350),ScaleY(70));
end;

Johny777, nik1967, оказывается не Bevel это а BorderStyle.

nik1967 03-07-2012 14:33 1944965

L1nk3R,
Тогда уж так
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить DirectX
Name: Redist\PhysXCheck; Description: Установить Nvidia PhysX

[ Code]
procedure InitializeWizard();
begin
  with WizardForm.TasksList do begin
    Height := ScaleY(70);
    BorderStyle := bsSingle;
  end;
end;


Johny777 03-07-2012 19:26 1945197

Цитата:

Цитата nik1967
Да бевел это. »

всё мимо
В итоге оказалось, что это стиль границы листбокса задач :grin:

====================================================================================================


У меня возник вопрос
при удалении игры деинсталятор ориентируется на экзешник
есть экзешник там = есть и игра = есть активный чекбокс на форме
если же в диспетчере задач висит процесс этого самого экзешника и при этом попытаться его удалить, то удаляется всё кроме него, а он остаётся
те никаких ошибок и прочего

подскажите пожалуйста как определить директорию расположения экзешника, процесс которого висит
(определение процесса уже есть в шапке в 2-х вариантах)
почему именно папку?
дело в том, что речь идёт о процессе hl2.exe а он может быть и не от моей пиратки, а от другой или от steam версии
и было бы некрасиво завершать процесс слева, удаляя справа

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

El Sanchez 03-07-2012 22:04 1945281

Johny777, определение рабочей папки процесса:
читать дальше »

Код:

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_QUERY_INFORMATION = $400;
    PROCESS_VM_READ = $10;
    MAX_PATH = 260;

type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..MAX_PATH-1] of Сhar;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
#endif
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetProcessImageFileName(hProcess: THandle; var lpImageFileName: Char; nSize: DWORD): DWORD; external 'GetProcessImageFileName{#A}@psapi.dll stdcall';
function GetLogicalDriveStrings(nBufferLength: DWORD; var lpBuffer: Char): DWORD; external 'GetLogicalDriveStrings{#A}@kernel32.dll stdcall';
function QueryDosDevice(lpDeviceName: String; var lpTargetPath: Char; ucchMax: DWORD): DWORD; external 'QueryDosDevice{#A}@kernel32.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';

function CharArrayToString(aChar: array of Char): String;
begin
    Result := '';
    while not (aChar[Length(Result)] = #0) do Result := Result + aChar[Length(Result)];
end;

function GetProcessWorkingDirectory(ProcessName: String): TArrayOfString;
var
    hProcessSnap, hProc: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile, szDrives, szDeviceName: array [0..MAX_PATH-1] of Char;
    sDeviceName: String;
    i, iLen: DWORD;
begin
    SetArrayLength(Result, 0);
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    pe32.dwSize := sizeof(pe32);
    if not Process32First(hProcessSnap, pe32) then Exit;
    while Process32Next(hProcessSnap, pe32) do
    begin
        if CompareText(CharArrayToString(pe32.szExeFile), ProcessName) = 0 then
        begin
            hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pe32.th32ProcessID);
            if GetProcessImageFileName(hProc, szExeFile[0], MAX_PATH) = 0 then Exit;
            SetArrayLength(Result, GetArrayLength(Result)+1);
            Result[GetArrayLength(Result)-1] := CharArrayToString(szExeFile);
            iLen := GetLogicalDriveStrings(MAX_PATH, szDrives[0]);
            if iLen = 0 then Exit;
            i := 0;
            while i <= iLen-3 do
            begin
                if QueryDosDevice(szDrives[i] + ':', szDeviceName[0], MAX_PATH) > 0 then
                begin
                    sDeviceName := CharArrayToString(szDeviceName);
                    if (Length(sDeviceName) <= Length(Result[GetArrayLength(Result)-1])) and
                    (Pos(sDeviceName, Result[GetArrayLength(Result)-1]) = 1) then
                    begin
                        StringChangeEx(Result[GetArrayLength(Result)-1], sDeviceName, szDrives[i] + ':', True);
                        Result[GetArrayLength(Result)-1] := RemoveBackSlash(ExtractFilePath(Result[GetArrayLength(Result)-1]));
                        Break;
                    end;
                end;
                i := i + 4;
            end;
            CloseHandle(hProc);
        end;
    end;
    CloseHandle(hProcessSnap);
end;

procedure InitializeWizard();
var
    szArray: TArrayOfString;
    i: Integer;
begin
    //хочу знать откуда калькуляторы запущены
    szArray := GetProcessWorkingDirectory('calc.exe');
    if GetArrayLength(szArray) > 0 then for i := 0 to GetArrayLength(szArray)-1 do MsgBox(szArray[i], mbInformation, MB_OK);
end;


Johny777 04-07-2012 00:31 1945372

El Sanchez, огромное спасибо за функцию
результат:
if GetProcessWorkingDirectory('hl2.exe') = ExpandConstant('{app}\common\half-life 2') then Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
работает отлично! :)
надеюсь тебе было не в напряг

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,

можно пожалуйста ещё 2 мелких вопроса?

1. в чём разница между ErrorCode и ResultCode
Если они оба сравниваются только с 0 , то я понимаю
if (ErrorCode <> 0) then // если ошибка то...
if (ResultCode <> 0) then // если успех то...
а если ещё и с единицей, то не вижу разницы

вот напимер форма которая создаётся в пределах создания формы Авторана в случае работающего сервиса Steam

читать дальше »
Код:

    if (FileExists(AppPath + '\common\half-life 2\hl2.exe') or FileExists(AppPath + '\common\half-life 2 episode one\hl2.exe') or
        FileExists(AppPath + '\common\half-life 2 episode two\hl2.exe') or FileExists(AppPath + '\common\portal\hl2.exe'))
    and (IsProcessRunning('Steam.exe')) then
   
    begin
      MyExit := TForm.Create(nil);
      with MyExit do
      begin
        Position := poScreenCenter;
        BorderStyle := bsDialog;
        ClientWidth := ScaleX(440);
        ClientHeight := ScaleY(180);
        Caption := ExpandConstant(SetupMessage(msgErrorTitle));
        Color := clBtnFace;
        DeleteMenu(GetSystemMenu(MyExit.Handle,False), $F060,0);/// сделать кнопку "закрыть" неактивной
        SetClassLong(MyExit.Handle, -26, GetClassLong(MyExit.Handle, -26) or $200); /// блокировка комбинации alt + f4
        SendMessage(MyExit.Handle, $0080, 0, LoadImage(0,ExpandConstant('{tmp}')+'\icon.ico',1,16,16,$1010)); /// иконка в углу
        OnMouseDown := @MouseDown2;
        with TBitmapImage.Create(MyExit) do
        begin
          Parent := MyExit;
          ExtractTemporaryFile('Pic1.bmp');
          Bitmap.LoadFromFile(ExpandConstant('{tmp}\Pic1.bmp'));
          SetBounds(ScaleX(0), ScaleY(0), ScaleX(440), ScaleY(120));
          OnMouseDown := @MouseDown2;
        end;

        with TLabel.Create(MyExit) do
        begin
          SetBounds(ScaleX(20), ScaleY(131), ScaleX(270), ScaleY(30));
          AutoSize := False;
          Caption := ExpandConstant('{cm:Steam_Runs}');
          Transparent := True;
          WordWrap := True;
          Parent := MyExit;
          Font.Color := clWindowText;
          //Font.Color := $48c1ca;
          Font.Size := 9;
          OnMouseDown := @MouseDown2;
        end;

        with TButton.Create(MyExit) do
        begin
          Caption := ExpandConstant(SetupMessage(msgButtonYes));
          Parent := MyExit;
          SetBounds(ScaleX(270), ScaleY(135), ScaleX(71), ScaleY(25));
          ModalResult := mrYes;
        end;
           
        with TButton.Create(MyExit) do
        begin
          Parent := MyExit;
          Caption := ExpandConstant(SetupMessage(msgButtonNo));
          SetBounds(ScaleX(350), ScaleY(135), ScaleX(71), ScaleY(25));
          ModalResult:= mrNo;
        end;
      end;
   
      ExtractTemporaryFile('launch_deny2.wav');
      sndPlaySound(ExpandConstant('{tmp}\launch_deny2.wav'),$0001);
   
      case
        MyExit.ShowModal() of

        mrNo :
        begin
          PlayInstallButton.Enabled := not IsProcessRunning('Steam.exe');
          MyExit.Free;
        end;

        mrYes :
        begin
          Exec(ExpandConstant('{reg:HKCU\Software\Valve\Steam,SteamPath|}') + '\Steam.exe', '-shutdown', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
          if  not (IsProcessRunning('Steam.exe')) then PlayInstallButton.Enabled := True;
          MyExit.Free;
        end;
      end;
    end;
   
  AutoRun.ShowModal;
     
end;


те если вписать в
Exec(ExpandConstant('{reg:HKCU\Software\Valve\Steam,SteamPath|}') + '\Steam.exe', '-shutdown', '', SW_SHOW, ewWaitUntilTerminated, ResultCode);
ErrorCode и сравнить
if (ErrorCode = 0) then MyExit.Free else MsgBox( завршить процесс Да/Нет ...
если я правильно понимаю
(определение процесса взял отсюда http://forum.oszone.net/post-1800689-218.html)

2. достаточно ли завершить процесс так:
Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
или лучше воспользоваться библиотекой istask.dll ?

sergey3695 04-07-2012 11:20 1945567

El Sanchez,
А как переделать GetProcessWorkingDirectory, чтобы на юникоде работало?

El Sanchez 04-07-2012 13:00 1945616

Цитата:

Цитата sergey3695
А как переделать GetProcessWorkingDirectory, чтобы на юникоде работало? »

Johny777, sergey3695, переделал на ansi/unicode и изменил тип результата функции - теперь возвращает не строку, а массив строк, ведь запущенных процессов с одинаковым именем может быть несколько.

Цитата:

Цитата Johny777
1. в чём разница между ErrorCode и ResultCode »

Johny777, ни в чем, переменные можешь называть как хочешь. Код возврата ResultCode функции Exec сравнивается только с 0, ненулевой код есть код ошибки, расшифровка которого делается с помощью SysErrorMessage(ResultCode).

Цитата:

Цитата Johny777
2. достаточно ли завершить процесс так:
Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
или лучше воспользоваться библиотекой istask.dll ? »

Johny777, без разницы, если делают одно и то же.

L1nk3R 04-07-2012 13:39 1945637

Привет. Насчёт taskkill (taskkill.exe) понятно - обращение идёт напрямую к исполняемому файлу. Кто подскажет, istask.dll к чему обращается? Передаёт ли библиотека обращение к исполняемому файлу или она работает внутренне непосредственно с инсталятором?
Меня интересует универсальность, если например taskkill.exe будет специально удалён из системы то библиотека отработает завершение процесса или нет?

R.i.m.s.k.y. 04-07-2012 19:09 1945912

L1nk3R, я таскаю в инсталлере taskkill от ХР, распаковываю его в {tmp} и запускаю для убийства процесса

L1nk3R 05-07-2012 12:01 1946284

Привет.
Цитата:

Цитата R.i.m.s.k.y.
я таскаю в инсталлере taskkill от ХР »

Цитата:

Цитата L1nk3R
Насчёт taskkill (taskkill.exe) понятно »

.

Вообще-то меня больше интересует библиотека. По какому принципу она работает? Если она всё таки обращается к исполняемому файлу, то тогда смысла в этой библиотеке нет.

L1nk3R 05-07-2012 16:02 1946494

Привет! Кто подскажет, как с помощью Inno вывести системные файлы из защиты виндофс а потом обратно защитить? Если такое возможно.

El Sanchez 05-07-2012 16:11 1946502

Цитата:

Цитата L1nk3R
Вообще-то меня больше интересует библиотека. По какому принципу она работает? Если она всё таки обращается к исполняемому файлу, то тогда смысла в этой библиотеке нет. »

L1nk3R, и taskkill, и taskmgr, и istask.dll вызывают функции стандартной библиотеки kernel32.dll ExitProcess (taskkill через CRT-шную функцию _exit) для корректного закрытия процесса и TerminateProcess для принудительного.

Ivan_009 05-07-2012 16:15 1946506

Как сделать деинсталлятор в стиле инсталлятора подскажите пожалуйста :search:

Johny777 05-07-2012 16:28 1946514

Ваня , можно подробно что именно ты хочешь?

вот есть такой пример в сообщении Winst@n
http://krinkels.org/showthread.php?t=7&page=4

такой (у меня в скрипте стоит) с выбором компонентов и скином
http://forum.oszone.net/post-1939326-314.html

Ivan_009 05-07-2012 16:42 1946538

Johny777, типа так вот :)

FMA 05-07-2012 17:09 1946561

Как правильно создать ярлык на папку? Сейчас использую
Код:


[Icons]
Name: {commondesktop}\Папка; Filename: {app}\Папка

но после установки и клику по ярлыку, он не срабатывает, хотя путь прописался верно.

L1nk3R 05-07-2012 17:29 1946585

Johny777, Точно, сразу не сообразил так сделать, удалил taskkill.exe. Проверил, действительно без taskkill.exe всё работает и убивает процессы без исполняемого файла, а значит библиотека не обращается к taskkill.exe и не передаёт какие либо команды для завершения процесса, что имеет большой плюс. Нет двойного обращения.
El Sanchez, Спасибо! Этот ответ вполне устраивает. Т.е на сколько я понял istask.dll обращается напрямую к kernel32.dll ExitProcess.

Если библиотека используется примерно так "istask.dll - > kernel32.dll, а не так istask.dll - > kernel32.dll - > taskkill.exe, то это уже совсем другое дело.
Ещё раз Спасибо!

А что насчёт http://forum.oszone.net/post-1946494-388.html этого вопроса, есть какие нибудь варианты?

Johny777 05-07-2012 17:31 1946590

Ваня
код:
читать дальше »
Код:

#define MyAppName "test"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
BitmapResource=unins:BloodRain_U.bmp



[Files]
Source: tiger.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}



[code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';


function InitializeSetup:boolean;
begin
    ExtractTemporaryFile('tiger.cjstyles');
    LoadSkin(ExpandConstant('{tmp}\tiger.cjstyles'), '');
   
    Result := True;
end;


procedure InitializeUninstallProgressForm();
begin
  with UninstallProgressForm do
  begin
    Width := ScaleX(755);
    Height := ScaleY(500);
    Position := poScreenCenter;
    CancelButton.SetBounds(ScaleX(650), ScaleY(420), ScaleX(75), ScaleY(25));
   
    with ProgressBar do
    begin
      Parent := UninstallProgressForm
      SetBounds(ScaleX(10), ScaleY(370), ScaleX(727), ScaleY(25));
    end;
     
    //unins background bitmap image
    with TBitmapImage.Create(nil) do
    begin
        Parent := UninstallProgressForm;
        Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS');
        SetBounds(ScaleX(0), ScaleY(0), ScaleX(750), ScaleY(352));
    end;

    OuterNotebook.Hide;
    MainPanel.Hide;
    Bevel1.Hide;
    StatusLabel.Hide;
    BeveledLabel.Hide;
    Bevel.Hide;
  end;
end;

function InitializeUninstall(): Boolean;
begin
    if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\tiger.cjstyles'), ExpandConstant('{tmp}\tiger.cjstyles'), True) and
      FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True)
    then
      LoadSkinU(ExpandConstant('{tmp}\tiger.cjstyles'), '');
       
    Result := True;
end;

procedure DeinitializeUninstall();
begin
    if FileExists(ExpandConstant('{tmp}\tiger.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;

procedure DeinitializeSetup;
begin
    UnloadSkin();
end;


скрин:

архив со всем необходимым:
http://rghost.ru/private/39052497/4e...6d5eb1311ede98

===============================================================

FMA,
тебе не хватет флага
припиши ... ; Flags: foldershortcut

у тебя стоит {commondesktop}
ты уверен, что на общем рабочем столе ?
{userdesktop} - текущего пользователя

а также вот тебе русская справка http://sendfile.su/570136

Ivan_009 05-07-2012 19:30 1946653

Source: BmpFiles\fon.bmp; DestDir: {app}; Attribs: hidden system;
Source: BmpFiles\fonAC.bmp; DestDir: {app}; Attribs: hidden system;

Johny777, а как загрузить 2 картинки на InitializeUninstallProgressForm(); пробую так неполучается :(

Ivan_009 05-07-2012 21:58 1946742

Как сделать двойной прогресс бар тоесть вот такой через IsDone :sorry:

Johny777 05-07-2012 22:48 1946775

Ваня,
как добавить ещё одну картинку в BitmapResource=unins:BloodRain_U.bmp не знаю
( Кстати! Оказывается очень удобно использовать для некоторых картинок секцию Setup :) ,
тк нет лишней писанины с добавлением картинок в секцию Files и их перемещением в темп. как чуть ниже )

поэтому так (приписал немного комментариев)
читать дальше »
Код:

#define MyAppName "test"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
;BitmapResource=unins:BloodRain_U.bmp|unins:BloodRain_U2.bmp



[Files]
Source: tiger.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: Pic1.bmp; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: Pic2.bmp; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;



[code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';


function InitializeSetup:boolean;
begin
    ExtractTemporaryFile('tiger.cjstyles');
    LoadSkin(ExpandConstant('{tmp}\tiger.cjstyles'), '');
   
    Result := True;
end;


procedure InitializeUninstallProgressForm();
begin
  with UninstallProgressForm do
  begin
    Width := ScaleX(757); /// ширина формы
    Height := ScaleY(500); /// высота формы
    Position := poScreenCenter; /// расположение формы в центре экрана
    CancelButton.SetBounds(ScaleX(650), ScaleY(420), ScaleX(75), ScaleY(25)); /// расположение кнопки отмены
   
    with ProgressBar do  /// прогресбар
    begin
      Parent := UninstallProgressForm
      SetBounds(ScaleX(10), ScaleY(370), ScaleX(727), ScaleY(25));
    end;

    /// если копирование этого и того файла в темп True, то
    if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\Pic1.bmp'), ExpandConstant('{tmp}\Pic1.bmp'), True) and
      FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\Pic2.bmp'), ExpandConstant('{tmp}\Pic2.bmp'), True)
    then
    begin  /// создаём 2 безымянныйе картинки
      //unins background bitmap image
      with TBitmapImage.Create(nil) do
      begin
        Parent := UninstallProgressForm;
        Bitmap.LoadFromFile(ExpandConstant('{tmp}\Pic1.bmp')); /// грузим одну критнку
        SetBounds(ScaleX(0), ScaleY(0), ScaleX(750), ScaleY(352));
      end;

      with TBitmapImage.Create(nil) do
      begin
        Parent := UninstallProgressForm;
        Bitmap.LoadFromFile(ExpandConstant('{tmp}\Pic2.bmp')); /// грузим другую картинку
        SetBounds(ScaleX(0), ScaleY(352), ScaleX(750), ScaleY(352));
      end;
    end;
    OuterNotebook.Hide;  /// скрываем всё, что не нужно /// а все элементы UninstallProgressForm есть во вкладке компилятора расширенной версии "поддержка Inno Setup" на строке 2300
    MainPanel.Hide;
    Bevel1.Hide;
    StatusLabel.Hide;
    BeveledLabel.Hide;
    Bevel.Hide;
  end;
end;

function InitializeUninstall(): Boolean;
begin
    if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\tiger.cjstyles'), ExpandConstant('{tmp}\tiger.cjstyles'), True) and
      FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True)
    then
      LoadSkinU(ExpandConstant('{tmp}\tiger.cjstyles'), '');
       
    Result := True;
end;

procedure DeinitializeUninstall();
begin
    if FileExists(ExpandConstant('{tmp}\tiger.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;

procedure DeinitializeSetup;
begin
    UnloadSkin();
end;



и, Вань, зачем тебе 2 картинки?
склей в фотошопе в одну
(Создать - новый фон (настранваешь цвет фона и указываешь размер) - перетаскиваешь обе картинки на этот самый фон - растягиваешь и двигаешь до получения желаемого результата -
нажимаешь инструмент "Перемещение(V)" и при необходимости инструментом "Рамка (С)" кадрируешь (вырезаешь нужный участок)- сохраняешь в 32-битном(!).bmp - файле)
юзаю версию 5.1 (русскую)
Цитата:

Цитата Ivan_009
Как сделать двойной прогресс бар тоесть вот такой через IsDone »

хз
исдан не знаю :(


------------------------------------------------------------------------------------Update
понял как добавлять картинки через Setup
пример в ...\Inno Setup 5\Examples\Example_BitmapResource.iss прояснил ситуацию!
сократил код
улучшенный результат:
читать дальше »
Код:

#define MyAppName "test"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
UninstallFilesDir={app}\uninstall
BitmapResource=unins:Pic1.bmp|unins2:Pic2.bmp



[Files]
Source: tiger.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}; Attribs: hidden system;

[code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';


function InitializeSetup:boolean;
begin
    ExtractTemporaryFile('tiger.cjstyles');
    LoadSkin(ExpandConstant('{tmp}\tiger.cjstyles'), '');

    Result := True;
end;


procedure InitializeUninstallProgressForm();
begin
  with UninstallProgressForm do
  begin
    Width := ScaleX(757); /// ширина формы
    Height := ScaleY(500); /// высота формы
    Position := poScreenCenter; /// расположение формы в центре экрана
    CancelButton.SetBounds(ScaleX(650), ScaleY(420), ScaleX(75), ScaleY(25)); /// расположение кнопки отмены

    with ProgressBar do  /// прогресбар
    begin
      Parent := UninstallProgressForm
      SetBounds(ScaleX(10), ScaleY(370), ScaleX(727), ScaleY(25));
    end;
   
    /// создаём 2 безымянныйе картинки
    with TBitmapImage.Create(nil) do
    begin
      Parent := UninstallProgressForm;
      Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS'); /// грузим одну критнку
      SetBounds(ScaleX(0), ScaleY(0), ScaleX(750), ScaleY(352));
    end;
   
    with TBitmapImage.Create(nil) do
    begin
      Parent := UninstallProgressForm;
      Bitmap.LoadFromResourceName(HInstance, '_IS_UNINS2'); /// грузим другую картинку
      SetBounds(ScaleX(0), ScaleY(352), ScaleX(750), ScaleY(352));
    end;
   
    OuterNotebook.Hide;  /// скрываем всё, что не нужно /// а все элементы UninstallProgressForm есть во вкладке компилятора расширенной версии "поддержка Inno Setup" на строке 2300
    MainPanel.Hide;
    Bevel1.Hide;
    StatusLabel.Hide;
    BeveledLabel.Hide;
    Bevel.Hide;
  end;
end;

function InitializeUninstall(): Boolean;
begin
    if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\tiger.cjstyles'), ExpandConstant('{tmp}\tiger.cjstyles'), True) and
      FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True)
    then
      LoadSkinU(ExpandConstant('{tmp}\tiger.cjstyles'), '');

    Result := True;
end;

procedure DeinitializeUninstall();
begin
    if FileExists(ExpandConstant('{tmp}\tiger.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;

procedure DeinitializeSetup;
begin
    UnloadSkin();
end;


изменённые строки выделил жирным (3 строки)

Johny777 06-07-2012 15:27 1947117

1. Переделал "проценты установки" под CallbackAddr

теперь библиотека "InnoCallback.dll" не нужна (нужна только расширенная версия Inno)

было так:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: compiler:innocallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs

[code]
type
  TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
 

var
  PercentsTimer: LongWord;
  PercentsLabel: TLabel;
 

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';


function NumToStr(Float: Extended): String;
begin
  Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
  while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
end;


procedure PercentsProc(h, msg, idevent, dwTime: Longword);
begin
  with WizardForm.ProgressGauge do
  begin
    PercentsLabel.Caption := NumToStr((Position*100)/Max) + ' %';
    Application.Title := ' ' + NumToStr((Position*100)/Max) + ' %';
  end;
end;


procedure DeinitializeSetup();
begin
  KillTimer(0, PercentsTimer);
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
 
    PercentsLabel:= TLabel.Create(nil);
    with PercentsLabel do
    begin
      SetBounds(WizardForm.ProgressGauge.Left + ScaleX(30), WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10), WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
      AutoSize:= True;
      Transparent := True;
      Parent:= WizardForm.InstallingPage;
    end;

    PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
   
  end;
 
  if CurStep = ssPostInstall then
  begin
    KillTimer(0, PercentsTimer);
    Application.Title := ' Готово';
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID=wpInstalling then
  begin
    Confirm := False;
    case ExitSetupMsgBox of
      True :
      begin
        PercentsLabel.Free;
        Application.Title := ExpandConstant(' ' + SetupMessage(msgButtonCancel) + '...');
        Cancel := True;
      end;
      False : Cancel := False;
    end;
  end;
end;



стало так:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs

[code]
var
  PercentsTimer: LongWord;
  PercentsLabel: TLabel;
 
 
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
 

function NumToStr(Float: Extended): String;
begin
  Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
  while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
end;


procedure PercentsProc;
begin
  with WizardForm.ProgressGauge do
  begin
    PercentsLabel.Caption := NumToStr((Position*100)/Max) + ' %';
    Application.Title := ' ' + NumToStr((Position*100)/Max) + ' %';  /// проценты на кнопке в панели задач
  end;
end;


procedure DeinitializeSetup();
begin
  KillTimer(WizardForm.Handle, PercentsTimer);
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
 
    PercentsLabel:= TLabel.Create(nil);
    with PercentsLabel do
    begin
      SetBounds(WizardForm.ProgressGauge.Left + ScaleX(30), WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10), WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
      AutoSize:= True;
      Transparent := True;
      Parent:= WizardForm.InstallingPage;
    end;
   
    PercentsTimer:= SetTimer(WizardForm.Handle, 0, 100, CallbackAddr('PercentsProc'));
   
  end;
 
  if CurStep = ssPostInstall then
  begin
    KillTimer(WizardForm.Handle, PercentsTimer);
    Application.Title := ' Готово';
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID=wpInstalling then
  begin
    Confirm := False;
    case ExitSetupMsgBox of
      True :
      begin
        PercentsLabel.Free;
        Application.Title := ExpandConstant(' ' + SetupMessage(msgButtonCancel) + '...');
        Cancel := True;
      end;
      False : Cancel := False;
    end;
  end;
end;



Примечание:
кто не хочет отображения десятой доли процента после запятой удалите функцию
function NumToStr(Float: Extended): String;
begin
...
end;
и замените в процедуре
procedure PercentsProc;

NumToStr на IntToStr
===========================================================================================
2. может кто пожалуйста избавить это код от InnoCallBack.dll (при перетаскивании основного окно перетаскивается форма)
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: compiler:innocallback.dll; DestDir: {tmp}; Flags: dontcopy

[code]
const
  WM_MOVE = $3;

  GWL_WNDPROC = -4;

type
  TCallbackProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint  ;

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function WndProcCallBack(P:TCallbackProc;ParamCount:integer  ):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';

var
Form1: TForm;
OldProc: Longint;

function MyProc(h: HWND; Msg, wParam, lParam: longint): Longint;
begin
  if Msg=WM_MOVE then SetWindowPos(Form1.Handle, 0, WizardForm.Left+WizardForm.Width+5, WizardForm.Top, 0, 0, $415);
  Result:= CallWindowProc(OldProc, h, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
  Form1:= TForm.Create(MainForm);
  Form1.SetBounds(WizardForm.Left+WizardForm.Width+5  , WizardForm.Top, 100, 358);
  Form1.BorderStyle:= bsSingle;
  Form1.Show;

  OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, WndProcCallBack(@MyProc, 4));
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldProc);
end;


речь идёт о функции:
function WndProcCallBack(P:TCallbackProc;ParamCount:integer ):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
=================================================================================
3. и последнее:
Скажите пожалуйста (если можно попроще) когда нужно (лучше?) использовать указатель nil в Inno и на что он влияет?
(из интереса присвоил всем элементам (ричэдитам, панелям, чекбосам) этот указатель и теперь инсталл кушает на 400 кб оперативки меньше :))

El Sanchez 07-07-2012 11:36 1947523

Цитата:

Цитата Johny777
2. может кто пожалуйста избавить это код от InnoCallBack.dll (при перетаскивании основного окно перетаскивается форма) »

Johny777, замени WndProcCallBack(@MyProc, 4) на CallbackAddr('MyProc'), ну и удали ненужные объявленные тип TCallbackProc и функцию WndProcCallBack.

Цитата:

Цитата Johny777
Скажите пожалуйста (если можно попроще) когда нужно (лучше?) использовать указатель nil в Inno и на что он влияет?
(из интереса присвоил всем элементам (ричэдитам, панелям, чекбосам) этот указатель и теперь инсталл кушает на 400 кб оперативки меньше »

Типа так? - Form1 := TForm.Create(nil); Параметром конструктора Create указывается компонент-владелец создаваемого компонента, т.е. если мы создаем форму вот так - Form1 := TForm.Create(WizardForm), то владелец WizardForm отвечает за выделение/освобождение памяти для Form1 и при разрушении WizardForm автоматически разрушается и Form1. nil же означает, что у создаваемого компонента нет владельца, создается такой компонент значительно быстрее, но ответственность за освобождение памяти в случае, когда компонент уже не нужен, лежит на программисте (вызвать метод Free). Как-то так.

Ivan_009 07-07-2012 21:07 1947771

Как в данном модуле удалить все ненужное и оставить только те функции которые нужны данной кнопке.... :unsure: заранее спасибо...

Johny777 07-07-2012 23:15 1947834

Цитата:

Цитата Ivan_009
Как в данном модуле удалить все ненужное и оставить только те функции которые нужны данной кнопке »

прочистил как мог (ботву тоже)
всё в одном коде
архив
http://rghost.ru/private/39092559/fc...d1fb7dd0472c5b

код:
читать дальше »
Код:


[Setup]
AppName=BassExample
AppVerName=BassExample
DefaultDirName={pf}\BassExample
Compression=none



[Files]
Source: BASS_Files\*;  DestDir: {tmp}; Flags: dontcopy
Source: music.mp3;  DestDir: {tmp}; Flags: dontcopy



[code]
/// кусок ботвы /// начало
type
  TBtnEventProc = procedure(h:HWND);
 
 

procedure gdipShutdown; external 'gdipShutdown@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetCursor(h:HWND; hCur:Cardinal); external 'BtnSetCursor@{tmp}\botva2.dll stdcall delayload';
procedure BtnSetEvent(h :HWND; EventID :integer; Event :Longword); external 'BtnSetEvent@{tmp}\botva2.dll stdcall delayload';
function BtnCreate(hParent :HWND; Left, Top, Width, Height :integer; FileName :PAnsiChar; ShadowWidth :integer; IsCheckBtn :boolean) :HWND; external 'BtnCreate@{tmp}\botva2.dll stdcall delayload';
function GetSysCursorHandle(id:integer):Cardinal; external 'GetSysCursorHandle@{tmp}\botva2.dll stdcall delayload';
function WrapBtnCallback(Callback: TBtnEventProc; ParamCount: Integer): Longword; external 'wrapcallbackaddr@{tmp}\CallbackCtrl.dll stdcall delayload';
/// конец



type
  HSTREAM = DWORD;
  TBASSTmrProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
 
 
 
const
  BASS_ACTIVE_STOPPED = 0;
  BASS_ACTIVE_PAUSED  = 3;
 
 

var
  BASS_Volume: DWORD; BASS_Mp3Handle: HSTREAM;
  BASS_OnOffBtn: HWND;
  Songs: TStringList; SongTimer: Longword;
  CurSong: Integer;
 


function _BASS_WrapTimerProc(callback: TBASSTmrProc; paramcount: integer):longword; external 'wrapcallbackaddr@{tmp}\callbackctrl.dll stdcall delayload';
function _BASS_SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall delayload';
function _BASS_KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall delayload';
function _BASS_Init(device: LongInt; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean; external 'BASS_Init@{tmp}\BASS.dll stdcall delayload';
function _BASS_StreamCreateFile(mem: BOOL; f: PAnsiChar; offset1, offset2, length1, length2: DWORD; flags: DWORD): HSTREAM; external 'BASS_StreamCreateFile@{tmp}\BASS.dll stdcall delayload';
function _BASS_StreamFree(handle: HSTREAM): BOOL; external 'BASS_StreamFree@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean; external 'BASS_ChannelPlay@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelIsActive(handle: DWORD): DWORD; external 'BASS_ChannelIsActive@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelPause(handle: DWORD): Boolean; external 'BASS_ChannelPause@{tmp}\BASS.dll stdcall delayload';
function _BASS_ChannelSetAttribute(handle: DWORD; Flags: DWORD; Value: Single): Boolean; external 'BASS_ChannelSetAttribute@{tmp}\BASS.dll stdcall delayload';
function _BASS_Stop(): Boolean; external 'BASS_Stop@{tmp}\BASS.dll stdcall delayload';
function _BASS_Free(): Boolean; external 'BASS_Free@{tmp}\BASS.dll stdcall delayload';
function _BASS_Start(): Boolean; external 'BASS_Start@{tmp}\BASS.dll stdcall delayload';




procedure BASSTimerProc(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  if (_BASS_ChannelIsActive(BASS_Mp3Handle) = BASS_ACTIVE_STOPPED)and(Songs.Count>1) then begin
    CurSong:= CurSong+1;
    if CurSong>=Songs.Count then CurSong:=0;
    _BASS_StreamFree(BASS_Mp3Handle);
    BASS_Mp3Handle:= _BASS_StreamCreateFile(FALSE, PAnsiChar(Songs.Strings[CurSong]), 0, 0, 0, 0, 0);
    _BASS_ChannelPlay(BASS_Mp3Handle, False);
  end;
end;



procedure BASS_Init(Mp3Name: String);
var
  FSR: TFindRec; Flags: DWORD;
begin
  if not FileExists(ExpandConstant('{tmp}\Bass.dll')) then ExtractTemporaryFile('Bass.dll');
  if not FileExists(ExpandConstant('{tmp}\callbackctrl.dll')) then ExtractTemporaryFile('callbackctrl.dll');
  Songs:= TStringList.Create;
  Songs.Clear;
  Mp3Name:= ExpandConstant(Mp3Name);
  if FindFirst(Mp3name, FSR) then try
    repeat
      if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
        Songs.Add(AddBackslash(ExtractFilePath(Mp3Name))+FSR.Name);
    until not FindNext(FSR);
  finally
    FindClose(FSR);
  end;
  CurSong:= 0;
  _BASS_Init(-1, 44100, 0, 0, 0)
  _BASS_Start();
  if Songs.Count>1 then Flags:= 0 else Flags:= 4;
  BASS_Mp3Handle:= _BASS_StreamCreateFile(FALSE, PAnsiChar(Songs.Strings[CurSong]), 0, 0, 0, 0, Flags);
  _BASS_ChannelPlay(BASS_Mp3Handle, False);
  if Songs.Count>1 then
    SongTimer:= _BASS_SetTimer(0, 0, 100, _BASS_WrapTimerProc(@BASSTimerProc, 4));
  BASS_Volume:= 100;
  _BASS_ChannelSetAttribute(BASS_Mp3Handle, 2, BASS_Volume/100.0);
end;



procedure BASS_DeInit();
begin
  _BASS_Stop;
  _BASS_Free;
  if Songs.Count>1 then
    _BASS_KillTimer(0, SongTimer);
  Songs.Free;
end;



procedure BASS_OnOffClick(Handle: HWND);
begin
  if (_BASS_ChannelIsActive(BASS_Mp3Handle) = BASS_ACTIVE_PAUSED) then _BASS_ChannelPlay(BASS_Mp3Handle, False) else
  _BASS_ChannelPause(BASS_Mp3Handle)
end;



procedure BASS_CreateOnOffButton(Parent: TWinControl; Image: String; Left, Top, Width, Height, ShadowWidth: Integer);
begin
  BASS_OnOffBtn:= BtnCreate(Parent.Handle, ScaleX(Left), ScaleY(Top), ScaleX(Width), ScaleY(Height), ExpandConstant(Image), ShadowWidth, True)
  BtnSetCursor(BASS_OnOffBtn,GetSysCursorHandle(32649));
  BtnSetEvent(BASS_OnOffBtn, 1, WrapBtnCallback(@BASS_OnOffClick, 1))
end;



procedure InitializeWizard();
begin
  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('CallbackCtrl.dll');
  ExtractTemporaryFile('botva2.dll');
  ExtractTemporaryFile('MusicButton.png');
  ExtractTemporaryFile('Music.mp3');

  BASS_Init('{tmp}\Music.mp3') //Запускаем музыку
  //Можно добавить в инсталл несколько песен
  //BASS_Init(ExpandConstant('{tmp}\*'))        //Поиск по маске
  BASS_CreateOnOffButton(WizardForm, '{tmp}\MusicButton.png', 20, 320, 36, 36, 4) //Создаем кнопку вкл/выкл
end;



procedure DeinitializeSetup();
begin
  BASS_DeInit; //Освобождаем процесс
  gdipShutdown
end;


mariolast 08-07-2012 10:39 1947980

Может кто еще пользуется botva2.dll
Хочу разрисовать прогрессбар при джеинсталляции
Но что то не так видимо делаю.
Затык на функции CallWindowProc(PBOldProcUn,h,Msg,wParam,lParam);
Вызывает ошибку вызова процедуры
Вот кусок кода, может подскажете, в чем ошибка.
Код:

function CallBackProc(P:TPBProc;ParamCount:integer):LongWord; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';
 function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
 function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
 function GetTickCountUn: DWORD; external 'GetTickCount@kernel32.dll stdcall uninstallonly';
 ...
 ...
 function PBProcUn(h:hWnd;Msg,wParam,lParam:Longint):Longint;
 var
  lt:Longint;
  dt,at,pr,i1,i2:Extended;
  p:string;
  tc:DWORD;
 begin
 Result:=7;
  Result:=CallWindowProc(PBOldProcUn,h,Msg,wParam,lParam);
  if (Msg=$402) and (UninstallProgressForm.Progressbar.Position>UninstallProgressForm.Progressbar.Min) then begin
    i1:=UninstallProgressForm.Progressbar.Position-UninstallProgressForm.Progressbar.Min;
    i2:=UninstallProgressForm.Progressbar.Max-UninstallProgressForm.Progressbar.Min;
 
    tc:=GetTickCountUn;
    if (tc-eTimeUn)>=1000 then begin
      dt:=(tc-sTimeUn)/1000;
      at:=i2*dt/i1;
      lt:=Round(at-dt)
      TimeLeftLabel.Caption:='Îñòàëîñü - '+LongintToStringTime(lt);
      eTimeUn:=tc;
    end;
 
    pr:=i1*100/i2;
    p:=' - ['+Format('%f',[pr])+'%]';
    StringChange(p,',','.');
    TimeLeftLabelUn.Caption:=WFCaption+p;
    WizardForm.Caption:=WFCaption+p;
 
    ImgPBSetPosition(NewPBun,pr);
    ImgApplyChanges(UninstallProgressForm.Handle);
  end;
 end;
 ...
 ...
 procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
 var
  Names: TArrayOfSting;
  I, Errorcode: Integer;
  S,RegAss: String;
 
 begin
  if CurUninstallStep=usUninstall then
  begin
 NewPBun:=ImgPBCreate(UninstallProgressForm.InstallingPage.Handle, ExpandConstant('{tmp}\pbbkg.png'), ExpandConstant('{tmp}\pb.png'),UninstallProgressForm.Progressbar.Left,UninstallProgressForm.Progressbar.Top,UninstallProgressForm.Progressbar.Width,25);
      ImgApplyChanges(UninstallProgressForm.InstallingPage.Handle);
 
      WFCaption:=UninstallProgressForm.Caption;
 
      TimeLeftLabelUn:=TLabel.Create(nil);
      with TimeLeftLabelUn do begin
        Parent:=UninstallProgressForm.InstallingPage;
        AutoSize:=False;
        SetBounds(ScaleX(400),ScaleY(150),ScaleX(400),ScaleY(21));
        Transparent:=True;
        Font.Color:=clWhite;
        Font.Style:= [fsBold];
      end;
 
      sTimeUn:=GetTickCountUn;
      eTimeUn:=sTimeUn;
 
      PBOldProcUn:=SetWindowLong(UninstallProgressForm.InstallingPage.Handle,-4,CallBackProc(@PBProcUn,4));
       
  end;


sergey3695 08-07-2012 16:28 1948135

Цитата:

Цитата Johny777
PBOldProcUn:=SetWindowLong(UninstallProgressForm.InstallingPage.Handle,-4,CallBackProc(@PBProcUn,4));
может всё таки
UninstallProgressForm.Handle »

UninstPBOldProc:=SetWindowLong(UninstallProgressForm.ProgressBar.Handle,-4,CallBackProc(@UninstPBProc,4));
Наподобе этого. У меня так например.

mariolast 09-07-2012 11:36 1948539

Цитата:

Цитата Johny777
пальцем в небо
но попробуй
у меня в скрипте есть такая вот секция [LangOptions]
[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl; InfoBeforeFile: Russian.rtf
Name: English; MessagesFile: compiler:Languages\English.isl; InfoBeforeFile: English.rtf
[LangOptions]
Russian.LanguageName=<0420><0443><0441><0441><043A><0438><0439>
Russian.LanguageID=$0419
Russian.LanguageCodePage=1251
English.LanguageName=English
English.LanguageID=$0409
English.LanguageCodePage=0 »

Это абсолютно не работает. нужен другой способ

Цитата:

Цитата mariolast
Кто о наверняка сталкивался...
Как в английской винде сделать так, чтобы инсталлятор на русском не крякозябрами показывал а нормальными буквами?
Окромя такого вот решения как здесь описано http://www.wylek.ru/forum/31-153-5718-16-1341169828
есть что то получше? »

Johny777,
Да не, еще скрипт ботвы надо было править оказывается. Разьяснили с этим вопросом уже работает.

Gnom_aka_Lexander 09-07-2012 12:59 1948597

Цитата:

Цитата mariolast
Окромя такого вот решения как здесь описано http://www.wylek.ru/forum/31-153-5718-16-1341169828
есть что то получше? » »

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

El Sanchez 09-07-2012 17:48 1948782

Цитата:

Цитата mariolast
Кто о наверняка сталкивался...
Как в английской винде сделать так, чтобы инсталлятор на русском не крякозябрами показывал а нормальными буквами? »

mariolast, попробуйте один из вариантов:
1. В апплете Regional and Language Options жмакнуть Advanced и выставить для Language for non-Unicode programs значение Russian. Перезагруз.
2. Если в системе есть какие-нибудь кириллические шрифты (нет - подгрузить свой), то использовать один из них, например:
Код:

[LangOptions]
LanguageName=Russian
DialogFontName=Arial Cyr
WelcomeFontName=Arial Cyr
TitleFontName=Arial Cyr
CopyrightFontName=Arial Cyr


FX-DENIS 10-07-2012 00:27 1949040

Ребята подскажите.Проблема такая:нужно папку при установке инсталятора поместить в мои документы текущей системы и текущего пользователя,но так как системной переменной мои документы нет,то перепробовал несколько способов
1.бат файл,но сложно для меня

2.через секцию файлы
читать дальше »
Код:


 Source: "{userdocs}\ubisoft\*"; DestDir: "{userdocs}\ubisoft"; Flags: recursesubdirs replacesameversion createallsubdirs


папка ubisoft или создаеться без файлов внутри или создается с названием игры, а потом сама папка,если убрать флаг createallsubdirs то вообще ошибки или другие флаги применить, то ошибка на ошибке.

3.пробовал сжать нужную папку в SFX архив и запустить через секцию RUN ,но нет переменной мои документы,ну есть %MyDocuments% для ХP и %USERPROFILE%/Documents для 7,но я же не знаю на какой системе будет установлена игра,тогда придеться создавать скрипт который определяет какая система и в зависимости от этого запускает нужный SFX.

4.Способ которым сейчас пользуюсь, помог ,но все равно некрасивый и должен лежать рядом с Setup.exe
читать дальше »
Код:

[Run]
Filename: "{src}\UnRAR.exe"; WorkingDir: "{src}"; Parameters: "x -O+ Ubisoft.rar ""{userdocs}\"""; Flags: waituntilterminated


Может как то можно все таки через секцию файлы, средствами инно,без танцев и независимо какая система и текущий пользователь,поместить папку в мои документы,при этом с файлами внутри и чтобы не создавалась сначала папка названия игры.То есть ,не Driver San Francisco\ubisoft ,а просто ubisoft.Сейчас пользуюсь способом 4,подскажите новичку.
Sanchez здравствуй,опять маленький вопросик, пример№1 который мне помог Серега и пример №2 от тебя скрипт для приведения размера устанавливаемого файла из байтовой формы в удобочитаемую,в чем отличие,поподробнее,у Сереги считывает размер файла после его копирования (фактически всегда пишется размер предыдущего файла) и +большие файлы более 3гб корректно,а твой пример?Расскажи плюсы и недостатки,если не сложно. :oszone:

Johny777 10-07-2012 02:17 1949082

Цитата:

Цитата FX-DENIS
но так как системной переменной мои документы нет »

у тебя в коде константа {userdocs} и есть "Мои Докуметы" пользователя (текущего)
Хочешь скопировать папку "Ubisoft" с файлами в ней из "рядом с интсаллятором" в, например, C:\Users\Вася\Documents ?

Примеръ:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
Source:  {src}\Ubisoft\*;                DestDir: {userdocs}\Ubisoft;  Flags:  external              skipifsourcedoesntexist                        recursesubdirs                  createallsubdirs
;Откуда: снаружи\Ubisoft\содержимое(*);  Туда: мои документы\Ubisoft;  Флаги: (внешний) (пропустить(не выдавать ошибку) если источника нет))    (обрабатывать подкаталоги)  (создавть эти самые подкаталоги там)


FX-DENIS 10-07-2012 22:19 1949606

Джони я пробовал же,создается сначала в моих документах папка с названием самого приложения(игры),а потом внутри Ubisoft .если убрать флаги recursesubdirs createallsubdirs,то ошибки,то есть мне надо скопировать папку в мои документы текущего пользователя,без создания папки названия игры.И еще вопрос константа {userdocs} в XP сработает,как я понял это переменная самого инно,и ему не важно какая система?

t16bz 12-07-2012 10:19 1950446

Как сделать, чтобы компонет не становилсся жирным, когда его отмечаешь?

http://i43.fastpic.ru/big/2012/0712/...7de5319ba9.png

Код:

procedure InitializeWizard;
begin
  ExtractTemporaryFile('img.bmp')
  WizardForm.ComponentsList.WantTabs:=True;
  WizardForm.ComponentsList.LoadBGBmpFromFile(ExpandConstant('{tmp}\img.bmp'), WizardForm.ComponentsList.Left, WizardForm.ComponentsList.Top);
end;


Johny777 12-07-2012 12:12 1950528

t16bz,

WizardForm.ComponentsList.Flat := True;

t16bz 12-07-2012 12:28 1950541

Johny777, нет, это не помогло :(

Gnom_aka_Lexander 12-07-2012 12:36 1950545

t16bz,
Код:

WizardForm.ComponentsList.Font.Name := 'MS Sans Serif';
Дело, конечно не в шрифте, а в косяке китайцев, но факт остается фактом - выбор шрифта без ClearType-сглаживания вполне спасает

FX-DENIS 13-07-2012 01:29 1950978

Джони так поможешь ?

Johny777 13-07-2012 02:17 1950983

FX-DENIS,
в общем то уже!

Цитата:

Цитата FX-DENIS
мне надо скопировать папку в мои документы текущего пользователя,без создания папки названия игры »

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

Цитата FX-DENIS
константа {userdocs} в XP сработает ?»

ну поддержку XP товарищи ещё не отменили и константа одна, так что сам догадайся
давай ты выложи полные пути-примеры откуда, куда, что и из каких папок копируется, потому что я не совсем понимаю, что именно тебя не устраивает
...............................................................................
кажись понял
ты хочешь из рядом лежащей папки "Ubisoft" скопировать файлы в Мои Документы\папка названия игры\Ubisoft
ну припиши

... DestDir: {userdocs}\Driver San Francisco\Ubisoft; Flags: external skipifsourcedoesntexist

R.i.m.s.k.y. 13-07-2012 06:38 1951006

Johny777, FX-DENIS, мнээээ, а в шапке смотрели стандартные папки Windows ?
Код:

; Данный скрипт позволяет получить путь к стандартным папкам Windows

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[ Code]
const
  MAX_PATH = 260;
  // ниже приведён список id папок, путь которой хотим получить...
  // Виртуальный каталог, представляющий Рабочий стол. (Корень в проводнике)
  CSIDL_DESKTOP                = $0000;
  // Виртуальный каталог для Internet Explorer.
  CSIDL_INTERNET                = $0001;
  // Меню Пуск -> Программы
  CSIDL_PROGRAMS                = $0002;
  // Виртуальный каталог, содержащий иконки пунктов панели управления
  CSIDL_CONTROLS                = $0003;
  // Виртуальный каталог, содержащий установленные принтеры
  CSIDL_PRINTERS                = $0004;
  // Виртуальный каталог, представляющий папку "Мои документы"
  CSIDL_PERSONAL                = $0005;
  // До Vista ссылался на какталог "Мои документы" на жёстком диске
  // Избранное. (обычно C:\Documents and Settings\username\Favorites)
  CSIDL_FAVORITES              = $0006;
  // Пуск -> Программы -> Автозагрузка
  CSIDL_STARTUP                = $0007;
  // Недавние документы (обычно C:\Documents and Settings\username\My Recent Documents
  CSIDL_RECENT                  = $0008;
  // Папка, содержащая ярлыки меню "Отправить" (Sent to...) (обычно C:\Documents and Settings\username\SendTo)
  CSIDL_SENDTO                  = $0009;
  // Виртуальный каталог, содержащий файлы в корзине текущего пользователя
  CSIDL_BITBUCKET              = $000a;
  // Элементы меню Пуск текущего пользователя (обычно C:\Documents and Settings\username\Start Menu)
  CSIDL_STARTMENU              = $000b;
  // Рабочий стол текущего пользователя (обычно C:\Documents and Settings\username\Desktop)
  CSIDL_DESKTOPDIRECTORY        = $0010;
  // Виртуальный каталог, представляющий папку "Мой компьютер"
  CSIDL_DRIVES                  = $0011;
  // Виртуальный каталог, представляющий "Сетевое окружение"
  CSIDL_NETWORK                = $0012;
  // Папка "My Nethood Places" (обычно C:\Documents and Settings\username\NetHood)
  // В неё ссылки на избранные расшаренные ресурсы
  CSIDL_NETHOOD                = $0013;
  // Папка, содержащая установленные шрифты. (обычно C:\Windows\Fonts)
  CSIDL_FONTS                  = $0014;
  // Шаблоны документов. (Обычно Settings\username\Templates)
  CSIDL_TEMPLATES              = $0015;
  // Элементы меню Пуск для всех пользователей. (обычно C:\Documents and Settings\All Users\Start Menu)
  // Константы, начинающиеся на CSIDL_COMMON_ существуют только в NT версиях
  CSIDL_COMMON_STARTMENU        = $0016;
  // Меню Пуск -> программы для всех пользователей (обычно C:\Documents and Settings\All Users\Start Menu\Programs)
  CSIDL_COMMON_PROGRAMS        = $0017;
  // Меню Пуск -> Программы -> Автозагрузка для всех пользователей (обычно C:\Documents and Settings\All Users\Start Menu\Programs\Startup)
  CSIDL_COMMON_STARTUP          = $0018;
  // Элементы Рабочего стола для всех пользователей (обычно C:\Documents and Settings\All Users\Desktop)
  CSIDL_COMMON_DESKTOPDIRECTORY = $0019;
  // Папка, в которой рограммы должны хранить свои данные(C:\Documents and Settings\username\Application Data)
  CSIDL_APPDATA                = $001a;
  // Установленные принтеры. (обычно C:\Documents and Settings\username\PrintHood)
  CSIDL_PRINTHOOD              = $001b;
  // user's nonlocalized Startup program group. Устарело.
  CSIDL_ALTSTARTUP              = $001d;        // DBCS
  // Устарело
  CSIDL_COMMON_ALTSTARTUP      = $001e;        // DBCS
  // Ссылки "Избранное" для всех пользователей
  CSIDL_COMMON_FAVORITES        = $001f;
  // Временные Internet файлы (обычно C:\Documents and Settings\username\Local Settings\Temporary Internet Files)
  CSIDL_INTERNET_CACHE          = $0020;
  // Папка для хранения Cookies (обычно C:\Documents and Settings\username\Cookies)
  CSIDL_COOKIES                = $0021;
  // Хранит ссылки интернет истории IE
  CSIDL_HISTORY                = $0022;
  // Административные инструменты текущего пользователя (например консоль MMC). Win2000+
  CSIDL_ADMINTOOLS              = $30;
  // Папка для файлов, подготовленных к записи на CD/DVD
  // (Обычно C:\Documents and Settings\username\Local Settings\Application Data\Microsoft\CD Burning)
  CSIDL_CDBURN_AREA            = $3b;
  // Папка, содержащая инструменты администрирования
  CSIDL_COMMON_ADMINTOOLS      = $2f;
  // Папака AppData для всех пользователей. (обычно C:\Documents and Settings\All Users\Application Data)
  CSIDL_COMMON_APPDATA          = $23;
  // Папка "Общие документы" (обычно C:\Documents and Settings\All Users\Documents)
  CSIDL_COMMON_DOCUMENTS        = $2e;
  // Папка шаблонов документов для всех пользователей (Обычно C:\Documents and Settings\All Users\Templates)
  CSIDL_COMMON_TEMPLATES        = $2d;
  // Папка "Моя музыка" для всех пользователей. (обычно C:\Documents and Settings\All Users\Documents\My Music)
  CSIDL_COMMON_MUSIC            = $35;
  // Папка "Мои рисунки" для всех пользователей. (обычно C:\Documents and Settings\All Users\Documents\My Pictures)
  CSIDL_COMMON_PICTURES        = $36;
  // Папка "Моё видео" для всех пользователей (C:\Documents and Settings\All Users\Documents\My Videos)
  CSIDL_COMMON_VIDEO            = $37;
  // Виртуальная папка, представляет список компьютеров в вашей рабочей группе
  CSIDL_COMPUTERSNEARME        = $3d;
  // Виртуальная папка, представляет список сетевых подключений
  CSIDL_CONNECTIONS            = $31;
  // AppData для приложений, которые не переносятся на другой компьютер (обычно C:\Documents and Settings\username\Local Settings\Application Data)
  CSIDL_LOCAL_APPDATA          = $1c;
  // Виртуальный каталог, представляющий папку "Мои документы"
  CSIDL_MYDOCUMENTS            = $0c;
  // Папка "Моя музыка"
  CSIDL_MYMUSIC                = $0d;
  // Папка "Мои рисунки"
  CSIDL_MYPICTURES              = $27;
  // Папка "Моё видео"
  CSIDL_MYVIDEO                = $0e;
  // Папка пользователя (обычно C:\Documents and Settings\username)
  CSIDL_PROFILE                = $28;
  // Папка Program Files (обычно C:\Program Files)
  CSIDL_PROGRAM_FILES          = $26;
  CSIDL_PROGRAM_FILESX86        = $2a;
  // Папка Program Files\Common (обычно C:\Program Files\Common)
  CSIDL_PROGRAM_FILES_COMMON    = $2b;
  CSIDL_PROGRAM_FILES_COMMONX86 = $2c;
  // Папка для ресерсов. Vista и выше (обычно C:\Windows\Resources)
  CSIDL_RESOURCES              = $38;
  CSIDL_RESOURCES_LOCALIZED    = $39;
  // Папака System (обычно C:\Windows\System32 или C:\Windows\System)
  CSIDL_SYSTEM                  = $25;
  CSIDL_SYSTEMX86              = $29;
  // Папка Windows. Она же %windir% или %SYSTEMROOT% (обычно C:\Windows)
  CSIDL_WINDOWS                = $24;

function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL;
  external 'SHGetSpecialFolderPathA@shell32.dll stdcall';

function GetSpecialPath(CSIDL: Word): string;
var
  s:  string;
begin
  SetLength(s, MAX_PATH);
  if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then s := '';
  Result:= PChar(s);
end;

procedure InitializeWizard;
begin
  // определим расположение папки "Мои рисунки"
  MsgBox(GetSpecialPath(CSIDL_MYPICTURES), mbInformation, MB_OK);
end;


LordSP 13-07-2012 08:34 1951027

Ребят, доброе время суток! Столкнулся с такой проблемой, как при запуске инсталлятора, произвести проверку реестра на значение ключа, и вывести его в MsgBox. Чтобы призапуске появлялось сообщение: Ваша версия программы: "тут значение прочитанное из реестра"??? mbInformation, mbOK и если такое возможно, то эту версию вывести в label призапуске инсталлятора на странице wpWelcome, чтобы label сам считывал версию из реестра?

FX-DENIS 13-07-2012 12:08 1951146

Цитата:

Цитата R.i.m.s.k.y.
FX-DENIS, мнээээ »

это что?Грузин? Посмотрел называется CSIDL_MYDOCUMENTS ,и что?Ты думаешь любой мужик увидевший это ,сразу поймет как эту константу использовать?Чтоб использовать константу при копировании папки я так понимаю надо знать язык программирования Паскаль.Не одного примера как использовать их не нашел.Так ,что не надо язвить уважаемый.

Джони благодарствую.

Johny777 13-07-2012 12:55 1951195

Цитата:

Цитата FX-DENIS
... Так ,что не надо язвить уважаемый. »

Не наезжай на человека. Он тебе помочь хотел!
тот пример очень классный, тк содержит большое количество констант путей, которых нет в инно
прочитай сообщение автора http://forum.oszone.net/post-1218002-103.html
Цитата:

Цитата FX-DENIS
Не одного примера как использовать их не нашел »

внизу того же скрипта

наглядный, более практичный здесь http://krinkels.org/showpost.php?p=12005&postcount=532
только смыл?
зачем тебе китайские палочки, если есть вилка (читай константа {userdocs})

FX-DENIS 14-07-2012 01:17 1951556

Цитата:

Цитата Johny777
зачем тебе китайские палочки, если есть вилка (читай константа {userdocs}) »

Прочитал обе ссылки,присматривался,увидел только функции,но не увидел как указать какой файл скопировать и откуда,внешний или внутренний.В общем способ через {userdocs} будет для меня более упрощенным,спасибо вам.

L1nk3R 14-07-2012 01:53 1951562

Привет. Может подскажет кто, как добавить программу в исключение браундера через инно?

Цитата:

Цитата Johny777
Не наезжай на человека. Он тебе помочь хотел! »

Ага, им помогают а они ещё выёживаются. Лучше б спасибо нажали :(. Ведь пример дали не для одного а со всеми поделились.

Johny777 14-07-2012 02:40 1951566

L1nk3R,
вот тебе код для "добавления / удаления программ из правил брандмауэра Windows"
кто автор не знаю, но спасибо ему!

читать дальше »
Код:

;Добавление правила для брандмауэра Windows

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
OutputDir=.

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

[Icons]
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}

[code]
// Вспомогательные функции для установки Inno
// Используется для добавления / удаления программ из правил брандмауэра Windows
// Код, родом из http://news.jrsoftware.org/news/innosetup/msg43799.html

const
  NET_FW_SCOPE_ALL = 0;
  NET_FW_IP_VERSION_ANY = 2;

procedure SetFirewallException(AppName,FileName:string);
var
  FirewallObject: Variant;
  FirewallManager: Variant;
  FirewallProfile: Variant;
begin
  try
    FirewallObject := CreateOleObject('HNetCfg.FwAuthorizedApplication');
    FirewallObject.ProcessImageFileName := FileName;
    FirewallObject.Name := AppName;
    FirewallObject.Scope := NET_FW_SCOPE_ALL;
    FirewallObject.IpVersion := NET_FW_IP_VERSION_ANY;
    FirewallObject.Enabled := True;
    FirewallManager := CreateOleObject('HNetCfg.FwMgr');
    FirewallProfile := FirewallManager.LocalPolicy.CurrentProfile;
    FirewallProfile.AuthorizedApplications.Add(FirewallObject);
  except
  end;
end;

procedure RemoveFirewallException( FileName:string );
var
  FirewallManager: Variant;
  FirewallProfile: Variant;
begin
  try
    FirewallManager := CreateOleObject('HNetCfg.FwMgr');
    FirewallProfile := FirewallManager.LocalPolicy.CurrentProfile;
    FireWallProfile.AuthorizedApplications.Remove(FileName);
  except
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep=ssPostInstall then
    SetFirewallException('My Server', ExpandConstant('{app}')+'\TCPServer.exe');
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep=usPostUninstall then
    RemoveFirewallException(ExpandConstant('{app}')+'\TCPServer.exe');
end;


mariolast 15-07-2012 14:55 1952147

Цитата:

Цитата El Sanchez
Кто о наверняка сталкивался...
Как в английской винде сделать так, чтобы инсталлятор на русском не крякозябрами показывал а нормальными буквами? »
mariolast, попробуйте один из вариантов:
1. В апплете Regional and Language Options жмакнуть Advanced и выставить для Language for non-Unicode programs значение Russian. Перезагруз.
2. Если в системе есть какие-нибудь кириллические шрифты (нет - подгрузить свой), то использовать один из них, например:
Код:
[LangOptions]
LanguageName=Russian
DialogFontName=Arial Cyr
WelcomeFontName=Arial Cyr
TitleFontName=Arial Cyr
CopyrightFontName=Arial Cyr »

Так конечно же работает, но...нужен перегруз и т.д., что не есть удобно. Решение однако же нашел.
Для этого нужно было взять шрифт и отредактировать его так,чтобы на англ. винде кодировка нормально читалась, т.е. для каждой русс.буквы добавить кодировку. Делается это в редакторе шрифтов. Ну и в скрипте использовать уже этот шрифт. Я брал за основу Ариал и игрался с ним. В результате все работает как надо

t16bz 16-07-2012 10:33 1952626

Что нужно сделать, чтобы в TFolderTreeView была открыта определенная директория?

Johny777 16-07-2012 12:49 1952700

t16bz,
выделил жирным шрифтом строку

читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
EnableDirDoesntExistWarning=false                           
DefaultGroupName=Programs\Accessories

[Icons]
Name: {group}\Notepad; Filename: notepad.exe

[code]
var
  StartMenuTreeView : TStartMenuFolderTreeView;

Procedure ObjectOnClick(Sender: TObject);
Begin
case TObject(Sender) of
        StartMenuTreeView:        if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text := StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
        WizardForm.NoIconsCheck:        begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;


Procedure InitializeWizard;
begin
    WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1, WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height)
                WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick
                WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage
                WizardForm.NoIconsCheck.Show

  StartMenuTreeView := TStartMenuFolderTreeView.Create(WizardForm)
  with StartMenuTreeView do
        begin
                SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
          SetBounds(ScaleX(0), ScaleY(110), ScaleX(400), ScaleY(100))
          Parent:= WizardForm.SelectProgramGroupPage
                Cursor:= crHand
                OnChange:=@ObjectOnClick
        end;

  StartMenuTreeView.ChangeDirectory(ExpandConstant('{userprograms}\Programs\Accessories'), True);
end;


t16bz 16-07-2012 13:43 1952743

Johny777, а как еще можно сделать чтоб остальные директории сворачивались?

AndreY33_80 16-07-2012 16:39 1952868

Здраствуйте. Скажите пожалуйста, как можно убрать диалог создания ярлыка при установке ?

AndreY33_80 16-07-2012 16:43 1952871

Вложений: 1
на всякий случай привожу скрипт

читать дальше »
[code]
[Setup]

AppId={{639F03DD-4D24-4F21-9960-58D7944DAE91}
AppName=CCleaner
AppVersion=3.16
;AppVerName=CCleaner 3.16
DefaultDirName={pf}\CCleaner
DefaultGroupName=CCleaner
DisableDirPage=yes
DisableProgramGroupPage=yes
ShowLanguageDialog=no
DisableReadyPage=yes
DisableFinishedPage=yes
OutputBaseFilename=CCleaner
Compression=lzma/ultra
SolidCompression=yes

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

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

[Files]
Source: "C:\Program Files\CCleaner\CCleaner.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Program Files\CCleaner\CCleaner.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Program Files\CCleaner\ccleaner.ini"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Program Files\CCleaner\uninst.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Program Files\CCleaner\winapp2.ini"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Name: "{group}\CCleaner"; Filename: "{app}\CCleaner.exe"

Код:


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


alert30 16-07-2012 16:45 1952878

AndreY33_80, скрипт под спойлер, а по поводу убрания ярлыка на Рабочем столе; удалите:
Цитата:

Цитата AndreY33_80
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked »


AndreY33_80 16-07-2012 17:10 1952904

Прошу прощения, но я не совсем это имел в виду. Мне как раз нужно, чтобы ярлык на рабочем столе создавался. Но хотелось бы, чтобы при установке программы не нужно было бы ставить галочку наспротив надписи " Создать значёк на рабочем столе "

alert30 16-07-2012 17:15 1952910

AndreY33_80, автоматом, да, без выбора?

AndreY33_80 16-07-2012 17:15 1952911

Совершенно верно

Johny777 16-07-2012 17:37 1952936

AndreY33_80,
из твоего кода видно что строке в секции значков и так не присвоена задача, те по любому значок создастся вне зависимости
от того поставишь ты там (напротив надписи " Создать значёк на рабочем столе ") галку или нет
секцию задач ([Tasks]) или задачу сотри

t16bz,
не совсем понимаю что именно ты хочешь свернуть
у тебя развёрнуто то, что в строке жирным шрифтом прописано в качестве примера

AndreY33_80 16-07-2012 18:28 1952969

Если стереть секцию задач или сами задачи в ней, то при компиляции выскакивает ошибка.

У меня сейчас при запуске Setup появляется только вот это окно, в котором уже стоит галочука, остаётся только нажать далее...

Нельзя ли как нибудь иммитировать нажатие этой кнопки ?

Johny777 16-07-2012 19:15 1952981

Цитата:

Цитата AndreY33_80
Если стереть секцию задач или сами задачи в ней, то при компиляции выскакивает ошибка. »

у меня не выскакивает

у тебя страница приветствия скрывается так:
читать дальше »
Код:

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


проще будет через встроенную функцию ShouldSkipPage
а ещё проще через дерективу в секции [Setup]
DisableWelcomePage=yes

Цитата:

Цитата AndreY33_80
Нельзя ли как нибудь иммитировать нажатие этой кнопки ? »

дополнил пример из шапки "Спрятать окно инсталлятора" примером South "скрыть с панели задач"

вот тебе полностью тихая установка :) (ты ведь её хотел?)
читать дальше »
Код:

[Setup]
AppId={{639F03DD-4D24-4F21-9960-58D7944DAE91}
AppName=CCleaner
AppVersion=3.16
;AppVerName=CCleaner 3.16
DefaultDirName={pf}\CCleaner
DefaultGroupName=CCleaner
DisableDirPage=yes
DisableProgramGroupPage=yes
ShowLanguageDialog=no
DisableWelcomePage=yes
DisableReadyPage=yes
DisableFinishedPage=yes
OutputBaseFilename=CCleaner
Compression=lzma/ultra
SolidCompression=yes

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

[Files]
;Source: "C:\Program Files\CCleaner\CCleaner.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
;Source: "C:\Program Files\CCleaner\CCleaner.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
;Source: "C:\Program Files\CCleaner\ccleaner.ini"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
;Source: "C:\Program Files\CCleaner\uninst.exe"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
;Source: "C:\Program Files\CCleaner\winapp2.ini"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Name: "{group}\CCleaner"; Filename: "{app}\CCleaner.exe"



[code]
{ отобpажает или пpячет окно обpазом, указанным паpаметpом в nCmdShow }
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';

const
  { обычный клик }
  BM_CLICK = $00F5;

procedure CurPageChanged(CurPageID: Integer);
{ на старых версиях IS достаточно было указать
  WizardForm.NextButton.OnClick(WizardForm.NextButton);
  сейчас же стопориться на странице wpReady, обходится это таким образом }
begin
  { использую для скрытия окна мастера, в противном случае видно страницу wpInstalling }
  ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), SW_HIDE);
  { здесь нажимаем кнопку... }
  PostMessage(WizardForm.NextButton.Handle, BM_CLICK, 0, 0);
end;

////// прячем с панели задач /// начало
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';
//function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';  // есть сверху

procedure InitializeWizard;
var
  TAppHandle: HWND;
begin
  TAppHandle:=GetWindowLong(MainForm.Handle,-8);                      //получаем хэндл Application'a
  // *** убираем окно с экрана
  WizardForm.BorderStyle:=bsNone;
  WizardForm.Width:=0;
  WizardForm.Height:=0;
  // ****
  ShowWindow(TAppHandle,0);                                            //скрываем с панели задач
  SetWindowLong(TAppHandle,-20,GetWindowLong(TAppHandle,-20) or $80);  //скрываем от Alt+Tab
end;

/// конец


не забудь раскомментировать строки в секции файлов (удали толчки с запятыми перед каждой строкой)

И убери пожалуйста свой код выше в [more][code] твой код [/code][/more] ,чтобы было компактнее

AndreY33_80 16-07-2012 21:16 1953067

В принципе всё срабатывает, единственное что, ярлык на рабочем столе не создаётся и при попытке деинсталяции пишет "Внутренняя ошибка: Cannot find utCompiledCode record for this version of the uninstalller"

El Sanchez 16-07-2012 21:49 1953089

Цитата:

Цитата AndreY33_80
ярлык на рабочем столе не создаётся »

AndreY33_80, добавьте в секцию [Icons]:
Код:

;ярлык для пользователя, запустившего инсталлятор
Name: {userdesktop}\CCleaner; Filename: {app}\CCleaner.exe

;...или для всех пользователей
Name: {commondesktop}\CCleaner; Filename: {app}\CCleaner.exe

Цитата:

Цитата AndreY33_80
при попытке деинсталяции пишет "Внутренняя ошибка: Cannot find utCompiledCode record for this version of the uninstalller" »

AndreY33_80, удалите из папки установки лог-файл деинсталлятора unins000.dat, установите программу поверх существующей установки (будет создан новый лог), пробуйте удалять.

AndreY33_80 16-07-2012 22:20 1953109

С ярлыком разобрался, работает. По деинсталятору получается только как вы сказали... Возможно, не надо добавлять лог-файл деинсталлятора unins000.dat в мастер Inno Setup ?

AndreY33_80 17-07-2012 00:11 1953175

С деинсталятором тоже разобрался, достаточно не брать unins000.dat и unins000.exe.

Но теперь другая проблемма. Программа после установки только на английском языке.

AndreY33_80 17-07-2012 01:45 1953231

Всётаки въехал как все надо делать :yahoo:

я взял правда другую программу - CDBurnerXP

после долгих поисков у меняя получился следующий скрипт:


читать дальше »
[Setup]

AppId={{82E2DCFD-0A2B-4114-BBD7-65636084DB3F}
AppName=CDBurnerXP
AppVersion=4.1.1
;AppVerName=CDBurnerXP 4.1.1
DefaultDirName={pf}\CDBurnerXP
DefaultGroupName=CDBurnerXP
DisableDirPage=yes
DisableProgramGroupPage=yes
ShowLanguageDialog=no
DisableReadyPage=yes
DisableFinishedPage=yes
OutputDir=C:\Users\ANDREY\Desktop\Output
OutputBaseFilename=CDBurnerXP
Compression=lzma/ultra64
SolidCompression=true
InternalCompressLevel=ultra64

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

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

[Files]
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\cdbxpp.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\audio.ico"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\bass.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\Bass.Net.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\bass_ape.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\bass_mpc.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\basscd.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\bassflac.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\bassmix.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\basswma.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\basswv.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\CDBXP.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\cdbxpcmd.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\cdbxpcmd.exe.config"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\cdbxpcmd.exe.manifest"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\cdbxpp.exe.config"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\cdbxpp.exe.manifest"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\CsLib.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\data.ico"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\Interop.NMSDVDXLib.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\Interop.RocketDivision.StarBurnX.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\iso.ico"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\LogicNP.FileView.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\LogicNP.FolderView.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\LogicNP.ShComboBox.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\Native.CDBXP.manifest"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\Native.CsLib.manifest"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\NMSDVDXU.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\ogg.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\StarBurn.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\StarBurnX12.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\updater.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\updater.exe.config"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\vorbis.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\vorbisfile.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\Resources\*"; DestDir: "{app}\Resources"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Users\ANDREY\Desktop\Output\CDBurnerXP\ru-RU\*"; DestDir: "{app}\ru-RU"; Flags: ignoreversion recursesubdirs createallsubdirs


[Icons]
Name: "{group}\CDBurnerXP"; Filename: "{app}\cdbxpp.exe"
Name: "{group}\{cm:UninstallProgram,CDBurnerXP}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\CDBurnerXP"; Filename: "{app}\cdbxpp.exe";

[Registry]
Root: HKCU; SubKey: Software\Canneverbe Limited\CDBurnerXP; ValueType: string; ValueName: AppPath; ValueData: C:\Program Files\CDBurnerXP
Root: HKCU; SubKey: Software\Canneverbe Limited\CDBurnerXP; ValueType: string; ValueName: LastAutoUpdateCheck; ValueData: AAEAAAD/////AQAAAAAAAAAEAQAAAA9TeXN0ZW0uRGF0ZVRpbWUCAAAABXRpY2tzCGRhdGVEYXRhAAAJEM3/eLSxMc8Izf94tLExz4gL
Root: HKCU; SubKey: Software\Canneverbe Limited\CDBurnerXP\frmSelectProject; ValueType: string; ValueName: Size; ValueData: System.Drawing.Size:504,410
Root: HKCU; SubKey: Software\Canneverbe Limited\CDBurnerXP\frmSelectProject; ValueType: string; ValueName: Location; ValueData: System.Drawing.Point:260,164
Root: HKCU; SubKey: Software\Canneverbe Limited\CDBurnerXP\frmSelectProject; ValueType: string; ValueName: WindowState; ValueData: System.Int32:0

[code]
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';

const
BM_CLICK = $00F5;

procedure CurPageChanged(CurPageID: Integer);
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), SW_HIDE);
PostMessage(WizardForm.NextButton.Handle, BM_CLICK, 0, 0);
end;

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';
//function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';

procedure InitializeWizard;
var
TAppHandle: HWND;
begin
TAppHandle:=GetWindowLong(MainForm.Handle,-8);
WizardForm.BorderStyle:=bsNone;
WizardForm.Width:=0;
WizardForm.Height:=0;
ShowWindow(TAppHandle,0);
SetWindowLong(TAppHandle,-20,GetWindowLong(TAppHandle,-20) or $80);
end;

t16bz 17-07-2012 05:28 1953259

Цитата:

Цитата Johny777
не совсем понимаю что именно ты хочешь свернуть
у тебя развёрнуто то, что в строке жирным шрифтом прописано в качестве примера »

Есть окно, на нем TFolderTreeView и кнопка "OK" и "Отмена", если в TFolderTreeView разверну какую-нибудь директорию и нажму на кнопку "Отмена", то при повторном открытии эта директория будет открыта, а мне нужно сделать так, чтобы только была открыта директория указанная в WizardForm.DirEdit.

Johny777 17-07-2012 10:23 1953341

t16bz,
держи:
читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
DefaultGroupName=New_Folder
AllowNoIcons=yes

[Icons]
Name: {group}\Тествый значок; Filename: calc.exe Check: not No_Start_Icons

[code]
var
  StartMenuTreeView : TStartMenuFolderTreeView;
 
function No_Start_Icons: Boolean;
begin
    Result := WizardForm.NoIconsCheck.Checked;
end;
 
procedure GrpEditOnChange(Sender: TObject);
begin
  if WizardForm.GroupEdit.Text <> '{#SetupSetting("DefaultGroupName")}' then StartMenuTreeView.ChangeDirectory(ExpandConstant(WizardForm.GroupEdit.Text), True);
end;

procedure ObjectOnClick(Sender: TObject);
begin
  case Sender of
 
    StartMenuTreeView: if StartMenuTreeView.Directory <> '' then  WizardForm.GroupEdit.Text := StartMenuTreeView.Directory

    WizardForm.NoIconsCheck:
    begin
      with WizardForm do
      begin
        GroupEdit.Enabled := not NoIconsCheck.Checked;
        StartMenuTreeView.Enabled := not NoIconsCheck.Checked;
        GroupBrowseButton.Enabled := not NoIconsCheck.Checked;
      end;
    end;
   
  end;
end;


Procedure InitializeWizard;
begin
  with WizardForm do
  begin
    with NoIconsCheck do
    begin
      SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1, WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height
      OnClick:= @ObjectOnClick
    end;
   
    GroupEdit.OnChange := @GrpEditOnChange;
  end;

  StartMenuTreeView := TStartMenuFolderTreeView.Create(WizardForm)
  with StartMenuTreeView do
  begin
    SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
    SetBounds(ScaleX(0), ScaleY(110), ScaleX(400), ScaleY(100))
    Parent:= WizardForm.SelectProgramGroupPage
    Cursor:= crHand
    Directory := '{#SetupSetting("DefaultGroupName")}'
    OnChange:=@ObjectOnClick
  end;
       
  StartMenuTreeView.ChangeDirectory(ExpandConstant(WizardForm.GroupEdit.Text), True);
end;


при изменении эдита папки меню пуск меняется директория TFolderTreeView в и наоборот

Это глючный пример. Не использовать!
При редактировании эдита обновляется TStartMenuFolderTreeView и наоборот. Получается порочный круг жутких багов
(пробовал исправить по всякому в пределах своих ничтожных знаний и возможностей)
Кто допилит, тот будет удостоен похвалы, всеобщего признания и звания героя труда! :)
)

t16bz 17-07-2012 13:16 1953473

Johny777, все равно не выбранные директории не сворачиваются

L1nk3R 17-07-2012 18:03 1953693

t16bz, вот простой пример

читать дальше »
Код:

#define MyAppName "МояПрограмма"
#define MyAppVersion "1.5"
#define MyAppExeName "MyProg.exe"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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


[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

[ Code]
var
 TFV: TStartMenuFolderTreeView;


 procedure TFVOnChange(Sender: TObject);
 begin
 WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'{#MyAppName}';
 end;

procedure InitializeWizard;

begin
 TFV:= TStartMenuFolderTreeView.Create(WizardForm);
 TFV.Top:= WizardForm.GroupEdit.Top+28;
 TFV.Width:= 417;
 TFV.Height:= 100;
 TFV.SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{userstartup}'),ExpandConstant('{commonstartup}'));
 TFV.OnChange:= @TFVOnChange;
 TFV.Parent:= WizardForm.SelectProgramGroupPage;
end;


L1nk3R 17-07-2012 18:22 1953710

если кому надо то вот пример на папку установки

читать дальше »
Код:

#define MyAppName "МояПрограмма"
#define MyAppVersion "1.5"
#define MyAppExeName "MyProg.exe"

[Setup]
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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


[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"

[ Code]

var
 TDV: TFolderTreeView; 


procedure TDVOnChange(Sender: TObject);
 begin
 WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'{#MyAppName}';
 end;


procedure InitializeWizard;

begin
 TDV:= TFolderTreeView.Create(WizardForm);
 TDV.Top:= WizardForm.DirEdit.Top+28;
 TDV.Width:= 417;
 TDV.Height:= 100;
 TDV.OnChange:= @TDVOnChange;
 TDV.Parent:= WizardForm.SelectDirPage;
end;


Ivan_009 18-07-2012 14:39 1954223

Как сделать так чтобы при нажатии на кнопку музыки выезжала такая форма :search: заранее спасибо.

Johny777 18-07-2012 18:47 1954373

Вот те Ваня:

http://forum.oszone.net/post-1917570-2069.html
http://forum.oszone.net/post-1917597-2071.html
http://forum.oszone.net/post-1917798-2074.html

какая ссылка на тебя смотрит ту и открывай! :)

AndreY33_80 18-07-2012 19:28 1954405

Скажите, а возможно сделать так, чтобы при нажатии ярлыка деинсталяция, само удаление программы проходило без вмешательства пользователя ? через inno setup можно так переделать uninstall.exe ?

alert30 18-07-2012 19:49 1954423

AndreY33_80, типо чтоб не было "Вы хотите удалить..."?

Gnom_aka_Lexander 18-07-2012 19:58 1954429

AndreY33_80,
В параметрах ярлыка можно указать ключ тихого удаления:
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Icons]
Name: {group}\{cm:UninstallProgram, My Application}; Filename: {uninstallexe}; Parameters: /SILENT;

По поводу спасибо - там внизу есть такая кнопочка - Полезное сообщение - мне жутко нравится, когда ее жмут.

AndreY33_80 18-07-2012 20:12 1954435

:) :up Спасибо

AndreY33_80 18-07-2012 20:32 1954447

если делать так :

Name: "{group}\{cm:UninstallProgram,CDBurnerXP}"; Filename: "{uninstallexe}" Parameters: /SILENT;

то выдаётся ошибка :

mismatched or misplaced quotes on parameter "Filename"

Gnom_aka_Lexander 18-07-2012 20:34 1954450

Цитата:

Цитата AndreY33_80
mismatched or misplaced quotes on parameter "Filename" »

Цитата:

Цитата GOOGLE
несоответствие или неуместные кавычки в параметре "Filename"

убери кавычки, у меня их не было.
Цитата:

Цитата Gnom_aka_Lexander
Filename: {uninstallexe}; »


AndreY33_80 18-07-2012 21:32 1954476

А окно при деинсталяции как можно скрыть ?

Gnom_aka_Lexander 18-07-2012 21:45 1954486

Код:

[Icons]
Name: {group}\{cm:UninstallProgram, My Application}; Filename: {uninstallexe}; Parameters: /VERYSILENT;


t16bz 19-07-2012 05:36 1954620

Возможно ли как-то изменить окно выбора папки установки? Если да, поделитесь, пожалуйста, примером.

mariolast 19-07-2012 09:54 1954694

[q=El Sanchez]определение рабочей папки процесса:
« скрыть
Код:
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_QUERY_INFORMATION = $400;
    PROCESS_VM_READ = $10;
    MAX_PATH = 260;

type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of char;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
#endif
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';


function GetProcessWorkingDirectory(ProcessName: String): TArrayOfString;
var
    hProcessSnap, hProc: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile: array [0..MAX_PATH-1] of Char;
    szProcName: String;
    i, iLen: Integer;
begin
    SetArrayLength(Result, 0);
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    pe32.dwSize := sizeof(pe32);
    if not Process32First(hProcessSnap, pe32) then Exit;
    while Process32Next(hProcessSnap, pe32) do
    begin
        szProcName := '';
        while not (pe32.szExeFile[Length(szProcName)] = #0) do szProcName := szProcName + pe32.szExeFile[Length(szProcName)];
        if CompareText(szProcName, ProcessName) = 0 then
        begin
            hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pe32.th32ProcessID);
            iLen := GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH);
            if iLen > 0 then
            begin
                SetArrayLength(Result, GetArrayLength(Result)+1);
                for i := 0 to iLen-1 do Result[GetArrayLength(Result)-1] := Result[GetArrayLength(Result)-1] + szExeFile[i];
                Result[GetArrayLength(Result)-1] := RemoveBackSlash(ExtractFilePath(Result[GetArrayLength(Result)-1]));
            end;
            CloseHandle(hProc);
        end;
    end;
    CloseHandle(hProcessSnap);
end;

procedure InitializeWizard();
var
    szArray: TArrayOfString;
    i: Integer;
begin
    //хочу знать откуда калькуляторы запущены
    szArray := GetProcessWorkingDirectory('calc.exe');
    if GetArrayLength(szArray) > 0 then for i := 0 to GetArrayLength(szArray)-1 do MsgBox(szArray[i], mbInformation, MB_OK);
end;

С 64-битными процессами не катит. Как пример, калькулятор или ArchiCAD.exe на Windows7-64
ArchiCAD.exe 32-битный видится, 64-битный такой же процесс. нет.
Может кто поправить?

Gnom_aka_Lexander 19-07-2012 10:44 1954713

Цитата:

Цитата Johny777
реестр для меня тёмный лес »

Без разницы, в принципе. если запускать деинсталл напрямую - то тихого удаления не будет в любом случае. Тогда уж нужно объединять ярлык и реестр - ярлык дает тихое удаление из меню пуск а реестр - из панели управления.

Johny777 19-07-2012 11:44 1954744

Gnom_aka_Lexander,

можно так (спасибо El Sanchez-у)
тихое удаление (с месседжбоксом "Да Нет" вначале и в конце (удаление завершено Ок)):
читать дальше »
Код:

#define MyAppName "DisksInfo"

[Setup]
AppName=DisksInfo
VersionInfoVersion=7.1
AppVerName=DisksInfo
DefaultDirName={pf}\My program

[code]
function InitializeUninstall(): Boolean;
var
    Errorcode: Integer;
begin
    Result := False;

    if not UninstallSilent then
    begin
        Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
        Exit;
    end;

    if MsgBox(FmtMessage(SetupMessage(msgConfirmUninstall), ['{#MyAppName}']), mbInformation, MB_YESNO) = idYes then
    begin
        Result := True;
        MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#MyAppName}']), mbInformation, MB_OK);
    end
    else Result := False;
end;



полностью тихое удаление:
читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=7.1
AppVerName=DisksInfo
DefaultDirName={pf}\My program

[code]
function InitializeUninstall(): Boolean;
var
    ErrorCode: Integer;
begin
    Result := False;

    if not UninstallSilent then
    begin
        Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
        Exit;
    end;

    Result := True;
end;



=======================================================================

Цитата:

Цитата t16bz
Возможно ли как-то изменить окно выбора папки установки? Если да, поделитесь, пожалуйста, примером. »

t16bz, выдираю у себя из скрипта! :)

читать дальше »
Код:

[Setup]
AppId=The_Most_Beautiful_and_Unicue_AppId_Ever_Made
AppName=The_Best_App
VersionInfoVersion=7.1
AppVerName=The_Best
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\The_Best_App}


[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl;
Name: English; MessagesFile: compiler:Languages\English.isl;


[CustomMessages]
Russian.Reset=Сброс
English.Reset=Reset


[code]
var
  BrowseForm: TSetupForm;
  DirTreeView: TFolderTreeView;
  Edit: TNewEdit;


procedure DirFolderChange(Sender: TObject);
begin
  if DirTreeView.Directory <> WizardForm.DirEdit.Text then
  Edit.Text := AddBackslash(DirTreeView.Directory) + '{#SetupSetting("AppName")}' else
  Edit.Text := DirTreeView.Directory;
end;


procedure BrowseForm_Buttons_OnClick(Sender: TObject);
begin
  case TButton(Sender).Tag of
    15: Edit.Text := RemoveBackslashUnlessRoot(ExpandConstant('{#SetupSetting("DefaultDirName")}'));

    16: begin
          DirTreeView.CreateNewDirectory(SetupMessage(msgNewFolderName));
          Edit.Text := AddBackslash(DirTreeView.Directory) + '{#SetupSetting("AppName")}';
        end;

    17: if Edit.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := Edit.Text;
  end;
end;



procedure BrowseClick(Sender: TObject);
begin
  BrowseForm := CreateCustomForm();
  with BrowseForm do
  begin
    Width := ScaleX(389);
    Height := ScaleY(390);
    Caption := SetupMessage(msgBrowseDialogTitle);
    CenterInsideControl(WizardForm, False);

    with TLabel.Create(nil) do
    begin
      SetBounds(ScaleX(7), ScaleY(4), ScaleX(207), ScaleY(16));
      Caption := SetupMessage(msgBrowseDialogLabel);
      Parent := BrowseForm;
      Font.Size := 8;
    end;

    DirTreeView := TFolderTreeView.Create(nil)
    with DirTreeView do
    begin
      SetBounds(ScaleX(4), ScaleY(52), ScaleX(376), ScaleY(265));
      OnChange := @DirFolderChange;
      Parent := BrowseForm;
    end;

    Edit := TNewEdit.Create(nil);
    with Edit do
    begin
      SetBounds(ScaleX(4), ScaleY(25), ScaleX(376), ScaleY(21));
      Text := DirTreeView.Directory;
      Parent := BrowseForm;
      Font.Color := clWindowText;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(4), ScaleY(330), ScaleX(90), ScaleX(22));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonCancel);
      Cursor := crHand;
      ModalResult := mrCancel;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(99), ScaleY(330), ScaleX(90), ScaleY(22));
      Parent := BrowseForm;
      Caption := ExpandConstant('{cm:Reset}');
      Tag := 15;
      Cursor := crHand;
      OnClick := @BrowseForm_Buttons_OnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(194), ScaleY(330), ScaleX(90), ScaleY(22));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonNewFolder);
      Tag := 16;
      Cursor := crHand;
      OnClick := @BrowseForm_Buttons_OnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(289), ScaleY(330), ScaleX(90), ScaleY(22));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonOK);
      Tag := 17;
      OnClick := @BrowseForm_Buttons_OnClick;
      Cursor := crHand;
      ModalResult := mrOk;
    end;

    DirTreeView.ChangeDirectory(AddBackslash(WizardForm.DirEdit.Text), True);
    ShowModal;
    Free;
  end;
end;

procedure InitializeWizard;
begin
  WizardForm.DirBrowseButton.Hide;
 
  with TButton.Create(nil) do
  begin
    Parent := WizardForm.SelectDirPage;
    SetBounds(WizardForm.DirBrowseButton.Left, WizardForm.DirBrowseButton.Top, WizardForm.DirBrowseButton.Width, WizardForm.DirBrowseButton.Height - ScaleY(1));
    Caption := SetupMessage(msgButtonBrowse);
    OnClick := @BrowseClick;
    Cursor := crHand;
  end;
end;



отличия:
у меня по определённым причинам новая папка имеет название New Folder
здесь вернул константу
изменил координаты расположения окна (у меня окно инсталла больше стандартного и поэтому координаты другие)

L1nk3R 19-07-2012 21:13 1955026

Привет.
Может кто подскажет,возможно ли как то сделать чтоб при нажатии например на кнопку Button появлялась форма?
На примере этого поста http://forum.oszone.net/post-1954373-453.html, только не выкатывалась а появлялась, ну в общем почти как контекстное меню.

Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Icons]
Name: "{commondesktop}\Моя программа"; Filename: "{app}\MyProg.exe"

[*Code]
var
  Button: TNewButton;
procedure RedesignWizardForm;
begin
  Button := TNewButton.Create(WizardForm);
  with Button do
  begin
    Name := 'Button';
    Parent := WizardForm.SelectProgramGroupPage;
    Left := ScaleX(342);
    Top := ScaleY(104);
    Width := ScaleX(75);
    Height := ScaleY(25);
  end;

  Button.TabOrder := 5;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;

Спасибо.

L1nk3R 20-07-2012 03:14 1955154

Где посмотреть? Тихое удаление не нужно. Причём тут тихое удаление?
Надо чтоб например рядом с кнопкой [Обзор] была такая кнопочка со стрелочкой при нажатии на которую выпадала форма как контекстное меню. Только чтоб находилась рядом с кнопкой (под кнопкой), чтоб нельзя было двигать и не было крестика закрыть. Кликнул - Открылась, кликнул ещё раз или на основную форму или даже на рабочем столе, то она сама закрылась.

Почти так
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
OutputDir=.

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

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

[*Code]
var
  Button: TNewButton;

procedure Button1Click(Sender: TObject); forward;

function CreateForm: Integer;
begin
  with CreateCustomForm do
  begin
    ClientWidth := ScaleX(256);
    ClientHeight := ScaleY(256);
    Position := poScreenCenter;
    ShowModal;
    Free;
  end;
end;

procedure Button1Click(Sender: TObject);
begin
  CreateForm;
end;

procedure RedesignWizardForm;
begin
  with WizardForm.DirBrowseButton do
  begin
    Left := ScaleX(310);
  end;

  with WizardForm.DirEdit do
  begin
    Width := ScaleX(300);
  end;
 
  Button := TNewButton.Create(WizardForm);
  with Button do
  begin
    Name := 'Button';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(384);
    Top := ScaleY(67);
    Width := ScaleX(27);
    Height := ScaleY(23);
    Caption := '..';
    OnClick := @Button1Click;
  end;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;

но не так.
Даже не знаю как объяснить.

Johny777 20-07-2012 12:01 1955353

L1nk3R, ну ты чувак спросил
Цитата:

Цитата L1nk3R
возможно ли как то сделать чтоб при нажатии например на кнопку Button появлялась форма? »

Цитата:

Цитата L1nk3R
Где посмотреть? »

во второй половине адресованной товарищу t16bz пример в которм при нажатии на кнопку "обзор" создаётся форма обзора *(кастомная). Это самый точный ответ и был! :)
теперь я начал понимать...
ты ведь типа такого хочешь (контекстное меню = PopUp Menu выпадает из кнопки)?

пример:
читать дальше »
Код:

#ifdef IS_ENHANCED
  #if (Ver < 0x5020300) || (Pos('ee', IS_Ver_Str) < 1)
    #pragma error 'Enhanced edition of Inno Setup (5.2.3.ee1 or higher) is required to compile this script'
  #endif
#else
  #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra       
PrivilegesRequired=none
OutputDir=userdocs:Inno Setup Examples Output

[code]
var
  PupMnu: TPopupMenu;
  btn: TButton;
 
procedure BtnOnClick(Sender: TObject);
var
  p: TPoint;
begin
  p.x := btn.Left;
  p.y := btn.Top + btn.Height;
  p := Wizardform.ClientToScreen(p);
  PupMnu.Popup(p.x, p.y);
end;

procedure Menu1OnClick(Sender: TObject);
begin
  MsgBox('Menu 1 OnClick!', mbInformation, MB_OK);
end;

procedure Menu2OnClick(Sender: TObject);
begin
  MsgBox('Menu 2 OnClick!', mbInformation, MB_OK);
end;

procedure InitializeWizard();
var
  Mnu: TMenuItem;
begin
  PupMnu := TPopupMenu.Create(WizardForm);
  // Menu 1
  Mnu := TMenuItem.Create(WizardForm);
  Mnu.Caption := 'Menu 1';
  Mnu.OnClick := @Menu1OnClick;
  PupMnu.Items.Add(Mnu);
  // Menu 2
  Mnu := TMenuItem.Create(WizardForm);
  Mnu.Caption := 'Menu 2';
  Mnu.OnClick := @Menu2OnClick;
  PupMnu.Items.Add(Mnu);
  // btn
  btn := TButton.Create(WizardForm);
  btn.Caption := 'Popup Menu';
  btn.SetBounds(ScaleX(10), ScaleY(320), ScaleX(100), ScaleY(28));
  btn.Parent := WizardForm;
  btn.OnClick := @BtnOnClick;
  btn.PopupMenu := PupMnu;
end;



и убери пожалуйста оба своих кода дополнительно под спойлер в [more] твой код [/more]

El Sanchez 20-07-2012 13:21 1955425

Цитата:

Цитата mariolast
С 64-битными процессами не катит. Как пример, калькулятор или ArchiCAD.exe на Windows7-64
ArchiCAD.exe 32-битный видится, 64-битный такой же процесс. нет. »

mariolast, все из-за GetModuleFileNameEx:
Цитата:

Цитата MSDN
However, it will result in an error (ERROR_PARTIAL_COPY) when a 32-bit client is calling this function on a 64-bit process.

Переделал через GetProcessImageFileName, как на MSDN советовали.

Johny777 20-07-2012 13:42 1955445

El Sanchez,
может есть более быстрый способ определения размера папки с выводом Integer?
http://forum.oszone.net/post-1953820-451.html
если нет, то не проблема
могу просто проверить само наличие папки :)

Gnom_aka_Lexander 20-07-2012 13:53 1955455

Вложений: 1
IsProc2.dll поскольку проект IsProc был заброшен, по всей видимости, (я чего-то даже ссылку сейчас не нашел...) и давно не соответствует реалиям жизни (кривая работа в Windows Vista и выше), набросал аналог, с учетом именно этих систем. Работа в системе ниже ХР не гарантируется.
Точнее, могу гарантировать ошибки на системе ниже ХР :)
Итак, встречаем:
Библиотека, выводящая список процессов в указанной папке, с возможностью их закрытия.
Скачать
Тестим, отписываемся.
С закрытием процессов - аккуратнее, внимательнее указываем папку процесса. потом встрою защиту от закрытия процессов из системных папок.
А я пока, в деревню на грядки поехал :)

El Sanchez 20-07-2012 15:35 1955529

Цитата:

Цитата Johny777
может есть более быстрый способ определения размера папки с выводом Integer? »

Johny777, нету. Только считать.

Цитата:

Цитата Gnom_aka_Lexander
Библиотека, выводящая список процессов в указанной папке, с возможностью их закрытия. »

Gnom_aka_Lexander, не импортируются функции - Cannot import dll бла-бла. WinXP SP3 x86.
P.S. Из-за QueryFullProcessImageName. Эта функция от Vista и выше.

Gnom_aka_Lexander 20-07-2012 15:45 1955538

El Sanchez, Юникод? писал под анси, там явный вызов именно ансишных функций.

El Sanchez 20-07-2012 16:44 1955596

Цитата:

Цитата Gnom_aka_Lexander
Юникод? писал под анси, там явный вызов именно ансишных функций »

Gnom_aka_Lexander, у меня ANSI. Дело не в компиляторе, проблема в вызове функции QueryFullProcessImageName (читать статью и Community Additions), которая находится в kernel32.dll, начиная с Vista.

Gnom_aka_Lexander 20-07-2012 16:55 1955600

El Sanchez,Уже понял, обойдусь без нее. Как всегда придется через задницу делать.. Но возможности задницы, как известно, практически неограниченны :D

L1nk3R 20-07-2012 21:02 1955778

Привет.
Цитата:

Цитата Johny777
теперь я начал понимать...
ты ведь типа такого хочешь (контекстное меню = PopUp Menu выпадает из кнопки)? »

Именно оно самое. Только чтоб форма выпадала на которую можно б было повесить кнопочку или тот же GroupBox.

Johny777, а там препроцессор обязателен или как то можно обойтись без него?

alert30 23-07-2012 19:12 1957346

Добрый вечер! После копирование архивов *.arc и его распаковки, я хочу удалить. После удаления, удаляется только архив *.arc, а вот распакованный архив нет. Как сделать так, чтобы вместе удалились и где дописывать этот код, чтобы удалить вместе с файлом, который распаковался из *.arc? Вот скрипт.

Johny777 23-07-2012 20:06 1957371

может так
[UninstallDelete]
Type: filesandordirs; Name: {app} // трет всю папку в которую уcтановил

alert30 23-07-2012 20:09 1957374

Johny777, нет, файлы, которые уже распаковались из этого архива *.arc; вот мне надо удалить распакованные файлы. Архив *.arc удаляется, а вот распакованные файлы остаются.

Johny777 23-07-2012 20:25 1957382

alert30,
поправил предыдущий пост

alert30 23-07-2012 20:42 1957395

Johny777, еще, есть скрипт, который после установки и распаковки удаляет архив *.arc?

Johny777 23-07-2012 21:11 1957422

alert30,
ты про это

Type: files; Name: {app}\FileName.arc
тип: файлы; имя(файла): {app}\FileName.arc
...
?

alert30 23-07-2012 23:30 1957514

Johny777, спасибо, сам доделал, кому нужен - вот код, чтобы удалить файл или архив после установки и распаковки:
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  SetStateNewButtons;

  if CurPageID = wpFinished then
  begin
    DeleteFile(ExpandConstant('{app}\update.arc'));
  end;
  ImgApplyChanges(WizardForm.Handle);
end;


Johny777 24-07-2012 00:38 1957535

alert30,
старайся как можно меньше вешать в переключение страниц CurPageChanged, тк они могут переключаться с тормозами, что не есть хрошо и красиво
в данном случае лучше используй этапы установки ssPostInstall(после установки) или ssDone(после нажатия на кнопку завершить на финишной странице)
всё что можно реализуй в procedure InitializeWizard();
пример:
читать дальше »
Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case
    CurStep of
    ssPostInstall:
    begin
      DeleteFile(ExpandConstant('{app}\update.arc'));
      ImgApplyChanges(WizardForm.Handle);
    end;
   
    ssDone: тоже самое
  end;
end;



что такое ImgApplyChanges(WizardForm.Handle); ?

alert30 24-07-2012 01:03 1957545

Johny777, у меня другая проблема ISArcExtract:
Так вот написал так:
Код:

if not ISArcExtract ( 0, 0, ExpandConstant('{userdesktop}\RK14\RK\rk.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
компилированный сетапник с BIN-ами ищет то, что указано в коде {userdesktop}\RK14\RK\rk.arc и распаковывается, а Вот проблема в том, что я хочу на диск записывать и чтоб распаковалось из диска в HDD, компилированный сетапник с BIN-ами перенес в папку ISO, чтоб правильно тестировался финишной установки и можно смело записать на диск; запускаю из папки ISO компилированный сетап с BIN-ами, по поздним заданним путям из кода {userdesktop}\RK14\RK\rk.arc файл-архив rk.arc удалил, т.к. уже в внутри образа формата BIN-а, после нажатия "Установить" выдает такую ошибку: "Не найден ни одного файла ISArcExtract", но дело в том, что уже в внутри BIN-е, а не этим путям, как сделать так, что инсталлятор видел BIN-a сразу распаковался, а не из пути моего компьютера, т.е. {userdesktop}\RK14\RK\rk.arc (rk.arc удалил).

Johny777 24-07-2012 01:19 1957558

alert30,
положи архив рядом с экзешником
юзай константу {src} (внешний)
кажись так
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\rk.arc'), ExpandConstant('{src}'), '', false, '', '', ExpandConstant('{src}'), notPCFonFLY {PCFonFLY}) then break;

======================================================

у меня возник вопрос
наткнулся на этап установки ssPreInstall
но кажется он не работает
в справке о нём ни слова (значит он одно из расширений)
выделил жирным в коде:
читать дальше »
Код:

[Setup]
SourceDir=.
AppName=1
AppVerName=1
DefaultDirName={pf}\1


[code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  case
    CurStep of
    ssPreInstall: MsgBox('Не работает?',mberror,MB_ok);
    ssInstall: MsgBox('начало учтановки',mberror,MB_ok);
    ssPostInstall: MsgBox('после установки',mberror,MB_ok);
    ssDone: MsgBox('после завершения работы инсталла',mberror,MB_ok);
  end;
end;



==================================================

а также улучшил код "фоновый рисунок в зависимости от разрешения" под свои нужнды
(блин, мои нужды - это один единственный инсталл)
было так:
читать дальше »
Код:

[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\AppName

[Files]
Source: 640.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 800.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1024.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1152.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1280.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1600.bmp; DestDir: {tmp}; Flags: dontcopy

[code]
function GetDC(HWND: DWord): DWord;
external 'GetDC@user32.dll stdcall';

function GetDeviceCaps(DC: DWord; Index: Integer): Integer;
external 'GetDeviceCaps@gdi32.dll stdcall';

function ReleaseDC(HWND: DWord;DC: DWord): Integer;
external 'ReleaseDC@user32.dll stdcall';

function ShowWindow(hWnd: DWord; nCmdShow: Integer): boolean;
external 'ShowWindow@user32.dll stdcall';

function SetWindowLong(hWnd: DWord; nIndex: Integer; dwNewLong: Longint): Longint;
external 'SetWindowLongA@user32.dll stdcall';

procedure InitializeWizard();
var
bgImage : TBitmapImage;
bgImageName: String;
width: integer;
dc: DWord;

begin
bgImage:=TBitmapImage.Create(MainForm)
bgImage.Align:=alClient
bgImage.Stretch:=True
bgImage.Parent:=MainForm

dc:=GetDC(MainForm.Handle)
width:=GetDeviceCaps(dc,8)
ReleaseDC(MainForm.Handle,dc)

if width <=640 then
bgImageName:='640.bmp'

else if width<=800 then
bgImageName:='800.bmp'

else if width<=1024 then
bgImageName:='1024.bmp'

else if width<=1152 then
bgImageName:='1152.bmp'

else if width<=1280 then
bgImageName:='1280.bmp'

else
bgImageName:='1600.bmp'

ExtractTemporaryFile(bgImageName)
bgImage.bitmap.LoadFromFile(expandConstant('{tmp}\'+bgImageName))

SetWindowLong(MainForm.Handle,-16,$80000000)
ShowWindow(Mainform.Handle,SW_SHOWMAXIMIZED)
end;



недоработка кода выше это то что проверяется только ширина монитора
те при ширине на 16 9 = 1280 на 720 или 800(16 10) и при ширине 1280 на 1024(4 3)
будет одна и та же картинка
стало так:
читать дальше »
Код:

[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\AppName

[Files]
Source: Backgr_Pic\169.bmp; Flags: dontcopy solidbreak nocompression  sortfilesbyextension
Source: Backgr_Pic\43.bmp; Flags: dontcopy solidbreak nocompression  sortfilesbyextension
Source: Backgr_Pic\1610.bmp; Flags: dontcopy solidbreak nocompression  sortfilesbyextension
Source: Backgr_Pic\finish.bmp; Flags: dontcopy solidbreak nocompression  sortfilesbyextension

[code]
function GetDC(HWND: DWord): DWord; external 'GetDC@user32.dll stdcall';
function GetDeviceCaps(DC: DWord; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function ReleaseDC(HWND: DWord;DC: DWord): Integer; external 'ReleaseDC@user32.dll stdcall';
function ShowWindow(hWnd: DWord; nCmdShow: Integer): boolean; external 'ShowWindow@user32.dll stdcall';
function SetWindowLong(hWnd: DWord; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';

procedure InitializeWizard();
var
  bgImage : TBitmapImage;
  bgImageName: String;
  Width, Height: integer;
  dc: DWord;

begin
  dc := GetDC(MainForm.Handle);
  Width := GetDeviceCaps(dc,8);
  Height := GetDeviceCaps(dc,10);
  ReleaseDC(MainForm.Handle,dc);

  if ((Width = 1280) and (Height = 720)) or
    ((Width = 1366) and (Height = 768)) or
    ((Width = 1600) and (Height = 900)) or
    ((Width = 1920) and (Height = 1080)) or
    ((Width = 2560) and (Height = 1440))
  then bgImageName := '169.bmp'

  else

  if ((Width = 1024) and (Height = 768)) or
    ((Width = 1152) and (Height = 864)) or
    ((Width = 1280) and (Height = 900)) or
    ((Width = 1280) and (Height = 1024)) or
    ((Width = 1600) and (Height = 1200))
  then bgImageName := '43.bmp'

  else

  if ((Width = 1280) and (Height = 768)) or
    ((Width = 1280) and (Height = 800)) or
    ((Width = 1440) and (Height = 900)) or
    ((Width = 1600) and (Height = 1024)) or
    ((Width = 1680) and (Height = 1050))
  then bgImageName := '1610.bmp'

  else

  if ((Width > 1920) and (Height > 1080))
  then bgImageName := 'finish.bmp'

  bgImage:=TBitmapImage.Create(MainForm)
  with bgImage do
  begin
    Align := alClient;
    Stretch := True;
    Parent:=MainForm;
    ExtractTemporaryFile(bgImageName);
    Bitmap.LoadFromFile(expandConstant('{tmp}\'+ bgImageName))
  end;

  SetWindowLong(MainForm.Handle,-16,$80000000)
  ShowWindow(Mainform.Handle,SW_SHOWMAXIMIZED)
end;


скорость обработки (4 if) высокая и точность
пользуйтесь кто хочет (выдрал у себя из кода)!
finish.bmp это если разрешение выше так называемого фулл хд
сделан учётом далёкого будущего
разрешение картинки 3840 на 2160

Yury_Prizrak 25-07-2012 14:37 1958506

Люди, может кто-то сталкивался. Проблема очень неприятная, для меня, во всяком случае. Инсталл, который я пишу использует InnoSetupForms, поля в них инициализируются 2 вариантами: если программа не была установлена - то по умолчанию, если была - то с конфигурационного файла. По завершении установки конфигурационный файл перезаписывается значениями из полей форм.
Теперь вопрос: как сделать возможность проверки на наличие программы и, если она есть, скрыть дополнительные формы(но при этом чтобы конфиг файл не пострадал при перезаписи)

Yury_Prizrak 25-07-2012 17:52 1958641

И еще, как выщемить название страницы(или ее ID) на которой предлагается создать ярлыки для текущего и для всех пользователей. Заранее спасибо :)

Ivan_009 26-07-2012 16:41 1959331

Как решить данную задачу открываю я скрипт а там пустое окно

R.i.m.s.k.y. 26-07-2012 16:44 1959333

если поставить курсор в поле где должен быть скрипт и нажать CTRL+A (англ) что-нибудь изменится?

Ivan_009 26-07-2012 16:57 1959345

R.i.m.s.k.y., нет

alert30 26-07-2012 17:06 1959349

Ivan_009, попробуйте использовать сторонние программы генераторы-компиляторы Inno.

Ivan_009 26-07-2012 17:23 1959360

alert30, проблема решилась путем перезагрузки компа :)

R.i.m.s.k.y. 26-07-2012 17:25 1959362

Ivan_009, темп почистить не забудь
в дополнение предположу что своп выключен

Johny777 26-07-2012 18:26 1959413

Вышла расширенная версия Inno setup 5.5.1

внизу страницы
http://restools.hanzify.org/article.asp?id=89

TEKTON 27-07-2012 21:25 1960297

Всем привет!
Вопрос такой:
Как подключить к основному скрипту, дополнительные скрипты с кодом.
Пробовал как в секциях [Files] и [Registry] добавить

Код:

[Files]
#include "Program Files\Files.iss"

[Registry]
#include "REGISTR\registr.iss"

Но бьёт ошибку если добавляю в секцию [code]
ошибка возникает из за того, что в дополнительном скрипте
используются процедуры, которые уже используются в основном.

В некоторых заготовках инсталов смотрел там в секции [code]
прописывается так:

[code]

Код:


// Здесь происходит подключение модулей

#ifdef CursorsModul
//Подключение модуля "Курсоры мыши"
#include "CURSORS\Cursors.iss"
#endif
#ifdef MediaModul
//Подключение модуля "Media"
#include "MEDIA\Media.iss"
#endif
#ifdef SysTestModul
//Подключение модуля "Проверка системы"
#include "SYSTEST\SystemTest.iss"
....

Как правильно подключить дополнительные скрипты с кодом в секции [code] ?

Заранее спасибо!

Habetdin 27-07-2012 22:16 1960322

Цитата:

[Files]
#include "Program Files\Files.iss"
Желательно оставить эту строку:
Код:

#include "Program Files\Files.iss"
А "[Files]" - сделать первой строкой файла Files.iss

TEKTON 27-07-2012 22:50 1960335

Это всё понятно.
Я же ясно написал, что с подключением в секциях [Files] и [Registry] проблем не возникает,
а проблема при подключении скриптов с кодом в секции [code]

Вот как подключить к основному скрипту этот
читать дальше »

[CustomMessages]
HWREQProcessor=Процессор
HWREQVideoCard=Видеокарта
HWREQRamMemory=Оперативная память
HWREQSoundCard=Звуковая карта
HWREQSystem=Операционная система
HWREQError=Система не соответсвует требованиям.%nПроверьте компоненты, выделенные красным цветом.
HWREQErrorProc=Процессор не соответствует требуемому.%nНормальная работа не гарантируется.
HWREQErrorVideo=Видеокарта не соответствует требуемой.%nНормальная работа не гарантируется.
HWREQErrorRam=Оперативная память не соответствует требуемой.%nНормальная работа не гарантируется.
HWREQErrorSound=Звуковая карта не соответствует требуемой.%nНормальная работа не гарантируется.
HWREQErrorSys=Операционная система не соответствует требуемой.%nВозможны проблемы с запуском или сбои в работе.
HWREQPageCaption=Системные требования
HWREQPageDescription=Мастер установки проверяет систему.
HWREQPageInfo=Нажмите «Далее», чтобы продолжить, или «Отмена»,%nчтобы выйти из программы установки.
HWREQAllOk=Параметры системы соответсвуют требованиям.
HWREQCantFindDevice=Невозможно определить устройство.
HWREQCantFindWindows=Невозможно определить версию ОС.

[code]
type
THardwareRequirementSnapShot = record
ProcName: String;
ProcCount: Integer;
ProcFreq: Integer;
VideoName: String;
VideoFreq: Integer;
VideoPdm: String;
SoundName: String;
SoundCount: Integer;
RAMCount: Integer;
WinName: String;
WinBits: String;
WinVer: TWindowsVersion;
end;

TMemoryStatusEx = record
dwLength: DWORD;
dwMemoryLoad: DWORD;
LoTotalPhys: Integer;
HiTotalPhys: Integer;
LoAvailPhys: Integer;
HiAvailPhys: Integer;
LoTotalPageFile: Integer;
HiTotalPageFile: Integer;
LoAvailPageFile: Integer;
HiAvailPageFile: Integer;
LoTotalVirtual: Integer;
HiTotalVirtual: Integer;
LoAvailVirtual: Integer;
HiAvailVirtual: Integer;
LoAvailExtendedVirtual: Integer;
HiAvailExtendedVirtual: Integer;
end;

PDisplay_Device = record
cb: DWord;
DeviceName: array [0..31] of char;
DeviceString: array [0..127] of char;
StateFlags: DWord;
DeviceID, DeviceKey: array [0..127] of char;
end;

var
HWREQ: THardwareRequirementSnapShot;
HWREQPage: TWizardPage;
HWREQProc1, HWREQProc2, HWREQVid1, HWREQVid2, HWREQSound1, HWREQSound2,
HWREQRam1, HWREQRam2, HWREQWin1, HWREQWin2: TLabel;
HWREQInfoLabel, HWREQStatusLabel: TLabel;
HWREQFont: TFont;
SystemTest: Boolean;
SystemButton: TNewButton;
Test: Boolean;

const
HWREQ_NEED_PROC_FREQ = {#Processor};
HWREQ_NEED_VIDEO_FREQ = {#VideoCard};
HWREQ_NEED_RAM_FREQ = {#RamMemory};
HWREQ_NEED_SYSTEM = '{#System}';

function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean; external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean; external 'EnumDisplayDevicesA@user32.dll Stdcall';
//function GetSystemMetrics(nIndex: Integer): Integer; external 'GetSystemMetrics@user32.dll stdcall';
function GetDeviceCaps(hDC, nIndex: Integer): Integer; external 'GetDeviceCaps@GDI32 stdcall';
function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer; external 'CreateDCA@GDI32 stdcall';

function DelSp(s: string): string;
begin
while Pos(' ',s)>0 do StringChange(s,' ',' ');
Result:=Trim(s);
end;

function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo; if Lo < 0 then Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
for Hi := Hi-1 downto 0 do Result:= Result + $7FFFFFFF + $7FFFFFFF + 2;
end;

function RoundUp(Num: Longint): Integer;
var i, k, t: Integer;
begin
i:= trunc(Num/64);
repeat
if ((64*i)<Num) then i:=i+1;
k:=trunc(i/2);
if ((k*2)<i) then i:=i+1;
until (not (64*i)<Num)and(not (k*2)<>i);
k:= 64*i; Result:= k;
end;

function DecodeSystemStr(Str: String): TWindowsVersion;
var tmp, s: string;
begin
tmp:= str;
s:= Copy(tmp, 1, Pos('.', tmp)-1)
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.Major:= StrToInt(s);
s:= Copy(tmp, 1, Pos('.', tmp)-1)
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.minor:= StrToInt(s);
s:= Copy(tmp, 1, Pos('.', tmp)-1)
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.Build:= StrToInt(s);
s:= Copy(tmp, 1, Pos('.', tmp)-1)
Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.ServicePackMajor:= StrToInt(s);
end;

procedure HWREQ_Repaint();
begin
HWREQProc2.Caption:= HWREQ.ProcName+' @ '+IntToStr(HWREQ.ProcFreq)+ 'MHz'
HWREQVid2.Caption:= HWREQ.VideoName+' '+IntToStr(HWREQ.VideoFreq)+' Mb ('+HWREQ.VideoPdm+')'
HWREQSound2.Caption:= HWREQ.SoundName
HWREQRam2.Caption:= IntToStr(HWREQ.RAMCount)+' Mb'
HWREQWin2.Caption:= HWREQ.WinName+' '+HWREQ.WinBits+' ('+IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.Build)+' Service Pack '+IntToStr(HWREQ.WinVer.ServicePackMajor)++')'
HWREQStatusLabel.Caption:= CustomMessage('HWREQAllOk')
end;

procedure HWREQ_UpdateInfo();
var
Keys: TArrayOfString; MS: TMemoryStatusEx;
DeviceKey, DeviceName: String; DeviceValue: Cardinal;
n, i, c1, c2, x, cur: Integer; WriteV: Boolean;
aKeys, bKeys, cKeys, Devices: TArrayOfString;
lpDisplayDevice: PDisplay_Device;
begin
SystemTest:=True;
if not RegQueryStringValue(HKLM, 'Hardware\Description\System\CentralProcessor\0', 'ProcessorNameString', DeviceName) then
DeviceName:=CustomMessage('HWREQCantFindDevice');
RegQueryDWordValue(HKLM, 'Hardware\Description\System\CentralProcessor\0', '~MHz', DeviceValue);
RegGetSubkeyNames(HKLM, 'Hardware\Description\System\CentralProcessor', Keys);
HWREQ.ProcName:= DelSP(DeviceName);
HWREQ.ProcFreq:= DeviceValue;
HWREQ.ProcCount:= GetArrayLength(Keys);

MS.dwLength := SizeOf(MS);
GlobalMemoryStatusEx(MS);
HWREQ.RAMCount:= RoundUp(Round(Size64(MS.HiTotalPhys, MS.LoTotalPhys)/(1024*1024)));

RegGetSubKeyNames(HKCU, 'Software\Microsoft\ActiveMovie\devenum', aKeys);
i:= GetArrayLength(aKeys);
if (i>0) then for c1:=i-1 downto 0 do begin
SetArrayLength(bKeys, 0); n:=0;
RegGetSubKeyNames(HKCU, 'Software\Microsoft\ActiveMovie\devenum\'+aKeys[c1], bKeys);
n:= GetArrayLength(bKeys);
if (n>0) then for c2:=n-1 downto 0 do begin
if RegQueryDWordValue(HKCU, 'Software\Microsoft\ActiveMovie\devenum\'+aKeys[c1]+'\'+bKeys[c2], 'WaveOutId', DeviceValue) then
if RegQueryStringValue(HKCU, 'Software\Microsoft\ActiveMovie\devenum\'+aKeys[c1]+'\'+bKeys[c2], 'FriendlyName', DeviceName)and(DeviceValue<10) then begin
x:= GetArrayLength(cKeys); SetArrayLength(cKeys, x+1); cKeys[x]:= DeviceName; Cur:=c1;
end;
end;
end;
SetArrayLength(bKeys, 0);
RegGetSubKeyNames(HKCU, 'Software\Microsoft\ActiveMovie\devenum\'+aKeys[Cur], bKeys);
i:= GetArrayLength(bKeys);
if (i>0) then for c1:=0 to i-1 do begin
if RegQueryStringValue(HKCU, 'Software\Microsoft\ActiveMovie\devenum\'+aKeys[Cur]+'\'+bKeys[c1], 'FriendlyName', DeviceName) then
for c2:= 0 to GetArrayLength(cKeys)-1 do
if (cKeys[c2]<>DeviceName)and(Pos(CKeys[c2], DeviceName)>0) then begin
StringChange(DeviceName, 'DirectSound:', ''); StringChange(DeviceName, 'S/PDIF', ''); StringChange(DeviceName, '()', '');
if (Pos('(', DeviceName)>0)and(Pos(')', DeviceName)>0) then DeviceName:= Copy(DeviceName, Pos('(', DeviceName)+1, Pos(')', DeviceName)-Pos('(', DeviceName)-1);
if DeviceName[1] = ' ' then Delete(DeviceName, 1, 1); x:= GetArrayLength(Devices); WriteV:= False;
if (x>0) then if (Devices[x-1]<>DeviceName) then WriteV:= True; if (x=0) then WriteV:= True;
if WriteV then begin SetArrayLength(Devices, x+1); Devices[x]:= DeviceName; end;
end;
end;
n:= GetArrayLength(Devices); HWREQ.SoundCount:=n; HWREQ.SoundName:='';
if (n>0) then HWREQ.SoundName:= Devices[0] else
HWREQ.SoundName:= CustomMessage('HWREQCantFindDevice');

if not RegQueryStringValue(HKLM, 'Software\Microsoft\Windows NT\CurrentVersion', 'ProductName', DeviceName) then
DeviceName:= CustomMessage('HWREQCantFindWindows');
HWREQ.WinName:= DelSP(DeviceName);
GetWindowsVersionEx(HWREQ.WinVer);
if IsWin64 then HWREQ.WinBits:= 'x64' else HWREQ.WinBits:= 'x86';

lpDisplayDevice.cb := SizeOf(lpDisplayDevice);
DeviceKey:= ''; n:= 0;
while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0)and(lpDisplayDevice.StateFlags and 4 > 0))and(n < 127) do n:= n+1;
for n := 0 to 127 do DeviceKey:= DeviceKey + lpDisplayDevice.DeviceKey[n];
Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127);
StringChange(DeviceKey, '\Registry\Machine\', '');
i := 1; DeviceValue := 0;
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
for n := 1 to Length(DeviceName) do
begin
DeviceValue := DeviceValue + Ord(DeviceName[n])*i;
i := i*$100;
end else
if not RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue);
DeviceName:= '';
for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n];
Delete(DeviceName, Pos( Chr(0), DeviceName ), 127);
HWREQ.VideoName:= DelSP(DeviceName);
HWREQ.VideoFreq:= RoundUp(DeviceValue/(1024*1024));
HWREQ.VideoPdm:= IntToStr(GetSystemMetrics(0))+'x'+IntToStr(GetSystemMetrics(1))+' ('+IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14)*GetDeviceCaps(CreateDC('DISPLAY','','',0), 12))+' bit)';
if HWREQ.VideoName='' then HWREQ.VideoName:= CustomMessage('HWREQCantFindDevice');
end;

function HWREQ_CompareProcessor(): Boolean;
begin
Result:= False;
if HWREQ.ProcName <> CustomMessage('HWREQCantFindDevice') then
if HWREQ_NEED_PROC_FREQ <= (HWREQ.ProcCount*HWREQ.ProcFreq) then
Result:= True;
end;

function HWREQ_CompareVideo(): Boolean;
begin
Result:= False;
if HWREQ.VideoName <> CustomMessage('HWREQCantFindDevice') then
if HWREQ_NEED_VIDEO_FREQ <= HWREQ.VideoFreq then
Result:= True;
end;

function HWREQ_CompareSound(): Boolean;
begin
Result:= False;
If HWREQ.SoundCount <> 0 then
if HWREQ.SoundName <> CustomMessage('HWREQCantFindDevice') then
Result:= True;
end;

function HWREQ_CompareRAM(): Boolean;
begin
Result:= False;
if HWREQ_NEED_RAM_FREQ <= HWREQ.RAMCount then
Result:= True;
end;

function HWREQ_CompareWindows(): Boolean;
var tmp: TWindowsVersion;
begin
Result:= False;
tmp:= DecodeSystemStr(HWREQ_NEED_SYSTEM)
if HWREQ.WinVer.NTPlatform then begin
if (tmp.Major <= HWREQ.WinVer.Major) then
if (tmp.Minor <= HWREQ.WinVer.Minor) then
if (tmp.Build <= HWREQ.WinVer.Build) then
if (tmp.ServicePackMajor <= HWREQ.WinVer.ServicePackMajor) then
Result:= True;
end;
end;

procedure HWREQ_Testing();
begin
Test:= True;
HWREQStatusLabel.Font.Color:= clLime;
if not HWREQ_CompareProcessor then begin Test:= False; HWREQProc2.Font.Color:= clRed; end;
if not HWREQ_CompareVideo then begin Test:= False; HWREQVid2.Font.Color:= clRed; end;
if not HWREQ_CompareSound then begin Test:= False; HWREQSound2.Font.Color:= clRed; end;
if not HWREQ_CompareRAM then begin Test:= False; HWREQRam2.Font.Color:= clRed; end;
if not HWREQ_CompareWindows then begin Test:= False; HWREQWin2.Font.Color:= clRed; end;
if not Test then begin HWREQStatusLabel.Font.Color:= clRed; HWREQStatusLabel.Caption:= CustomMessage('HWREQError') end;
end;

// Начало Действие кнопки "Система"
procedure SystemButtonOnClick(Sender: TObject);
begin
if SystemTest then
begin
#ifdef PlaySFX
sndPlaySound(ExpandConstant('{tmp}\LClick.wav'),$0001);
#endif
HWREQStatusLabel.Caption := 'Минимальные системные требования';
HWREQStatusLabel.Font.Color:=clBlue;
HWREQProc2.Caption := 'Минимальная частота: {#Processor} MHz';
HWREQProc2.Font.Color:=clWhite//clBlack;
HWREQVid2.Caption := 'Минимальная видео память: {#VideoCard} Mb';
HWREQVid2.Font.Color:=clWhite//clBlack;
HWREQSound2.Caption := 'Минимальная память ОЗУ: {#RamMemory} Mb';
HWREQSound2.Font.Color:=clWhite//clBlack;
HWREQSound1.Caption:= CustomMessage('HWREQRamMemory');
HWREQRam1.hide;
HWREQRam2.hide;
HWREQWin1.hide;
HWREQWin2.hide;
SystemTest:=False;
end
else
begin
#ifdef PlaySFX
sndPlaySound(ExpandConstant('{tmp}\RClick.wav'),$0001);
#endif
HWREQRam1.show;
HWREQRam2.show;
HWREQWin1.show;
HWREQWin2.show;
HWREQSound1.Caption:= CustomMessage('HWREQSoundCard');
HWREQSound1.show;
HWREQSound2.show;
HWREQ_UpdateInfo;
HWREQ_Repaint;
HWREQ_Testing;
end;
end;
// Конец Действие кнопки "Система"

procedure HWREQ_CreatePanelSimple(AFont: TFont);
var
AFirstLeft, ASecondLeft, ATop, AFirstWidth, ASecondWidth, AHeight: Integer; Test: Boolean; AParent: TWinControl;
begin
HWREQ_UpdateInfo;
HWREQPage:= CreateCustomPage(wpWelcome, CustomMessage('HWREQPageCaption'), CustomMessage('HWREQPageDescription'));

AParent:= HWREQPage.Surface; AFirstLeft:=0; ATop:=ScaleY(40);
if (WizardForm.InnerNotebook.Visible = False)or(WizardForm.OuterNotebook.Visible = False) then
begin AFirstLeft:=ScaleX(40); ATop:=ScaleY(112); AParent:= WizardForm; end;
AFirstWidth:= (WizardForm.Width-ScaleX(90))/3;
ASecondWidth:= ((WizardForm.Width-ScaleX(90))*2/3);
ASecondLeft:= AFirstLeft+AFirstWidth+ScaleX(5);
if AFont <> nil then HWREQFont:= AFont else HWREQFont:= WizardForm.Font;
AHeight:= (HWREQFont.Size*2)+2;

// Начало Создание кнопки Система.
SystemButton := TNewButton.Create(HWREQPage);
with SystemButton do begin
Caption := 'Система';
Left:=338;
Top:=300;
Width:=79;
Height:=25;
OnClick:=@SystemButtonOnClick
#ifdef PlaySFX
OnMouseEnter:=@MouseEnter;
#endif
Cursor := crHand;
Parent:= AParent;
ShowHint := True;
Hint:= 'Показать "Cведения о системе"/Показать "Системные требования"'
end;
// Конец Создание кнопки Система.

HWREQInfoLabel:= TLabel.Create(HWREQPage)
with HWREQInfoLabel do begin
SetBounds(ScaleX(5), ScaleY(300), ScaleX(487), ScaleY(35));
Transparent:= True
AutoSize:= False
Font.Style:=[fsBold];
Font.Size:= 9;
Caption:= CustomMessage('HWREQPageInfo')
Font.Color:=clWhite; //
Parent:= AParent;
end;

//================= Начало - Процессор =================//
HWREQProc1:= TLabel.Create(HWREQPage)
with HWREQProc1 do begin
SetBounds(ScaleX(5), ScaleY(50), ScaleX(150), ScaleY(22));
Alignment:= taCenter;
Transparent:=True;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:=clBlue;
Font.Style:=[fsBold];
Caption := CustomMessage('HWREQProcessor');
Parent:= AParent;
end;

HWREQProc2:= TLabel.Create(HWREQPage)
with HWREQProc2 do begin
SetBounds(ScaleX(5), ScaleY(70), ScaleX(300), ScaleY(22));
Transparent:=True;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:=clWhite//clBlack;
Font.Style:=[fsBold];
Parent:= AParent;
end;
//================= Конец - Процессор =================//

//================= Начало - Видеоадаптер =================//
HWREQVid1:= TLabel.Create(HWREQPage)
with HWREQVid1 do begin
AutoSize:=True;
SetBounds(ScaleX(5), ScaleY(100), ScaleX(150), ScaleY(22));
Transparent:=True;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:=clBlue;
Font.Style:=[fsBold];
Caption:= CustomMessage('HWREQVideoCard');
Parent:= AParent;
end;

HWREQVid2:= TLabel.Create(HWREQPage)
with HWREQVid2 do begin
AutoSize:=True;
SetBounds(ScaleX(5), ScaleY(120), ScaleX(300), ScaleY(22));
Transparent:=True;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:=clWhite//clBlack;
Font.Style:=[fsBold];
Parent:= AParent;
end;
//================= Конец - Видеоадаптер =================//

//================= Начало - Звуковая карта =================//
HWREQSound1:= TLabel.Create(HWREQPage)
with HWREQSound1 do begin
AutoSize:=True;
SetBounds(ScaleX(5), ScaleY(150), ScaleX(150), ScaleY(22));
Transparent:=True;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:=clBlue;
Font.Style:=[fsBold];
Caption:= CustomMessage('HWREQSoundCard');
Parent:= AParent;
end;

HWREQSound2:= TLabel.Create(HWREQPage)
with HWREQSound2 do begin
AutoSize:=True;
SetBounds(ScaleX(5), ScaleY(170), ScaleX(300), ScaleY(22));
Transparent:=True;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:=clWhite//clBlack;
Font.Style:=[fsBold];
Parent:= AParent;
end;
//================= Конец - Звуковая карта =================//

//================= Начало - ОЗУ =================//
HWREQRam1:= TLabel.Create(HWREQPage)
with HWREQRam1 do begin
AutoSize:=True;
SetBounds(ScaleX(5), ScaleY(200), ScaleX(150), ScaleY(22));
Transparent:=True;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:=clBlue;
Font.Style:=[fsBold];
Caption:= CustomMessage('HWREQRamMemory');
Parent:= AParent;
end;

HWREQRam2:= TLabel.Create(HWREQPage)
with HWREQRam2 do begin
AutoSize:=True;
SetBounds(ScaleX(5), ScaleY(220), ScaleX(300), ScaleY(22));
Transparent:=True;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:=clWhite//clBlack;
Font.Style:=[fsBold];
Parent:= AParent;
end;
//================= Конец - ОЗУ =================//

//================= Начало - Операционная система =================//
HWREQWin1:= TLabel.Create(HWREQPage)
with HWREQWin1 do begin
AutoSize:=True;
SetBounds(ScaleX(5), ScaleY(250), ScaleX(150), ScaleY(22));
Transparent:=True;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:=clBlue;
Font.Style:=[fsBold];
Caption:= CustomMessage('HWREQSystem');
Parent:= AParent;
end;

HWREQWin2:= TLabel.Create(HWREQPage)
with HWREQWin2 do begin
AutoSize:=True;
SetBounds(ScaleX(5), ScaleY(270), ScaleX(400), ScaleY(22));
Transparent:=True;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:=clWhite//clBlack;
Font.Style:=[fsBold];
Parent:= AParent;
end;
//================= Конец - Операционная система =================//

HWREQStatusLabel:= TLabel.Create(HWREQPage)
with HWREQStatusLabel do begin
SetBounds(ScaleX(5), ScaleY(0), ScaleX(487), ScaleY(35));
Transparent:= True;
AutoSize:= True;
Font.Size:= 9;
Font.Style:=[fsBold];
Font.Color:= clWhite//clWhiteclBlack;
Parent:= AParent;
HWREQ_UpdateInfo;
HWREQ_Repaint;
HWREQ_Testing;
end;
end;

procedure HWREQ_UpdatePage(CurPageID: Integer);
begin
HWREQInfoLabel.Hide; HWREQStatusLabel.Hide;
HWREQProc1.Hide; HWREQProc2.Hide;
HWREQVid1.Hide; HWREQVid2.Hide;
HWREQSound1.Hide; HWREQSound2.Hide;
HWREQRam1.Hide; HWREQRam2.Hide;
HWREQWin1.Hide; HWREQWin2.Hide;

if CurPageID = HWREQPage.ID then begin
HWREQInfoLabel.Show; HWREQStatusLabel.Show;
HWREQProc1.Show; HWREQProc2.Show;
HWREQVid1.Show; HWREQVid2.Show;
HWREQSound1.Show; HWREQSound2.Show;
HWREQRam1.Show; HWREQRam2.Show;
HWREQWin1.Show; HWREQWin2.Show;
end;
end;

Что и как прописать в секцию [code] основного скрипта, что бы ино этот файл подхватил при компиляции инстала.
этот скрипт лежит в папке SYSTEST\SystemTest.iss

Habetdin 27-07-2012 23:24 1960343

TEKTON, по аналогии с примером из поста #501 - #include не обязан быть в секциях, будь то [code] или [files] ;[

TEKTON 27-07-2012 23:37 1960347

Ок.
Сейчас прописал в самом верху скрипта до секции [Setup]
Код:

#include "SYSTEST\SystemTest.iss"

[Setup]
...

Вылетает ошибка
Файл: C:\Documents and Settings\Desktop\INSTAL\SYSTEST\SystemTest.iss
Строка 76:
Column 37:
[ISPP] Undeclared identifier: "Processor".

Не хватает ему чего то.
Где его это взять и как подключить ?

Habetdin 27-07-2012 23:49 1960354

Цитата:

Цитата TEKTON
[ISPP] Undeclared identifier: "Processor". »

Ему не хватает строк типа этого:
Код:

#define System "Система"
#define Processor "Процессор"
#define VideoCard "Видеоадаптер"
#define Audio "Звуковая карта"
#define RamMemory "Объём памяти"
#define PageFile "Файл подкачки"

P.S.: 4 поста, начиная с #152 ;)

TEKTON 28-07-2012 00:26 1960369

Смотрел я уже ту шляпу.
Парень бился бился с ошибками, потом ему втюхали какую то get_hw_caps.dll.
На этом всё и кончилось... :(

Можете нормальный пример сделать из двух скриптов?
Чтоб один подключался ко второму.

p.s. Я тоже рою нет, но пока чёткого и конкретного ответа не нашёл.

Fanat1990 28-07-2012 16:12 1960585

Цитата:

Цитата TEKTON
Парень бился бился с ошибками, потом ему втюхали какую то get_hw_caps.dll. »

это не какая-то get_hw_caps.dll! Авторы этой dll GSC Game World. Она используется в инсталлах сталкера, для проверки требований....

YURSHAT 28-07-2012 16:16 1960587

Цитата:

Цитата TEKTON
Вылетает ошибка »

Потому как сначала нужно указать мин. требования, а потом уже скрипт подключать.

Код:

#define System "Система"
#define Processor "Процессор"
#define VideoCard "Видеоадаптер"
#define Audio "Звуковая карта"
#define RamMemory "Объём памяти"
#define PageFile "Файл подкачки"

#include "SYSTEST\SystemTest.iss"

[Setup]
....


Yury_Prizrak 30-07-2012 13:09 1961484

Цитата:

Цитата Yury_Prizrak
первый вообще не понял (код-кусок для наглядности предоставь(если смогу понять - помогу), а то какие-то конфиги, формы...) »

Попробую более подробно. В устанавливаемой программе есть xml файл, который пользователь может менять в момент установки:
Код:

var
  IsInit: Boolean;
  ZXBPage: TWizardPage;
  DBPage:  TWizardPage;


procedure InitializeWizard;
begin
  //  страничка подключения к базе данных
  DBPage := Db_CreatePage(wpSelectDir);
  //  страничка подключения
  ZXBPage := ZXB_CreatePage(DBPage.ID);

  IsInit := False;
end;


//  Инициализация страничек с настройками из конфигурационного файла.
procedure CurPageChanged(CurPageID: Integer);
var
  ConfigPath: String;
  XMLDoc, XMLNodeList, XMLNode, XMLAttributes, XMLAttrib: Variant;
  i: Integer;
begin
  //  проверка инициализированности параметров, для последующих заходов на страницы
  if IsInit then
    Exit;
  //  проверка ID страничек с параметрами
  if (not (CurPageID = DBPage.ID)) and (not (CurPageID = ZXBPage.ID)) then
    Exit;

  ConfigPath := ExpandConstant('{app}\111.exe.config');
  //  проверка наличия конфигурационного файла
  if not FileExists( ConfigPath ) then
  begin
    IsInit := True;
    Exit;
  end;

  //  загрузка конфигурационного файла
  XMLDoc := CreateOleObject('MSXML2.DOMDocument');
  XMLDoc.async := False;
  XMLDoc.resolveExternals := False;
  XMLDoc.load( ConfigPath );
  if XMLDoc.parseError.errorCode <> 0 then
    RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ', position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason);

  //  страничка подключения к базе данных
  //  поле 'Строка подключения к базе данных:'
  XMLNode := XMLDoc.selectSingleNode('//connectionStrings/add[@name="BankDb"]');
  if not VarIsEmpty(XMLNode) then
  begin
    XMLAttributes := XMLNode.attributes;
    XMLAttrib := XMLAttributes.getNamedItem('connectionString');
    ConnectionStringEdit.Text := XMLAttrib.text;
  end;

  IsInit := True;
end;


//  ConfigChange.
//  Изменение настроек в конфигурационном файле.
procedure ConfigChange();
var
  ConfigPath: String;
  XMLDoc, XMLNodeList, XMLNode, XMLAttributes, XMLAttrib: Variant;
  i: Integer;
begin
  ConfigPath := ExpandConstant('{app}\CreditLaw.exe.config');
  //  проверка наличия конфигурационного файла
  if not FileExists( ConfigPath ) then
    Exit;

  XMLDoc := CreateOleObject('MSXML2.DOMDocument');
  XMLDoc.async := False;
  XMLDoc.resolveExternals := False;
  XMLDoc.load( ConfigPath );
  if XMLDoc.parseError.errorCode <> 0 then
    RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ', position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason);

  //  поле 'Строка подключения к базе данных:' в секции connectionStrings
  XMLNode := XMLDoc.selectSingleNode('//connectionStrings/add[@name="BankDb"]');
  if not VarIsEmpty(XMLNode) then
  begin
    XMLAttributes := XMLNode.attributes;
    XMLAttrib := XMLAttributes.getNamedItem('connectionString');
    XMLAttrib.text := ConnectionStringEdit.Text;
  end;

  XMLDoc.Save( ConfigPath );
end;

И вроде как все хорошо и здорово. Но возникла необходимость не давать пользователю менять эти данные(т.е. прятать страницы DBPage и ZXBPage) если программа уже была установлена. При этом первый вариант тоже должен оставатся(это я уже сообразил как реализовать)ю Но если я прячу страницы тогда я не могу пользоватся переменными этих страниц (ConnectionStringEdit.Text например) т.е. если страница спрятана, в эту переменную не подтягивается значение из файла а ставится по умолчанию. Есть вариант ввести дополнительные внутренние переменные в код InnoSetup и записывать значения в них а после перезаписи конфиг. файла считывать из них:
Код:

var
  IsInit: Boolean;
  ServiceString: String;
  //переменные для конфигурационного файла:
  ConnectBD: String;

procedure LoadConfigFileData();
var
  ConfigPath: String;
  XMLDoc, XMLNodeList, XMLNode, XMLAttributes, XMLAttrib: Variant;
  i: Integer;
begin
  //  загрузка конфигурационного файла
  XMLDoc := CreateOleObject('MSXML2.DOMDocument');
  XMLDoc.async := False;
  XMLDoc.resolveExternals := False;
  XMLDoc.load( ExpandConstant('{app}\Configuration\CvlServiceConfig.xml') );
  if XMLDoc.parseError.errorCode <> 0 then
    RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ', position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason);

  //  поле 'Строка подключения к базе данных:'
  XMLNode := XMLDoc.selectSingleNode('//DataBase');
  if not VarIsEmpty(XMLNode) then
  begin
    XMLAttributes := XMLNode.attributes;
    XMLAttrib := XMLAttributes.getNamedItem('ConnectionStringNoPass');
    ConnectBD := XMLAttrib.text;
  end;

  IsInit := False;

end;

procedure RecoveryConfigFile();
var
  ConfigPath: String;
  XMLDoc, XMLNodeList, XMLNode, XMLAttributes, XMLAttrib: Variant;
  i: Integer;
begin
  ConfigPath := ExpandConstant('{app}\Configuration\CvlServiceConfig.xml');
  //  проверка наличия конфигурационного файла
  if not FileExists( ConfigPath ) then
    Exit;

  //  загрузка конфигурационного файла
  XMLDoc := CreateOleObject('MSXML2.DOMDocument');
  XMLDoc.async := False;
  XMLDoc.resolveExternals := False;
  XMLDoc.load( ExpandConstant('{app}\Configuration\CvlServiceConfig.xml') );
  if XMLDoc.parseError.errorCode <> 0 then
    RaiseException('Error on line ' + IntToStr(XMLDoc.parseError.line) + ', position ' + IntToStr(XMLDoc.parseError.linepos) + ': ' + XMLDoc.parseError.reason);

  //  страничка подключения к базе данных
  //  поле 'Строка подключения к базе данных:'
  XMLNode := XMLDoc.selectSingleNode('//DataBase');
  if not VarIsEmpty(XMLNode) then
  begin
    XMLAttributes := XMLNode.attributes;
    XMLAttrib := XMLAttributes.getNamedItem('ConnectionStringNoPass');
    XMLAttrib.text := ConnectBD;
  end;
  XMLDoc.Save( ConfigPath );
end;

но есть одно но - у меня этих переменных штук этак дофига, и код становится очень нечитабельным и большим. Вот в этом и сложность :)

Mafioza 30-07-2012 14:43 1961525

всем привет , скажите как мне сделать чтобы страница создания ярлыков появилась после установки игры или программы ???????????77

Johny777 30-07-2012 18:27 1961652

Yury_Prizrak,
мне кажется тебе не хватает одной единственной логической переменной
сделай так
[code]
var
Installed: boolean;

function InitializeSetup(): Boolean;
begin
Installed := False;
проверяем есть ли ключ (код 2 страницы назад)
если есть Installed := True; и пошло по всему коду
end;

procedure InitializeWizard;
begin
if not Installed then создаём страницы. Короче всё, что должно делаться если не установлена
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if not Installed then тоже самое но для того что ты делаешь в переключении страниц
end;

итд

юзай else если надо

alert30 30-07-2012 18:56 1961674

Mafioza, вроде в оригинальном компиляторе Inno Setup есть чекбокс "Создать ярлык на Рабочем столе"?

Mafioza 30-07-2012 20:51 1961741

alert30 да я зная , я хочу чтобы страница ярлыков была после страницы распаковки фалов , до страницы завершения установки , ка у InstallShield

Johny777 31-07-2012 01:09 1961832

Mafioza,
из справки мы узнаём о том что значки создаются до того как мы можем настроить их создание (в конце распаковки файлов)
читать дальше »

==================================================================
Задания в секциях от начала до завершения установки выполняются в следующем порядке:

•Выполняется [InstallDelete].
•Параметры секции [UninstallDelete] располагаются в логе деинсталлятора (который на этом этапе находится в оперативной памяти).
•При необходимости создается папка приложения.
•Выполняется [Dirs].
•При необходимости резервируется имя файла деинсталлятора.
•Выполняется [Files]. (Регистрация файлов не происходит.)
Выполняется [Icons].
•Выполняется [INI].
•Выполняется [Registry].
•Регистрируются файлы, нуждающиеся в регистрации, если только не требуется перезагрузка системы - в этом случае ни один файл не будет зарегистрирован до тех пор, пока система не перезапустится.
•При необходимости создается пункт в Установка/Удаление программ.
•Параметры [UninstallRun] располагаются в логе деинсталлятора.
•Завершается создание деинсталлятора и сохраняется на диске. После этого, пользователю не сможет отменить установку, и любые последующие ошибки не будут вызывать то откат всех действий.
•Выполняется [Run], за исключением файлов с флагом postinstall, которые выполнятся после того, как отобразится страница Установка завершена.
•При ChangesAssociations=yes меняются ассоциации для файлов.
•Если ChangesEnvironment=yes остальные приложения информируются об изменении переменных среды.
Все параметры выполняются инсталлятором в том порядке, в котором они располагаются в секции.
==========================================================================

Поэтому создадим ярлыки по завершении работы инсталла (после нажатия на кнопку "завершить" на финишной странице) - этап ssDone
результат:
читать дальше »
Код:

[Setup]
AppName=Icon_Demo
AppVerName=Icon_Demo
DefaultDirName={pf}\Icon_Demo

[UninstallDelete]
Type: files; Name: "{userprograms}\Icon Demo Installer.lnk"
Type: files; Name: "{userdesktop}\Icon Demo Installer.lnk"

[code]
var
  IconPage: TInputOptionWizardPage;

procedure InitializeWizard();
begin
  IconPage := CreateInputOptionPage(wpInstalling,'Настройка', 'настройте создание значков', '', False, False);
  with IconPage do
  begin
    Add('Значок в меню "Пуск"');
    Add('Значок на рабочем столе');   
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then
  begin
    if IconPage.Values[0] = True then CreateShellLink(ExpandConstant('{userprograms}\Icon Demo Installer.lnk'), 'описание', ExpandConstant('{srcexe}'), '', ExpandConstant('{src}'), ExpandConstant('{srcexe}'), 0, SW_SHOWNORMAL);
    if IconPage.Values[1] = True then CreateShellLink(ExpandConstant('{userdesktop}\Icon Demo Installer.lnk'), 'описание', ExpandConstant('{srcexe}'), '', ExpandConstant('{src}'), ExpandConstant('{srcexe}'), 0, SW_SHOWNORMAL);
  end;
end;


также нельзя забывать удалять их вручную (кажись потому что их нет в логе деинсталятора), те указывать что их надо удалить (секция UninstallDelete)

wertulll 31-07-2012 12:07 1962041

ребят подскажите пожалуйста как текстурировать кнопку "отмена" на странице установки в ISDone0.6
ну или пример посоветуйте

Johny777 31-07-2012 14:01 1962112

wertulll,
вот:
читать дальше »
Код:

/// в "настройках редактора"  поставь галку "номера строк" если не стоит
procedure ButtonTextures();  /// здесь не хватает загрузки картинки для товей кастмной кнопки "Отмена"
begin
  ....
  LoadButtonImage(MyCancelButton);  //// после строки 501 припиши
end;

/// судя по скрину у тебя во время установки родная кнопка отмены не скрыта
/// поэтому обновлённая процедура переключения страниц:

procedure CurPageChanged(CurPageID: Integer);
begin
  CurPageChanged2(CurPageID);
 
  if CurPageID = wpSelectDir then
  begin
    GetNeedSpaceCaption;
    if FreeMB < NeedSize then WizardForm.NextButton.Enabled := False
  end;

  if CurPageID = wpInstalling then WizardForm.CancelButton.Hide;

end;


пробуй

Mafioza 31-07-2012 14:04 1962115

Johny777 спасибо

wertulll 31-07-2012 14:40 1962138

Johny777,

при запуске инстала вот такая беда

wertulll 31-07-2012 15:06 1962156

вот полный скрипт http://narod.ru/disk/58549635001.0ec...D1%82.rar.html

wertulll 31-07-2012 15:27 1962169

я просто чистый скрипт дал не прописывал то что ты мне страницу назад писал :) нужно это прописать и будет ошибка

Johny777 31-07-2012 16:27 1962195

wertulll,
исправил, но перписывать код не осилил
очень много путаницы

wertulll 31-07-2012 16:46 1962203

Цитата:

Цитата Johny777
очень много путаницы »

и лишнего наверное много? :)
а за кнопку спасиб большой !!!малёха цифры подправил и вобще чётко встала

Johny777 01-08-2012 02:07 1962458

Цитата:

Цитата wertulll
и лишнего наверное много? »

есть такое
гляну ещё раз спокойно
проверяй форум время от времени :) (особенно завтра)
========================================
скажите пожалуйста в чём разница между этой функцией
Код:

function NumToStr(Float: Extended): String;
begin
  Result:= Format('%.1n', [Float]);
  StringChange(Result, ',', '.');
  while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
end;

и встроенным FloatToStr

Shegorat 01-08-2012 10:48 1962596

Цитата:

Цитата Johny777
скажите пожалуйста в чём разница между этой функцией »

NumToStr переводит дробное число в строку, в данном случае с точностью до одного знака после запятой, при этом если дробная часть равна нулю, она ее обрезает. FloatToStr, если не ошибаюсь, переводит число с точностью до 6 знаков после запятой, при этом если младшие разряды дробной части или вся дробная часть равна нулю, она не обрезает нулевые знаки.

Yury_Prizrak 01-08-2012 11:14 1962615

Цитата:

Цитата Johny777
мне кажется тебе не хватает одной единственной логической переменной »

Вооот, а теперь мы подошли к сути вопроса. Тоесть в любом случае получится 2 набора переменных? Я надеялся что можно как-то спрятать страницы но использовать их(страниц) переменные(текстовые поля)... тогда все бы было значительно красивее и проще...

Johny777 01-08-2012 16:36 1962860

wertulll,
переписал всё кроме исдана (его не знаю)
заменил проверку свободного места на свою, (тебе понадобится расширенная версия инно, если пользуешься стандартной)
и у тебя на первой странице картинка от Сталкера и дальше полосой сверху от другой игры

Batistas 01-08-2012 19:54 1962986

Ребят, помогите в создании инсталятора для ApexDC++ s16.4. Что нужно уметь делать инсталятору, если так можно выразиться:

читать дальше »
В файле Settings/DCPlusPlus.xml

1)Добавление ника (в меню инсталятора) (Пример: http://s003.radikal.ru/i203/1207/ea/5520e1c639d6.png):

<Nick type="string"></Nick>

2)Прописывание абсолютного пути к файлу русификации (settings/):

<LanguageFile type="string">Russian.xml</LanguageFile>

3)Прописывание абсолютного пути к звукам (Sounds/):

<BeepFile type="string">PrivateMessage.wav</BeepFile>
<BeginFile type="string">DownloadBegins.wav</BeginFile>
<FinishedFile type="string">DownloadFinished.wav</FinishedFile>
<SourceFile type="string">AltSourceAdded.wav</SourceFile>
<UploadFile type="string">UploadFinished.wav</UploadFile>
<FakerFile type="string">FakerFound.wav</FakerFile>
<ChatNameFile type="string">MyNickInMainChat.wav</ChatNameFile>
<SoundTTH type="string">FileCorrupted.wav</SoundTTH>
<SoundException type="string">UnhandledException.wav</SoundException>
<SoundHubConnected type="string">HubConnected.wav</SoundHubConnected>
<SoundHubDisconnected type="string">HubDisconnected.wav</SoundHubDisconnected>
<SoundFavUserOnline type="string">FavUser.wav</SoundFavUserOnline>
<SoundFavUserOffline type="string">FavUserDisconnected.wav</SoundFavUserOffline>

4)Прописывание абсолютного пути к предпросмотрщику:

<PreviewApps>
<Application Name="AVI Preview" Application="AVIPreview.exe" Arguments="%[file]" Extension="avi;divx;mpg;mpeg;vob"/>
</PreviewApps>

5)Выбор папки для шары (в меню инсталятора) (Пример: http://s05.radikal.ru/i178/1207/0c/a131800ecb2e.png):

<Share>
<Directory Virtual="Downloads-P2P"></Directory>
</Share>

6)Выбор директории для скачивания (в меню исталятора) (Пример: http://s05.radikal.ru/i178/1207/0c/a131800ecb2e.png):

<DownloadDirectory type="string"></DownloadDirectory>

7)Добавление ссылки на сайт в инсталляторе и кнопки "Об авторе": http://s05.radikal.ru/i178/1207/63/a6c256b106fe.png

5 и 6 пункты можно объединить в одно окно (не суть важно).

Ссылка на архив: http://narod.ru/disk/58558832001.698..._inno.rar.html

Файл DCPlusPlus.xml - http://narod.ru/disk/58668588001.c1c...sPlus.xml.html


Поможет кто-нибудь в реализации задумки?

Johny777 02-08-2012 02:13 1963204

Batistas,
касательно .xml в сообщении El Sanchezhttp://forum.oszone.net/post-1932532-253.html

Юра! Что может быть проще чем проверять значение одой логической переменной?
Хочешь пример?
У меня при нажатии на кнопку создаётся форма с чек боксами задач (8 чек боксов) (форма не модальная. После её показа не идёт команда Free)
при нажатии на кнопку на форме, при нажатии на кнопку основного окна с которой эта форма создалась, при переходе на страницу назад форма прячется
пишется значение тру в переменную "форма спрятана"
при наведении на картинку на странице с кнопкой через которую вызывается форма и рядом лежащий на всю оставшуюся страницу прозрачный лейбл, за который можно хвататься курсором мыши, форма разрушается
пишется false в другую переменную "форма существует"
при новом вызове формы идёт "Есои форма существует - форма.Free. если форма не существует, то создать-создать, в конце форма видимая тру, форма существует тру"
логическая переменная кушает мало(булев переменная = 1 бит), а форма значительно больше. Если её не выгружая вызвать 10 раз, то ничего хорошего
мне неприятно будет своим нсталлом глупо съедать ресурсы чужого компа и своего
Теперь хоть 1000 раз нажми
и ещё
форма, если не закрыта разрушается в начале установки
когда формы нет угадай как реализована передача команд "установить директ икс", "уст. визуал" и пр в конце установки? (чекбоксы слетают вместе с формой. Поэтому никаких "если отмечен, то...") :)

Цитата:

Цитата Yury_Prizrak
Я надеялся что можно как-то спрятать страницы но использовать их(страниц) переменные(текстовые поля) »

можно вынести создание страниц в процедуру
читать дальше »
Код:

var
Installed: boolean;

function InitializeSetup(): Boolean;
begin
  Installed := False;
  проверяем есть ли ключ (код 2 страницы назад)
  если есть Installed := True; и пошло по всему коду
end;

procedure CreateSettingPages;
var
  все переменные которые могоут быть локальными сюда
begin
  создаём страницы и всё, что на них
end;

procedure InitializeWizard;
begin
  if not Installed then CreateSettingPages; - создаём страницы. Короче всё, что должно делаться если не установлена
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if not Installed then тоже самое но для того что ты делаешь в переключении страниц
end;


??????????????????????????????

или пропускать их
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    стр1.ID, стр2.ID : Result := Installed;
  end;
end:



И всёж советую тебе выбирать самое простое решение
думаю, то что я тебе посоветовал и есть простое решение
писать альтернативный километр кода если установлена или просто не обрабатывать существующий код(настройку из твоего сообщения) если не установлена
что лучше?

Batistas 02-08-2012 20:46 1963702

Johny777, там нет того, что мне нужно =(

El Sanchez 02-08-2012 22:18 1963768

Цитата:

Цитата Johny777
как обновить рабочий стол через код (правда не уверен, что оно так уж нужно)? »

Johny777,
Код:

[Setup]
ChangesAssociations=yes

Цитата:

Цитата Yury_Prizrak
И вроде как все хорошо и здорово. Но возникла необходимость не давать пользователю менять эти данные(т.е. прятать страницы DBPage и ZXBPage) если программа уже была установлена. При этом первый вариант тоже должен оставатся(это я уже сообразил как реализовать)ю Но если я прячу страницы тогда я не могу пользоватся переменными этих страниц (ConnectionStringEdit.Text например) т.е. если страница спрятана, в эту переменную не подтягивается значение из файла а ставится по умолчанию. Есть вариант ввести дополнительные внутренние переменные в код InnoSetup и записывать значения в них а после перезаписи конфиг. файла считывать из них: »

Yury_Prizrak, попробуйте не прятать, а пропускать страницы при помощи функции ShouldSkipPage. Ну и все процедуры чтения\записи xml-файлов вынести в одну функцию с принимаемыми параметрами типа файл, нода, имя аттрибута, флаг чтение\запись и строковым результатом.

Цитата:

Цитата Batistas
там нет того, что мне нужно »

Batistas, тут поищите

Batistas 02-08-2012 22:31 1963781

El Sanchez, c кнопкой и ссылкой сам разобрался. Скрипт выглядит теперь примерно так:

читать дальше »

; --- Generated by InnoSetup Script Joiner version 3.0, Jul 22 2009, (c) Bulat Ziganshin <Bulat.Ziganshin@gmail.com>. More info at http://issjoiner.codeplex.com/

; --- Source: кнопка.iss ------------------------------------------------------------
[code]
procedure TestButtonOnClick(Sender: TObject);
begin
MsgBox('© 2012, -=Batista=-', mbInformation, MB_OK)
end;

procedure InitializeWizard1();
var
NewButton1: TNewButton;

begin
NewButton1 := TNewButton.Create(WizardForm);
with NewButton1 do begin
Left:=11
Top:=328
Width:=81
Height:=22
Cursor:=crHand
OnClick:=@TestButtonOnClick
Parent:=WizardForm
Caption := 'Автор...';
end
end;

[setup]
; --- Source: setup.iss ------------------------------------------------------------
; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "Synergetic & MaxiRu DC-P2P Pack"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "-=Batista=-"
#define MyAppURL "http://synergetic-hub.org/"
#define MyAppExeName "ApexDC-s16_4.exe"
#define Startupcion "Запускать при старте Windows"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppId={{E20E5BAA-70B0-4EE4-8D27-B1E312B1C083}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=C:\Users\Batista\Desktop\Сборка DC++
OutputBaseFilename=Synergetic & MaxiRu DC-P2P Pack 1.0.0
SetupIconFile=C:\Users\Batista\Desktop\Сборка DC++\ApexDC-s16_4.exe\ApexDC-s16_4.exe\Icon.ico
Compression=lzma2
SolidCompression=yes
AppCopyright=Copyright © 2012 Batista
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 0,6.1
Name: quicklaunchicon7; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; MinVersion: 0,6.1
Name: startupicon; Description: {#Startupcion}; GroupDescription: {cm:AdditionalIcons}

[Files]
Source: ApexDC-s16_4.exe; DestDir: "{app}"; Flags: ignoreversion
Source: AVIPreview.exe; DestDir: "{app}"; Flags: ignoreversion
Source: PinToTasckbar.vbs; DestDir: {tmp}; Flags: deleteafterinstall
Source: Synergetic DC++ Community.url; DestDir: "{app}"; Flags: ignoreversion
Source: Новые возможности клиента ApexDC++.txt; DestDir: "{app}"; Flags: ignoreversion
Source: EmoPacks\*; DestDir: {app}\EmoPacks\;
Source: EmoPacks\Images\*;DestDir: {app}\EmoPacks\Images\;
Source: Settings\*; DestDir: {app}\Settings\;
Source: Sounds\*; DestDir: {app}\Sounds\;
Source: Themes\*; DestDir: {app}\Themes\;
Source: Toolbars\*; DestDir: {app}\Toolbars\;
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{group}\{cm:ProgramOnTheWeb,{#MyAppName}}"; Filename: "{#MyAppURL}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
Name: {userstartup}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: startupicon

[Run]
Filename: {tmp}\PinToTasckbar.vbs; Parameters: """{app}\ApexDC-s16_4.exe"""; Flags: shellexec; Tasks: quicklaunchicon7
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
Filename: "{app}\Synergetic DC++ Community.url"; Description: "Посетить сайт проекта Synergetic and MaxiRu"; Flags: postinstall shellexec skipifsilent

[code]
var
MouseLabel,SiteLabel: TLabel;

procedure SiteLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExec('open', 'http://synergetic-hub.org/', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode)
end;

procedure SiteLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clRed
end;

procedure SiteLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clBlue
end;

procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clGreen
end;

procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clBlue
end;

procedure InitializeWizard2();
begin
MouseLabel:=TLabel.Create(WizardForm)
MouseLabel.Width:=WizardForm.Width
MouseLabel.Height:=WizardForm.Height
MouseLabel.Autosize:=False
MouseLabel.Transparent:=True
MouseLabel.OnMouseMove:=@SiteLabelMouseMove2
MouseLabel.Parent:=WizardForm

SiteLabel:=TLabel.Create(WizardForm)
SiteLabel.Left:=97
SiteLabel.Top:=332
SiteLabel.Cursor:=crHand
SiteLabel.Font.Color:=clBlue
SiteLabel.Caption:='http://synergetic-hub.org/'
SiteLabel.OnClick:=@SiteLabelOnClick
SiteLabel.OnMouseDown:=@SiteLabelMouseDown
SiteLabel.OnMouseUp:=@SiteLabelMouseUp
SiteLabel.OnMouseMove:=@SiteLabelMouseMove
SiteLabel.Parent:=WizardForm
end;
[Setup]


; --- Dispatching code ------------------------------------------------------------

[code]

procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
end;



А вот остальное нет смысла там даже и искать, ведь у флая есть конфигуратор. Вот тут порылся, так и не понял, как абсолютный путь автоматом прописать -
http://forum.oszone.net/post-1798658-175.html , хотя уже близко. А за ответ спасибо.

sergey3695 03-08-2012 10:15 1963941

Привет всем! Никто не знает из-за чего может возникнуть такая ошибка?

Ошибка возникает после распаковки архивов устанавливаемой игры разбитой на два двд. Ошибка не влияет на устанавлимую игру, но из-за неё потом не работает деинсталлятор. Кто знает как это исправить? :dont-know

Leka_651 03-08-2012 11:05 1963989

Добрый день!
Помогите, пожалуйста.
Ситуация следующая: перед установкой делается бекап старых файлов и, если установка была прервана, нужно чтобы файлы из бекапа переносились на старое место.
У меня только частично получилось это сделать. Папка с вложенными папками возвращается обратно и не удаляется. А папка с файлами переносится, но затем удаляется.
Можно ли это как-то сделать, не отказываясь от механизма отката.

Johny777 03-08-2012 11:23 1964005

Leka_651,
Уважаемая!
предоставьте для начала код всего того что Вы описали для наглядности
код в [more][code] здесь весь код [/code][/more]

sergey3695,
рискну предположить, что иконка - внешний файл и лежит на втором диске
если да, то попробуй записать строку секции файлов отвечающей за копирование иконки первой в секции и положить файл на диск рядом с экзешником инсталла

El Sanchez,
а в принципе не нужно
и без обновления рабочего стола по тестам работает на ура
сам попробуй :) (убрал все ограничения. Не проверяется наличие экзешников и ключа реестра)
нововведение - кнопка "параметры"
http://sendfile.su/642570

nik1967 03-08-2012 11:47 1964020

Цитата:

Цитата sergey3695
Никто не знает из-за чего может возникнуть такая ошибка? Кто знает как это исправить?»

Привет! Знает. Тут 2 варианта (больше не думал :) ):
1. Использовать флаг external в секции [Files] для нужных файлов, ну и положить эти файлы на 2 диск (можно в папку).
2. Запаковать нужные файлы в архив и распаковать куда надо в процессе установки. (Ну и естественно удалить их из секции [Files]. Одно но, у этих файлов не будет атрибутов скрытый, системный).

Johny777 03-08-2012 12:30 1964048

Цитата:

Цитата nik1967
Одно но, у этих файлов не будет атрибутов скрытый, системный »

можно через код после распаковки присвоить им эти значения вот таким макаром:
http://forum.oszone.net/post-1721753-2460.html

nik1967 03-08-2012 12:34 1964050

Johny777, ты про
Код:

SetFileAttributes(PChar(ExpandConstant('{app}\desktop.ini')), FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM); //скрываем ини-файл и ставим атрибут системный
Спасибо, не знал. (А в справке не добрался, похоже. Да и не искал, если честно :)).

Johny777 03-08-2012 12:39 1964053

nik1967,
ну тогда вот ещё пример
в отличии от верхнего кода кто автор этого не знаю

"Как проверить, стоит ли атрибут 'Только для чтения' у текстового файла и, если стоит, то убрать его"

Вот два решения:
читать дальше »
Код:

Решение через FindFirst :
function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;
external 'SetFileAttributesA@kernel32.dll stdcall';

procedure InitializeWizard();
var
FileName: string;
SR: TFindRec;
begin
FileName:= 'C:\TEMP\aaa.txt';
FindFirst(FileName, SR);

if (SR.Attributes and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
SetFileAttributes(FileName, FILE_ATTRIBUTE_NORMAL);
FindClose(SR);
end;

Решение через GetFileAttributes :
function GetFileAttributes(lpFileName: string): integer;
external 'GetFileAttributesA@kernel32.dll stdcall';

function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;
external 'SetFileAttributesA@kernel32.dll stdcall';

procedure InitializeWizard();
var
FileName: string;
begin
FileName:= 'C:\TEMP\aaa.txt';
if (GetFileAttributes(FileName) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then
SetFileAttributes(FileName, FILE_ATTRIBUTE_NORMAL);
end;



теперь тема атрибутов "скрытый, системный" раскрыта полностью! :)

nik1967 03-08-2012 12:49 1964057

Johny777, ещё раз спасибо! Я как Плюшкин, всё тяну себе - авось когда и пригодиться :).

Leka_651 03-08-2012 13:06 1964071

Привожу кусок кода - процедуру CancelButtonClick. Весь код для сборки сетапов занимает несколько файлов. Если нужно могу выложить и их.
читать дальше »
Код:


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean );
var
  backup_name, moduly_name, jinnee_dir :string;
begin
      jinnee_dir := ExpandConstant( '{app}{#JINNEE_DIR}' );
// функция BackupDirName возвращает название папки, в которую делается бекап
      backup_name := BackupDirName('');
      moduly_name := ExpandConstant( '{app}{#CLIENT_DIR}' );
      if DirExists(backup_name) then
        begin
          MoveDir(backup_name+'\Модули', moduly_name);
          MsgBox('переместили модули', mbError, MB_OK)
          MoveDir(backup_name+'\Jinnee', jinnee_dir);
          MsgBox('переместили джинн', mbError, MB_OK)
      end;
end;



папка Модули содержит вложенные папки и остается, а папка Jinnee содержит только файлы и в итоге удаляется.

Johny777 03-08-2012 13:20 1964082

Цитата:

Цитата nik1967
Я как Плюшкин, всё тяну себе - авось когда и пригодиться »

я тоже
если хочешь дам тебе папку всех кодов какие есть
только в ней порядок сначала навести нужно

Leka_651,
для процедуры отмены попробуй так
читать дальше »
Код:

[Setup]
AppName=MyAppName
AppVerName=MyAppName
DefaultDirName=MyAppName


[code]
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=False; /// убираем подтверждение
 
  sleep(10000);/// заместо этой строки твой процесс бэкапа (копирование)
 
  Cancel := True; /// после копирования наконец таки выходим из инсталла
end;


Leka_651 03-08-2012 15:17 1964161

Johny777,
попробовала. все осталось по старому.
получается, что стандартный механизм отката запускается после того как я все вытащила из бекапа. и удаляет, но только частично, не трогая папку Модули. Я не понимаю почему так :dont-know

а можно сделать так, чтобы мои действия выполнялись после отката?

Johny777 03-08-2012 15:34 1964177

Leka_651,

ok

постараюсь исправить :)
я так понял "резервно копировать" нужно 2 папки
те сначала резервируем
идёт установка
пользователь передумал
возвращаем папки на место

Leka_651 03-08-2012 15:59 1964191

Johny777,
да, почти все правилно.
Нужно бекапить папку Модули со всеми подпапками, папку Jinnee и dll-файлы из корня. У меня механизм копирования есть.

А вот все вернуть обратно не получается.

Leka_651 03-08-2012 16:50 1964223

Johny777,
я поняла почему у меня остаются подпапки в папке Модули, а каталог Jinnee целиком удаляется
Стандартный механизм откатывает только то, что поставил сетап. Jinnee он ставит целиком и удаляет целиком, а из папки Модули удаляет только те подпапки, что успел поставить до нажатия кнопки "отмена".

Raf-9600 03-08-2012 16:52 1964226

Наверно немного нубский вопрос, но как сделать чтобы отображалась страница выбора папки в пеню "Пуск"? В старых версиях Inno эта страница отображалась просто если есть DefaultGroupName, а сейчас что нужно сделать для её активации?

Johny777 03-08-2012 16:59 1964232

Leka_651,
вопрос:
как инсталл должен вести себя при удалении?
также откатывать всё назад как при отмене установки?



Raf-9600,
нужна секция ярлыков

Leka_651 03-08-2012 17:18 1964240

Johny777,
при удалении нужно чтобы удалялось все, кроме каталога db. он и бекапиться не должен.

Johny777 03-08-2012 17:22 1964241

Leka_651,
в общем для того чтобы помочь тебе с кнопкой отмены мне нужен твой код целиком или самодостаточный вариант бэкапа с файлами для теста

но его нет поэтому сделал свой вариант бэкапа
в нём устранены все дисфункции твоей системы резервного коприрования (по функционалу)

======================================
вот (приписал несколько комментариев) :

читать дальше »
Код:

#define JINNEE_DIR  "JINNEE_DIR"
#define CLIENT_DIR  "CLIENT_DIR"


[Setup]
AppName=Icon_Demo
AppVerName=Icon_Demo
DefaultDirName={pf}\Icon_Demo
Compression=none

[Files]
Source: My_CLIENT_DIR\*; DestDir: {app}\{#CLIENT_DIR}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: My_JINNEE_DIR\*; DestDir: {app}\{#JINNEE_DIR}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[code]
type
  TSHFileOpStruct=record
    Wnd: HWND;
    wFunc: UINT;
    pFrom: PChar;
    pTo: PChar;
    fFlags: Word;
    fAnyOperationsAborted: BOOL;
    hNameMappings: HWND;
    lpszProgressTitle: PChar;
  end;

function SHFileOperation(const lpFileOp: TSHFileOpStruct):integer; external 'SHFileOperation@shell32.dll stdcall';

function CopyFile_(FromFile,ToDir:string;IsRemove:boolean):boolean;
var
  F:TShFileOpStruct;
  a1,a2:string;
begin
  F.Wnd:=0;
  if IsRemove then F.wFunc:=$0001 else F.wFunc:=$0002;
  a1:=FromFile+#0#0;
  F.pFrom:=PChar(a1);
  a2:=AddBackslash(ToDir)+#0#0;
  F.pTo:=PChar(a2);
  F.fFlags:=$0254;
  Result:=(ShFileOperation(F)=0);
end;

procedure BackupDir(const FromDir,ToDir,FileMask :string; IsRemove,IncludeSubDirs: boolean);
var
  FindRec:TFindRec;
  sFileName,fd,td:string;
begin
  fd:=AddBackslash(FromDir);
  td:=AddBackslash(ToDir);
  ForceDirectories(td);
  if FindFirst(fd+FileMask,FindRec) then begin
    try
      repeat
        sFileName:=fd+FindRec.Name;
        if ((FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY)=0) then CopyFile_(sFileName,td,IsRemove)
        else
          if IncludeSubDirs then
            if (FindRec.Name<>'') and (FindRec.Name<>'.') and (FindRec.Name<>'..') then
              BackupDir(sFileName,td+FindRec.Name,FileMask,IsRemove,IncludeSubDirs);
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssInstall: // этап установки /// перед установкой
    begin
      if (DirExists(ExpandConstant('{app}\{#CLIENT_DIR}')) or DirExists(ExpandConstant('{app}\{#JINNEE_DIR}'))) and /// если эти папки существуют в директории установки
      not (DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) and DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) and DirExists(ExpandConstant('{app}\DLL_BACKUP'))) then  /// а эти с бэкапом нет, то
      begin
        with WizardForm do
        begin
          StatusLabel.Caption := 'Резервное копирование папки {#CLIENT_DIR}'; /// в лейбл статуса пишем "резервное копирование..."
          CancelButton.Enabled := False; /// для кравоты и не только блокируем кнопку "Отмена"
          ProgressGauge.Visible := CancelButton.Enabled; /// и делаем прогрессбар невидимым

          /// дополнительно: если папка существует /// то копируемв в такую же с припиской _BACKUP
          if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}')) then BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}'),ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),'*.*',False,True); 
         
          /// дополнительно: если папка существует /// то копируемв в такую же с припиской _BACKUP
          if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}')) then BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}'),ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),'*.*',False,True);
         
          /// копируем библиотеки по маске*(расширению) в папку DLL_BACKUP
          BackupDir(ExpandConstant('{app}'),ExpandConstant('{app}\DLL_BACKUP'),'*.dll',False,True);

          CancelButton.Enabled := True; /// делаем кнопку "Отмена"  активной
          ProgressGauge.Visible := CancelButton.Enabled; /// ну и зависмсость прогресбара от состояния кнопки, те видимым
        end;
      end;
    end;
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean );
begin
  case CurPageID of /// если ай-ди страницы...
 
    wpInstalling: ///...страница установки
    begin
      case ExitSetupMsgBox of
     
        True:
        begin
            if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) or DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then  /// если существуют файлы бэкапа
            begin
              Confirm := False;  /// убираем подтверэдение

              with WizardForm do
              begin
                StatusLabel.Caption := SetupMessage(msgStatusRollback); // в статул лейбл пишем "Откат..."
                CancelButton.Enabled := False; /// для красоты блокируем кнопку "Отмена"
                ProgressGauge.Visible := CancelButton.Enabled; /// прячем прогресбар
                FilenameLabel.Hide; /// прячем застывший лейбл отображающий какой файл только что распаковывался

                if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) then /// здесь тоже самое, только в обратную сторону с удалением
                begin
                  DelTree(ExpandConstant('{app}\{#CLIENT_DIR}'), True, True, True); /// удаляем установленную нами папку    CLIENT_DIR
                  BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),ExpandConstant('{app}\{#CLIENT_DIR}'),'*.*',False,True); /// из бэкапа - пользовательские файлы копируем в папку которую только что удалили - CLIENT_DIR
                  DelTree(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'), True, True, True); /// удаляем папку бэкапа. Дальше по аналогии
                end;

                if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then
                begin
                  DelTree(ExpandConstant('{app}\{#JINNEE_DIR}'), True, True, True);
                  BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),ExpandConstant('{app}\{#JINNEE_DIR}'),'*.*',False,True);
                  DelTree(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'), True, True, True);
                end;

                if DirExists(ExpandConstant('{app}\DLL_BACKUP')) then
                begin
                  BackupDir(ExpandConstant('{app}\DLL_BACKUP'),ExpandConstant('{app}'),'*.dll',False,True);
                  DelTree(ExpandConstant('{app}\DLL_BACKUP'), True, True, True);
                end;
              end;

              Cancel := True;    /// выходим из инсталла
            end;
        end;
       
        False: Cancel := False;
       
      end;
    end;
  end;
end;



Цитата:

Цитата Leka_651
при удалении нужно чтобы удалялось все, кроме каталога db. он и бекапиться не должен. »

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

если нужно откатывать бэкап при удалении, то вот функция

читать дальше »
Код:

#define MyAppName "DisksInfo"
...

function InitializeUninstall(): Boolean;
var
    Errorcode: Integer;
begin
    Result := False;

    if not UninstallSilent then
    begin
        Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
        Exit;
    end;

    if MsgBox(FmtMessage(SetupMessage(msgConfirmUninstall), ['{#MyAppName}']), mbInformation, MB_YESNO) = idYes then
    begin
        if DirExists(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP')) then /// здесь тоже самое, только в обратную сторону с удалением
        begin
          DelTree(ExpandConstant('{app}\{#CLIENT_DIR}'), True, True, True); /// удаляем установленную нами папку    CLIENT_DIR
          BackupDir(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'),ExpandConstant('{app}\{#CLIENT_DIR}'),'*.*',False,True); /// из бэкапа - пользовательские файлы копируем в папку которую только что удалили - CLIENT_DIR
          DelTree(ExpandConstant('{app}\{#CLIENT_DIR}_BACKUP'), True, True, True); /// удаляем папку бэкапа. Дальше по аналогии
        end;

        if DirExists(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP')) then
        begin
          DelTree(ExpandConstant('{app}\{#JINNEE_DIR}'), True, True, True);
          BackupDir(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'),ExpandConstant('{app}\{#JINNEE_DIR}'),'*.*',False,True);
          DelTree(ExpandConstant('{app}\{#JINNEE_DIR}_BACKUP'), True, True, True);
        end;

        if DirExists(ExpandConstant('{app}\DLL_BACKUP')) then
        begin
          BackupDir(ExpandConstant('{app}\DLL_BACKUP'),ExpandConstant('{app}'),'*.dll',False,True);
          DelTree(ExpandConstant('{app}\DLL_BACKUP'), True, True, True);
        end;
   
        Result := True;
        MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#MyAppName}']), mbInformation, MB_OK);
    end
    else Result := False;
end;




пользуйся! :)

Разве установка должна отменяться без подтверждения ("Вы уверены...")?

Leka_651 03-08-2012 17:53 1964260

Johny777,
спасибо огромное :) пошла пробовать.

Цитата:

Цитата Johny777
в общем для того чтобы помочь тебе с кнопкой отмены мне нужен твой код целиком или самодостаточный вариант бэкапа с файлами для теста »

я могу тебе прислать весь код, но его много.

Цитата:

Цитата Johny777
Разве установка должна отменяться без подтверждения ("Вы уверены...")? »

Обязательно нужно спрашивать. Я хочу в итогов варианте оставить только сообщение "Вы уверены что хотите отменить установку?". Все остальные сообщения уберу) зачем загружать пользователя. :)

nik1967 03-08-2012 18:26 1964271

Цитата:

Цитата Johny777
если хочешь дам тебе папку всех кодов какие есть
только в ней порядок сначала навести нужно »

Буду только рад.

Batistas 03-08-2012 19:03 1964285

Ну дак что, мне кто-нибудь поможет? :)

Johny777 05-08-2012 02:13 1964862

скажите пожалуйста как посчитать количество файлов
в папке могут лежать максимум 4 файла. Файлов может быть больше, но инсталл увидит только четыре
мне нужно выполнить действие если "замеченных" файлов больше одного
пока прикинул реализовать так:

iFile1, iFilfe2, iFile3, iFile4: Integer;

if FileExists(S_UPD + '\файл1')) then iFile1 := 1 else iFile1 := 0
if FileExists(S_UPD + '\файл2')) then iFile2 := 1 else iFile2 := 0
if FileExists(S_UPD + '\файл3')) then iFile3 := 1 else iFile3 := 0
if FileExists(S_UPD + '\файл4')) then iFile4 := 1 else iFile4 := 0

if iFile1 + iFilfe2 + iFile3 + iFile4 > 1 then действия

может есть более грамотный способ
я очень мало знаю о .Count
может он?

Gnom_aka_Lexander 05-08-2012 10:11 1964901

Johny777, вот так можно:

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*code]
function GetFileCount(dir: string): Integer;
var
  FindFiles: TFindRec;
begin
  Result:= 0;
  if FindFirst(dir+'\*.*', FindFiles) then
  begin
    repeat
      if FindFiles.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then Continue;
      Result:= Result+1;
    until not FindNext(FindFiles);
    FindClose(FindFiles);
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.WelcomeLabel1.Caption :=  IntToStr(GetFileCount(ExpandConstant('{pf}\Inno Setup 5')));
end;


Johny777 05-08-2012 11:54 1964936

Gnom_aka_Lexander,
спасибо
сохранил себе пример
пригодится
но мне нужно не все подряд считать а только 4 файла с именами
те файлы
'hl2_update.exe'
'hl2_ep1_update.exe'
'hl2_ep2_update.exe'
'portal_update.exe'
дело в том, что у меня на поиск всех этих 4-х обновлений отведена только
одна кнопка вызывающая форму обзора, через которую можно указать их расположение (оно так и должно быть)
пример: "в папке по умолчанию", те рядом с инсталлом лежат 4 файла, те максимальное количество
я хочу установить 3 из них, а один из другой директории
указываю директорию, но там 2 файла и получается, что они (эти 2 архива.exe) перезаписывают существующие пути заменяя {src}\Outer\update
на например C:\update
скрин-пример

папки с многоточием это путь "не рядом с инсталлом"
без многоточия - рядом
в пути лежат 3 апдейта
рядом 4
в итоге из пути будут взяты 3, а из "рядом с инсталом" только 1



поэтому если файлов в указываемой директории больше одного - 2, 3, 4 то должна вылезти маленькая форма (совсем маленькая) с чекбоксами, через которую
можно подтвердить какие апдейты оттуда брать

Gnom_aka_Lexander 05-08-2012 13:01 1964966

Johny777, дык, элементарно добавить условие и все.

читать дальше »
Код:

; перечисляем файлы через запятую, каждый в своих одинарных кавычках, все вместе - в двойных кавычках.
#define FNames "'hl2_update.exe', 'hl2_ep1_update.exe', 'hl2_ep2_update.exe', 'portal_update.exe'"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*code]
function GetFileCount(dir : string): Integer;
var
  FindFiles: TFindRec;
begin
  Result:= 0;
  if FindFirst(dir+'\*.*', FindFiles) then
  begin
    repeat
      if FindFiles.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then Continue;
      case  ExtractFileName(FindFiles.Name) of
        {#FNames} : Result:= Result+1;
      end;
    until not FindNext(FindFiles);
    FindClose(FindFiles);
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.WelcomeLabel1.Caption :=  IntToStr(GetFileCount(ExpandConstant('{pf}\Inno Setup 5')));
end;



в параметре dir функции GetFileCount указываешь нужную тебе папку, или папку, которую вернула функция выбора папки - не знаю, какую из них ты используешь, но смысл понятен, я думаю. так-же можно перечислять не множеством а по очереди и в зависимости от наличия-отсутствия определенного файла дисаблить-енаблить определенные чекбоксы обновления.

Johny777 05-08-2012 14:03 1965011

Gnom_aka_Lexander,
спасибо за функцию :)
понял
Цитата:

Цитата Gnom_aka_Lexander
или папку, которую вернула функция выбора папки - не знаю, какую из них ты используешь »

функция будет прощупывать ту папку на которую укажет пользователь
она будет обрабатываться в событии OnChage элемента конструктора TFolderTreeView
там же и блокируются/разблокируются чекбоксы таким образом:
var
S_UPD: String;
...
S_UPD := TFolderTreeView(Sender).Directory;
hl2_update_Checkbox.Enabled := FileExists(S_UPD + '\hl2_update.exe');
____________________________
ещё хотел спросить

у меня есть просчёт размера устанавливаемых компонентов
там сложение размера файлов и их размер зависит от наличия гкф файла в пути установки
я хотел сделать это математическое сложения для повышения скорости обработки вставкой кода ассемблера
(ассемблер не знаю, но почитал статью
http://sources.ru/delphi/op/learning...delphi_1.shtml
по дельфи, где есть такой пример)
так и не смог
в инно вылетает ошибка на ключевом слове asm

например
function Count(): Integer;
begin

asm
сложение(рассчёт)
end;

end;

получается инно просто его не поддерживает?

Gnom_aka_Lexander 05-08-2012 15:21 1965052

Цитата:

Цитата Johny777
получается инно просто его не поддерживает? »

именно. я нигде в справке не нашел поддержку ассеблерных вствок.
хотя.. компилятор вроде как понимает логическую скобку asm. можно попробовать сделать так:
Код:

function Count(): Integer;
asm
сложение(рассчёт)
end;

тоесть функция полностью на асме, без паскалевских логических скобок.

El Sanchez 06-08-2012 09:34 1965349

Цитата:

Цитата Batistas
Ну дак что, мне кто-нибудь поможет? »

Batistas, держите, рюшечки сами добавите:
читать дальше »

Код:

#define MyAppName "Synergetic & MaxiRu DC-P2P Pack"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "-=Batista=-"
#define MyAppURL "http://synergetic-hub.org/"
#define MyAppExeName "ApexDC-s16_4.exe"
#define StartupIcon "Запускать при старте Windows"

[Setup]
AppId={{E20E5BAA-70B0-4EE4-8D27-B1E312B1C083}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=C:\Users\Batista\Desktop\Сборка DC++
OutputBaseFilename=Synergetic & MaxiRu DC-P2P Pack 1.0.0
SetupIconFile=C:\Users\Batista\Desktop\Сборка DC++\ApexDC-s16_4.exe\ApexDC-s16_4.exe\Icon.ico
Compression=lzma2
SolidCompression=yes

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

[CustomMessages]
russian.NickNamePageCaption=Информация о пользователе
russian.NickNamePageDescription=Какой ник у Вас в DC++?
russian.NickNamePageSubcaption=Укажите ник и нажмите "Далее"%n%nРекомендуемые символы в нике:%n0123456789%nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%n()+=[]^_{{})"%nАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя
russian.NickNamePageEditName=Имя пользователя в DC++:
russian.DownloadDirPageCaption=Выбор каталога для загрузки
russian.DownloadDirPageDescription=Где будут храниться загружаемые файлы?
russian.DownloadDirPageSubcaption=Укажите каталог для скачки (при старте он будет автоматически "расшарен")
russian.ShareDirPageCaption=Выбор каталога для общего доступа
russian.ShareDirPageDescription=Где будут храниться файлы для общего доступа?
russian.ShareDirPageSubcaption=Укажите каталог для файлов общего доступа

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1
Name: startupicon; Description: {#StartupIcon}; GroupDescription: {cm:AdditionalIcons}

[Files]
Source: "ApexDC-s16_4.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\Batista\Desktop\Сборка DC++\ApexDC-s16_4.exe\ApexDC-s16_4.exe\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs


[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
Name: {userstartup}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: startupicon

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent
Filename: {#MyAppURL}; Verb: open; Description: Посетить сайт проекта Synergetic & MaxiRu; Flags: postinstall shellexec skipifsilent

[code]
var
    NickNamePage: TInputQueryWizardPage;
    DownloadDirPage, ShareDirPage: TInputDirWizardPage;
    AboutInfoButton: TButton;
    URLlink: TLabel;

procedure CreateDCPlusPlus(Filename: String);
var
    objXMLDoc: Variant;
begin
    try
        objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
    except
        ShowExceptionMessage;
        Exit;
    end;
    objXMLDoc.async := False;
    objXMLDoc.AppendChild(objXMLDoc.createProcessingInstruction('xml', 'version="1.0" encoding="utf-8" standalone="yes"'));
    objXMLDoc.AppendChild(objXMLDoc.createNode(1, 'DCPlusPlus', ''));

    //settings node
    objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createNode(1, 'Settings', ''));

    //nick node
    objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'Nick', ''));
    objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/Nick').text := NickNamePage.Values[0];

    //downdir node
    objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'DownloadDirectory', ''));
    objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/DownloadDirectory').text := DownloadDirPage.Values[0];

    //russian xml
    if FileExists(ExpandConstant('{app}\Settings\Russian.xml')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'LanguageFile', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/LanguageFile').text := 'Russian.xml';
    end;

    //sounds
    if FileExists(ExpandConstant('{app}\Sounds\PrivateMessage.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'BeepFile', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/BeepFile').text := 'PrivateMessage.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\DownloadBegins.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'BeginFile', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/BeginFile').text := 'DownloadBegins.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\DownloadFinished.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'FinishedFile', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/FinishedFile').text := 'DownloadFinished.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\AltSourceAdded.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SourceFile', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SourceFile').text := 'AltSourceAdded.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\UploadFinished.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'UploadFile', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/UploadFile').text := 'UploadFinished.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\FakerFound.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'FakerFile', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/FakerFile').text := 'FakerFound.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\MyNickInMainChat.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'ChatNameFile', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/ChatNameFile').text := 'MyNickInMainChat.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\FileCorrupted.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundTTH', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundTTH').text := 'FileCorrupted.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\UnhandledException.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundException', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundException').text := 'UnhandledException.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\HubConnected.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundHubConnected', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundHubConnected').text := 'HubConnected.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\HubDisconnected.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundHubDisconnected', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundHubDisconnected').text := 'HubDisconnected.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\FavUser.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundFavUserOnline', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundFavUserOnline').text := 'FavUser.wav';
    end;

    if FileExists(ExpandConstant('{app}\Sounds\FavUserDisconnected.wav')) then
    begin
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundFavUserOffline', ''));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundFavUserOffline').text := 'FavUserDisconnected.wav';
    end;

    //share node
    objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createNode(1, 'Share', ''));
    objXMLDoc.selectSingleNode('//DCPlusPlus/Share').AppendChild(objXMLDoc.createNode(1, 'Directory', ''));
    objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').setAttribute('Virtual', ExtractFileName(RemoveBackSlash(ShareDirPage.Values[0])));
    objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').text := ShareDirPage.Values[0];

    //prevapps node
    objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createNode(1, 'PreviewApps', ''));
    objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps').AppendChild(objXMLDoc.createNode(1, 'Application', ''));
    objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Name', 'AVI Preview');
    objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Application', ExpandConstant('{app}\AVIPreview.exe'));
    objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Arguments', '%[file]');
    objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Extension', 'avi;divx;mpg;mpeg;vob');
 
    objXMLDoc.save(Filename);
end;

function ReadDCPlusPlus(Filename, Node, Default: String): String;
var
    objXMLDoc: Variant;
begin
    Result := Default;
    if not FileExists(Filename) then Exit;
    try
        objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
    except
        ShowExceptionMessage;
        Exit;
    end;
    objXMLDoc.load(Filename);
    objXMLDoc.async := False;
    if objXMLDoc.parseError.errorCode <> 0 then Exit;
    Result := objXMLDoc.selectSingleNode(Node).text;
end;

procedure CreateNickNamePage;
begin
    NickNamePage := CreateInputQueryPage(wpSelectTasks, ExpandConstant('{cm:NickNamePageCaption}'), ExpandConstant('{cm:NickNamePageDescription}'), ExpandConstant('{cm:NickNamePageSubcaption}'));
    NickNamePage.Add(ExpandConstant('{cm:NickNamePageEditName}'), False);
    NickNamePage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Settings/Nick', '');
end;

procedure CreateDownloadDirPage;
begin
    DownloadDirPage := CreateInputDirPage(NickNamePage.ID, ExpandConstant('{cm:DownloadDirPageCaption}'), ExpandConstant('{cm:DownloadDirPageDescription}'), ExpandConstant('{cm:DownloadDirPageSubcaption}'), False, 'Новая папка');
    DownloadDirPage.Add('');
    DownloadDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Settings/DownloadDirectory', WizardDirValue + '\Settings\Downloads');
end;

procedure CreateShareDirPage;
begin
    ShareDirPage := CreateInputDirPage(DownloadDirPage.ID, ExpandConstant('{cm:ShareDirPageCaption}'), ExpandConstant('{cm:ShareDirPageDescription}'), ExpandConstant('{cm:ShareDirPageSubcaption}'), False, 'Новая папка');
    ShareDirPage.Add('');
    ShareDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Share/Directory', '');
end;

procedure ControlOnClick(Sender: TObject);
var
    ResultCode: Integer;
begin
    if Sender is TButton then MsgBox('bla-bla-bla', mbInformation, MB_OK);
    if Sender is TLabel then ShellExec('open', '{#MyAppURL}', '', '', SW_SHOW, ewNoWait, ResultCode);
end;

procedure CreateAboutInfoButton;
begin
    AboutInfoButton := TButton.Create(WizardForm);
    with AboutInfoButton do begin
        Parent := WizardForm;
        SetBounds(WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width, WizardForm.CancelButton.Top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
        Caption := 'About...';
        OnClick := @ControlOnClick;
    end;
end;

procedure CreateURLlink;
begin
    URLlink := TLabel.Create(WizardForm);
    with URLlink do begin
        Parent := WizardForm;
        Left := 2*AboutInfoButton.Left + AboutInfoButton.Width;
        Top := AboutInfoButton.Top + AboutInfoButton.Height - Height;
        Caption := '{#MyAppURL}';
        Font.Color := clBlue;
        Font.Style := [fsUnderline];
        Cursor := crHand;
        OnClick := @ControlOnClick;
    end;
end;

procedure InitializeWizard();
begin
    CreateNickNamePage;
    CreateDownloadDirPage;
    CreateShareDirPage;
    CreateAboutInfoButton;
    CreateURLlink;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    case CurStep of
        ssPostInstall: CreateDCPlusPlus(ExpandConstant('{app}\Settings\DCPlusPlus.xml'));
    end;
end;


Batistas 06-08-2012 23:43 1965834

Цитата:

Batistas, держите, рюшечки сами добавите
Все бы идеально, если бы не - http://s51.radikal.ru/i132/1208/f8/f20598db3f63.png (ISC 5.5.1 Unicode) и - http://s60.radikal.ru/i169/1208/8a/1e05c2f2ca3a.png (ISS 5.5.1) :( Система Win 7 x64 SP1

nik1967 06-08-2012 23:56 1965842

Batistas, может стоит установить расширенную версию от Китайских братьев? ISC 5.5.1. ee1 (u) Система Win 7 x64 SP1

Batistas 07-08-2012 00:47 1965873

Цитата:

Batistas, может стоит установить расширенную версию от Китайских братьев? ISC 5.5.1. ee1 (u) Система Win 7 x64 SP1
http://s014.radikal.ru/i329/1208/08/29dbd796a9c2.png :( Может быть я что не так установил...

Gnom_aka_Lexander 07-08-2012 09:13 1965980

Цитата:

Цитата Batistas
Может быть я что не так установил... »

именно. обновлен у китайцев только препроцессор с дополнительным функционалом. компилятор обновлен не был и он не совместим с версией 5.5.*. ставишь инно заново, накатываешь сверху Inno ISCmplr Setup build 120726 и ни в коем случае не добавляешь туда Inno Setup Compiler build 120112, поскольку, как уже говорилось, он совершенно несовместим с версией 5.5.*. Все должно заработать.

Batistas 07-08-2012 10:20 1966037

Цитата:

Цитата Gnom_aka_Lexander

Ничего не выходит...Удалил старую версию, отчистил реестр. Скачал с официального сайта isetup-5.5.1-unicode.exe (SHA-1: 9E1E4F37F50E58E182F929A88E391AFF9C10A8E7), установил. Далее скачал архив Inno_ISCmplr_Setup120726(7zip).zip (SHA-1: 5CE7A5318245E3DF691FE4734DF1D87158481F52), разархивировал. Скопировал содержимое папки .\Inno_ISCmplr_Setup120726(7zip)\InnoSetup_Unicode\FullVCL в папку с Inno Setup. Попробовавл скопилировать скрипт - выдает ошибку - http://s017.radikal.ru/i404/1208/c6/56ad36538d84.png Вот сама Inno - http://narod.ru/disk/59001053001.d3c...p%205.rar.html

Gnom_aka_Lexander 07-08-2012 10:33 1966054

Batistas, залей на обменник проект целиком со всеми файлами. у меня все великолепно компилится, на 5.4.3 расширенной. Подозреваю, что ошибка после внесения тобой каких-либо изменений в скрипт.

nik1967 07-08-2012 12:25 1966138

Batistas, и кстати, да, ошибка возможна из-за файлов. Попробуй закомментировать секцию [Files] (все файлы) и у меня ещё закомментирована строка ";SetupIconFile=Icon.ico" - всё прекрасно компилируется и на Compil32.exe и на Compil32Ex.exe.

El Sanchez 07-08-2012 14:04 1966208

Batistas, определимся с понятиями. Файлы ISCmplr.dll, Setup.e32, SetupLdr.e32, ISCC.exe, ISPP.dll - это файлы компилятора и препроцессора, Compil32(Ex).exe - редактор (среда разработки, IDE). Скрипт компилируется на обоих видах компилятора (ANSI и Unicode), но отработал только в ANSI, на Unicode ругань на несоответствие типов, крах при создании аттрибутов, ваша ошибка тоже всплыла. Оказалось, что юникоду не понравились метод createElement при создании нод и метод setAttribute при создании аттрибутов. Процедуру CreateDCPlusPlus в своем предыдущем посте исправил.

Batistas 07-08-2012 15:01 1966246

nik1967, Gnom_aka_Lexander помог мне потестить - у него все работает. У меня же выдает ошибку:
читать дальше »
"[17:57:04,339] *** Установка started
[17:57:07,052] Setup version: Inno Setup version 5.4.3.ee1 (u)
[17:57:07,053] Original Setup EXE: C:\Users\Batista\Desktop\Сборка DC++\ApexDC-s16_4.exe\ApexDC-s16_4.exe\Output\Synergetic & MaxiRu DC-P2P Pack 1.0.0.exe
[17:57:07,054] Setup command line: /SL5="$160888,2072628,140800,C:\Users\Batista\Desktop\Сборка DC++\ApexDC-s16_4.exe\ApexDC-s16_4.exe\Output\Synergetic & MaxiRu DC-P2P Pack 1.0.0.exe" /DEBUGWND=$230120
[17:57:07,055] Windows version: 6.1.7601 SP1 (NT platform: Yes)
[17:57:07,056] 64-bit Windows: Yes
[17:57:07,057] Processor architecture: x64
[17:57:07,058] User privileges: Administrative
[17:57:07,065] 64-bit install mode: No
[17:57:07,067] Created temporary directory: C:\Users\Batista\AppData\Local\Temp\is-ELRD4.tmp
[17:57:07,365] InitializeWizard raised an exception (fatal).
[17:57:07,367] Exception message:
[17:57:07,368] Message box (OK):
Runtime Error (at 0:0):

Variant is null, cannot invoke.
[17:57:09,104] User chose OK.
[17:57:09,106] Deinitializing Setup.
[17:57:09,251] *** Установка exit code: 1

El Sanchez, спасибо, я с версиями уже разобрался. Компилировал при помощи Inno Ultra. И вообще, у меня такое ощущение складывается, что дело в системе. Ведь экзэшник скомпилированный появляется в папке аутпат, но не запускается. Сегодня попробую через LiveCD все это дело проделать

Разобрался. Запустилось только с переменной "ArchitecturesInstallIn64BitMode=x64", сейчас буду тестить. :)
Собсно результат тестирования: запустился два раза, один раз с рантайм ерор и зависла, второй раз тоже с рантайм ерор, до конца дошла, но ни ник, ни звук не прописались.
Все-таки придется с лайв сиди возиться :(

Ivan_009 07-08-2012 16:12 1966283

Как сделать свою форму запроса выхода из установки примерно как тут и чтобы работала с IsDone :dont-know

Johny777 07-08-2012 21:14 1966448

Ivan_009,
я раньше уже выкладывал этот код (ты воспользовался бы поиском)
ну да ладно
выдрал у себя из скрипта без отсылки на тот код тк этот лучше:

читать дальше »
Код:

[Setup]
AppName=Cancel_Demo
AppVerName=Cancel_Demo
DefaultDirName={pf}\Cancel_Demo


[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl;
Name: English; MessagesFile: compiler:Languages\English.isl;


[CustomMessages]
Russian.Close=Выход
English.Close=Exit

Russian.Exit_Install=Выйти из инсталлятора?
English.Exit_Install=Exit Installer?

Russian.Exit_Install_2=Отменить установку?
English.Exit_Install_2=Cancel Installation?


[code]
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord; external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: LongWord; uPosition, uFlags: UINT): BOOL; external 'DeleteMenu@user32.dll stdcall';
function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLongA@user32.dll stdcall';
function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLongA@user32.dll stdcall';

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
var
  MyExit: TSetupForm;

begin
  Confirm := False;
 
  MyExit := CreateCustomForm();
  with MyExit do
  begin
    Position := poScreenCenter;
    ClientWidth := ScaleX(200);
    ClientHeight := ScaleY(87);
    Caption := ExpandConstant('{cm:Close}');
    Color := clBtnFace;
    DeleteMenu(GetSystemMenu(MyExit.Handle,False), $F060,0); /// сделать кнопку "закрыть" неактивной
    SetClassLong(MyExit.Handle, -26, GetClassLong(MyExit.Handle, -26) or $200); /// блокировка комбинации alt + f4

    with TLabel.Create(nil) do
    begin
      AutoSize := False;
      if WizardForm.CurPageID = wpInstalling then
      begin
        if ActiveLanguage = 'Russian' then SetBounds(ScaleX(37), ScaleY(16), ScaleX(140), ScaleY(30)) else SetBounds(ScaleX(47), ScaleY(16), ScaleX(140), ScaleY(30));
        Caption := ExpandConstant('{cm:Exit_Install_2}');
      end else
      begin
        if ActiveLanguage = 'Russian' then SetBounds(ScaleX(30), ScaleY(16), ScaleX(140), ScaleY(30)) else SetBounds(ScaleX(65), ScaleY(16), ScaleX(140), ScaleY(30));
        Caption := ExpandConstant('{cm:Exit_Install}');
      end;
      Parent := MyExit;
      Font.Size := 9;
    end;

    with TButton.Create(nil) do
    begin
      Parent := MyExit;
      Caption := ExpandConstant(SetupMessage(msgButtonNo));
      SetBounds(ScaleX(18), ScaleY(47), ScaleX(71), ScaleY(25));
      Cursor := crHand;
      ModalResult:= mrNo;
    end;

    with TButton.Create(nil) do
    begin
      Caption := ExpandConstant(SetupMessage(msgButtonYes));
      Parent := MyExit;
      SetBounds(ScaleX(110), ScaleY(47), ScaleX(71), ScaleY(25));
      Cursor := crHand;
      ModalResult := mrYes;
    end;

    case ShowModal() of
   
      mrNo : Cancel := False;       

      mrYes :
      begin
        case
          WizardForm.CurPageID of
          wpInstalling : Application.Title := ExpandConstant(' ' + SetupMessage(msgButtonCancel) + '...');
        end;
      end;
     
    end;
   
    Free;
  end;
end;


Цитата:

Цитата Ivan_009
и чтобы работала с IsDone »

пример выше с ним не работает
IsDone не знаю

Mailchik 07-08-2012 21:22 1966451

Цитата:

и чтобы работала с IsDone
Код:

procedure CancelButtonOnClick(Sender: TObject);
begin 
SuspendProc; 
MyExitMessage(); 
if MyExit.ShowModal() = mryes then  ISDoneCancel:=1; 
ResumeProc;
end;
MyCancelButton.OnClick := @CancelButtonOnClick;

Для кода, который выложил товарищ Johny777 выше.

Serega 07-08-2012 21:58 1966476

Цитата:

Цитата Gnom_aka_Lexander
элементарно добавить условие и все. »

Зачем перебирать все имена в папке, когда можно просто указать маску?
Так будет быстрей работать:
читать дальше »

Код:

function GetFileCount(dir, mask: string): Integer;
var
  FindFiles: TFindRec;
begin
  Result := 0;
  if dir[Length(dir)] <> '\' then
    Insert('\', dir, Length(dir)+1);
  if FindFirst(dir + mask, FindFiles) then
    begin
      repeat
        if FindFiles.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
          case FindFiles.Name of
            {#FNames}: Result := Result + 1;
          end;
      until not FindNext(FindFiles);
      FindClose(FindFiles);
    end;
end;

procedure InitializeWizard();
begin
  WizardForm.WelcomeLabel1.Caption :=  IntToStr(GetFileCount(ExpandConstant('{pf}\Inno Setup 5'), '*_update.exe'));
end;


Цитата:

Цитата Gnom_aka_Lexander
тоесть функция полностью на асме, без паскалевских логических скобок. »

Ассеблер не поддерживается в Инно.

Ivan_009 08-08-2012 08:05 1966626

Покажите пожалуйста пример как пользоваться Inno Setup Unpacker 0.37 как распаковать инсталлятор... :sorry:

alert30 08-08-2012 09:15 1966651

Ivan_009, UnPacker распаковывает только инсталляторы, которые компилировались на стандартном компиляторе; а вот если использовать UnPacker, т.е. распаковать инсталляторы, которые компилровались на расширенном китайском компиляторе, выдает ошибку.

Johny777 08-08-2012 12:28 1966766

Serega,
спасибо за функцию. Она быстрее прощупывает папки с большим количеством файлов
только вот вылетала
ошибка
читать дальше »

---------------------------
Ошибка запуска
---------------------------
Строка 1179:

Out Of String Range.
---------------------------
ОК
---------------------------

на строке:
Код:

  if dir[Length(dir)] <> '\' then
    Insert('\', dir, Length(dir)+1);

а именно при нажатии на кнопку отмена на маленькой форме
форма появляется при таком вот условии
if (GetFileCount(S_UPD, '*_update.exe') > 1) and (GetFileCount(ExpandConstant('{src}\outer\update'), '*_update.exe') > 0) and (S_UPD <> ExpandConstant('{src}\outer\update')) then
те если в пути указываемом в TFolderTreeView файлов больше одного, а в директории по умолчанию - папка Outer рядом с инсталлом - есть хоть один файл
после появления формы при нажатии на кнопку отмена директория TFolderTreeView сбрасывается:
TFolderTreeView(Sender).Directory := ExpandConstant('{src}\outer\update');
вот тут-то и вылетала ошибка
исправил (выделил зелёным):
читать дальше »
Код:

function GetFileCount(dir, mask: string): Integer;
var
  FindFiles: TFindRec;
begin
  Result := 0;
  if FindFirst(dir +'\' + mask, FindFiles) then
    begin
      repeat
        if FindFiles.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
          case FindFiles.Name of
            {#FNames}: Result := Result + 1;
          end;
      until not FindNext(FindFiles);
      FindClose(FindFiles);
    end;
end;


надеюсь этим как обычно не накосячил (может стоило воспользоваться встроенной AddBackslash ?), хотя вроде по тестам всё в порядке :)

============================================================================ другой вопрос/просьба
вот процедура рассчёта свободного места

читать дальше »
Код:

/// свободное место /// начало
var
  Size_Form_Exist: boolean;
  Size_Form: TSetupForm;
  NeedSizeLabel, FreeSizeLabel: TLabel;
  No_Space: boolean;
  One_Game_Selected: boolean;

  half_life_2_russian_gcf: boolean;                  // 1
  half_life_2_buka_russian_gcf: boolean;            // 2
  half_life_2_2007_base_content_gcf: boolean;        // 3
  half_life_2_content_gcf: boolean;                  // 4
 // half_life_2_game_dialog_gcf: boolean;              // 5
  episode_one_2007_content_gcf: boolean;            // 6
  half_life_2_episode_one_gcf: boolean;              // 7
  episodic_2007_shared_gcf: boolean;                // 8
  episode_1_shared_gcf: boolean;                    // 9
  half_life_2_episode_two_english_gcf: boolean;      // 10
  episode_two_content_gcf: boolean;                  // 11
  episode_two_maps_gcf: boolean;                    // 12
  episode_two_materials_gcf: boolean;                // 13
  portal_english_gcf: boolean;                      // 14
  portal_content_gcf: boolean;                      // 15
  source_2007_binaries_2_gcf: boolean;              // 16
  source_2007_shared_materials_gcf: boolean;        // 17
  source_2007_shared_models_gcf: boolean;            // 18
  source_2007_shared_sounds_gcf: boolean;            // 19
  source_materials_gcf: boolean;                    // 20
  source_models_gcf: boolean;                        // 21
  source_sounds_gcf: boolean;                        // 22
  half_life_2_episode_one_russian_gcf: boolean;      // 23
  half_life_2_episode_two_russian_gcf: boolean;      // 24
  portal_russian_gcf: boolean;                      // 25

procedure Calculate;
var
  NeedSize: Integer;
  iCore_All, iCoreEpisodes: Integer;
  ihl2_Size, ihl2_russian_Size, ihl2_russian_buka_Size: Integer;
  ihl2_ep1_Size, ihl2_ep1_russian_Size: Integer;
  ihl2_ep2_Size, ihl2_ep2_russian_Size, ihl2_ep2_english_Size: Integer;
  iPortal_Size, iPortal_russian_Size, iPortal_english_Size: Integer;
  ihl2_Dir_Size, iep1_Dir_Size, iep2_Dir_Size, iportal_Dir_Size: Integer;

  One_Episode_Selected: boolean;

  i_half_life_2_russian_gcf: Integer;                  // 1
  i_half_life_2_buka_russian_gcf: Integer;            // 2
  i_half_life_2_2007_base_content_gcf: Integer;        // 3
  i_half_life_2_content_gcf: Integer;                  // 4
 // i_half_life_2_game_dialog_gcf: Integer;              // 5
  i_episode_one_2007_content_gcf: Integer;            // 6
  i_half_life_2_episode_one_gcf: Integer;              // 7
  i_episodic_2007_shared_gcf: Integer;                // 8
  i_episode_1_shared_gcf: Integer;                    // 9
  i_half_life_2_episode_two_english_gcf: Integer;      // 10
  i_episode_two_content_gcf: Integer;                  // 11
  i_episode_two_maps_gcf: Integer;                    // 12
  i_episode_two_materials_gcf: Integer;                // 13
  i_portal_english_gcf: Integer;                      // 14
  i_portal_content_gcf: Integer;                      // 15
  i_source_2007_binaries_2_gcf: Integer;              // 16
  i_source_2007_shared_materials_gcf: Integer;        // 17
  i_source_2007_shared_models_gcf: Integer;            // 18
  i_source_2007_shared_sounds_gcf: Integer;            // 19
  i_source_materials_gcf: Integer;                    // 20
  i_source_models_gcf: Integer;                        // 21
  i_source_sounds_gcf: Integer;                        // 22
  i_half_life_2_episode_one_russian_gcf: Integer;      // 23
  i_half_life_2_episode_two_russian_gcf: Integer;      // 24
  i_portal_russian_gcf: Integer;                      // 25

begin
  if not Size_Form_Exist then
  begin
    if not Param and not Game_From_INI_Selected then
    begin
      half_life_2_russian_gcf := FileExists(WizardForm.DirEdit.Text + '\half-life 2_russian.gcf');
      half_life_2_buka_russian_gcf := FileExists(WizardForm.DirEdit.Text + '\half-life 2 buka russian.gcf');
      half_life_2_2007_base_content_gcf := FileExists(WizardForm.DirEdit.Text + '\half-life 2 2007 base content.gcf');
      half_life_2_content_gcf := FileExists(WizardForm.DirEdit.Text + '\half-life 2 content.gcf');
    // half_life_2_game_dialog_gcf := FileExists(WizardForm.DirEdit.Text + '\half-life 2 game dialog.gcf');
      episode_one_2007_content_gcf := FileExists(WizardForm.DirEdit.Text + '\episode one 2007 content.gcf');
      half_life_2_episode_one_gcf := FileExists(WizardForm.DirEdit.Text + '\half-life 2 episode one.gcf');
      episodic_2007_shared_gcf := FileExists(WizardForm.DirEdit.Text + '\episodic 2007 shared.gcf');
      episode_1_shared_gcf := FileExists(WizardForm.DirEdit.Text + '\episode 1 shared.gcf');
      half_life_2_episode_two_english_gcf := FileExists(WizardForm.DirEdit.Text + '\half-life 2 episode two english.gcf');
      episode_two_content_gcf := FileExists(WizardForm.DirEdit.Text + '\episode two content.gcf');
      episode_two_maps_gcf := FileExists(WizardForm.DirEdit.Text + '\episode two maps.gcf');
      episode_two_materials_gcf := FileExists(WizardForm.DirEdit.Text + '\episode two materials.gcf');
      portal_english_gcf := FileExists(WizardForm.DirEdit.Text + '\portal english.gcf');
      portal_content_gcf := FileExists(WizardForm.DirEdit.Text + '\portal content.gcf');
      source_2007_binaries_2_gcf := FileExists(WizardForm.DirEdit.Text + '\source 2007 binaries 2.gcf');
      source_2007_shared_materials_gcf := FileExists(WizardForm.DirEdit.Text + '\source 2007 shared materials.gcf');
      source_2007_shared_models_gcf := FileExists(WizardForm.DirEdit.Text + '\source 2007 shared models.gcf');
      source_2007_shared_sounds_gcf := FileExists(WizardForm.DirEdit.Text + '\source 2007 shared sounds.gcf');
      source_materials_gcf := FileExists(WizardForm.DirEdit.Text + '\source materials.gcf');
      source_models_gcf := FileExists(WizardForm.DirEdit.Text + '\source models.gcf');
      source_sounds_gcf := FileExists(WizardForm.DirEdit.Text + '\source sounds.gcf');
      half_life_2_episode_one_russian_gcf := FileExists(WizardForm.DirEdit.Text + '\half-life 2 episode one russian.gcf');
      half_life_2_episode_two_russian_gcf := FileExists(WizardForm.DirEdit.Text + '\half-life 2 episode two russian.gcf');
      portal_russian_gcf := FileExists(WizardForm.DirEdit.Text + '\portal russian.gcf');
    end;
   
    Size_Form := CreateCustomForm();
    with Size_Form do
    begin
      ClientWidth := ScaleX(187);
      ClientHeight := ScaleY(54);
      BorderIcons := [];
      Caption := ExpandConstant('{cm:SFormCaption}');
      Left := WizardForm.Left + ScaleX(346);
      Top := WizardForm.Top - ScaleY(87);
      DeleteMenu(GetSystemMenu(Size_Form.Handle,False), $F060,0); /// сделать кнопку "закрыть" неактивной
      SetClassLong(Size_Form.Handle, -26, GetClassLong(Size_Form.Handle, -26) or $200); /// блокировка комбинации alt + f4
      if not No_Backgr_Pic then FormStyle := fsStayOnTop;

      NeedSizeLabel := TLabel.Create(nil)
      with NeedSizeLabel do
      begin
        Parent := Size_Form;
        SetBounds(ScaleX(7), ScaleY(1), ScaleX(50), ScaleY(13));
        Caption := ExpandConstant('{cm:Count}');
      end;

      FreeSizeLabel := TLabel.Create(nil)
      with FreeSizeLabel do
      begin
        Parent := Size_Form;
        SetBounds(ScaleX(7), ScaleY(23), ScaleX(50), ScaleY(13));
        Caption := ExpandConstant('{cm:Analyze}');
      end;

      GetSpaceOnDisk(ExtractFileDrive(WizardForm.DirEdit.Text), True, FreeMB, TotalMB);
      FreeSizeLabel.Caption := ExpandConstant('{cm:Free_Space} ') + FloatToStr(round(FreeMB/1024*100)/100) + ExpandConstant(' {cm:Gb}');

      Show;
      Repaint;
      Size_Form_Exist := True;
    end;
    SendMessage(WizardForm.Handle,$0112,$F012,0); // нажимаем на окно, чтоб стало активным
  end;
  ////////////////////////////////////////////

  One_Episode_Selected := (hl2_ru_RadioButton.Checked and hl2_ru_RadioButton.Enabled) or (hl2_ep1_ru_RadioButton.Checked and hl2_ep1_ru_RadioButton.Enabled) or (hl2_ep2_ru_RadioButton.Checked and hl2_ep2_ru_RadioButton.Enabled);



  //  half_life_2_game_dialog_gcf
  if hl2_CheckBox.Checked and hl2_CheckBox.Enabled then /// эксклюзивные  файлы халфы 2
  begin
    if not DirExists(WizardForm.DirEdit.Text + '\common\half-life 2') then ihl2_Dir_Size := 1903 else ihl2_Dir_Size := 0;
    if not half_life_2_buka_russian_gcf then i_half_life_2_buka_russian_gcf := 428 else i_half_life_2_buka_russian_gcf := 0;
    if not half_life_2_2007_base_content_gcf then i_half_life_2_2007_base_content_gcf := 498 else i_half_life_2_2007_base_content_gcf := 0;
    if not half_life_2_content_gcf then i_half_life_2_content_gcf := 841 else i_half_life_2_content_gcf := 0; /// точно

    if (hl2_buka_CheckBox.Checked and hl2_buka_CheckBox.Enabled) then  ihl2_russian_buka_Size := i_half_life_2_buka_russian_gcf else  ihl2_russian_buka_Size := 0; /// бука

    ihl2_Size := i_half_life_2_2007_base_content_gcf + i_half_life_2_content_gcf + ihl2_Dir_Size // где 1844 это размер папки с файлами
  end;



  if hl2_ep1_CheckBox.Checked and hl2_ep1_CheckBox.Enabled then /// эксклюзивные файлы эпизода 1
  begin
    if not DirExists(WizardForm.DirEdit.Text + '\common\half-life 2 episode one') then iep1_Dir_Size := 142 else iep1_Dir_Size := 0;
    if not episode_one_2007_content_gcf then i_episode_one_2007_content_gcf := 246 else i_episode_one_2007_content_gcf := 0; /// точно
    if not half_life_2_episode_one_gcf then i_half_life_2_episode_one_gcf := 606 else i_half_life_2_episode_one_gcf := 0; /// точно

    ihl2_ep1_Size := i_episode_one_2007_content_gcf + i_half_life_2_episode_one_gcf + iep1_Dir_Size
  end;



  if hl2_ep2_CheckBox.Checked and hl2_ep2_CheckBox.Enabled then /// зксклюзивные файлы эпизода 2
  begin
    if not DirExists(WizardForm.DirEdit.Text + '\common\half-life 2 episode two') then iep2_Dir_Size := 332 else iep2_Dir_Size := 0;
    if not half_life_2_episode_two_russian_gcf then i_half_life_2_episode_two_russian_gcf := 303 else i_half_life_2_episode_two_russian_gcf := 0;
    if not half_life_2_episode_two_english_gcf then i_half_life_2_episode_two_english_gcf := 500 else i_half_life_2_episode_two_english_gcf := 0;
    if not episode_two_content_gcf then i_episode_two_content_gcf := 1442 else i_episode_two_content_gcf := 0;
    if not episode_two_maps_gcf then i_episode_two_maps_gcf := 675 else i_episode_two_maps_gcf := 0;
    if not episode_two_materials_gcf then i_episode_two_materials_gcf := 670 else i_episode_two_materials_gcf := 0;

    if (hl2_ep2_ru_RadioButton.Checked and hl2_ep2_ru_RadioButton.Enabled) then ihl2_ep2_russian_Size := i_half_life_2_episode_two_russian_gcf else ihl2_ep2_russian_Size := 0; /// русская озвучка относится только ко второму эпизоду
    if (hl2_ep2_en_RadioButton.Checked and hl2_ep2_en_RadioButton.Enabled) or (hl2_ep2_ru_en_RadioButton.Checked and hl2_ep2_ru_en_RadioButton.Enabled) then ihl2_ep2_english_Size := i_half_life_2_episode_two_english_gcf else  ihl2_ep2_english_Size := 0

    ihl2_ep2_Size := i_episode_two_content_gcf + i_episode_two_maps_gcf + i_episode_two_materials_gcf + iep2_Dir_Size
  end;



  if portal_CheckBox.Checked and portal_CheckBox.Enabled then // экссклюзив файлы Портала
  begin
    if not DirExists(WizardForm.DirEdit.Text + '\common\portal') then iportal_Dir_Size := 121 else iportal_Dir_Size := 0;
    if not portal_russian_gcf then i_portal_russian_gcf := 111 else i_portal_russian_gcf := 0; /// точно
    if not portal_english_gcf then i_portal_english_gcf := 160 else i_portal_english_gcf := 0; /// точно
    if not portal_content_gcf then i_portal_content_gcf := 1049 else i_portal_content_gcf := 0; /// точно

    if (portal_ru_RadioButton.Checked and portal_ru_RadioButton.Enabled) then iPortal_russian_Size := i_portal_russian_gcf else  iPortal_russian_Size := 0;
    if (portal_en_RadioButton.Checked and portal_en_RadioButton.Enabled) or (portal_ru_en_RadioButton.Checked and portal_ru_en_RadioButton.Enabled) then iPortal_english_Size := i_portal_english_gcf else iPortal_english_Size := 0;

    iPortal_Size := i_portal_content_gcf + iportal_Dir_Size
  end;


  /// ядро ресурсов всех 4-х игр
  if One_Game_Selected then
  begin
    if not source_2007_binaries_2_gcf then i_source_2007_binaries_2_gcf := 135 else i_source_2007_binaries_2_gcf := 0; /// точно
    if not source_2007_shared_materials_gcf then i_source_2007_shared_materials_gcf := 985 else i_source_2007_shared_materials_gcf := 0; /// точно
    if not source_2007_shared_models_gcf then i_source_2007_shared_models_gcf := 148 else i_source_2007_shared_models_gcf := 0;  /// точно
    if not source_2007_shared_sounds_gcf then i_source_2007_shared_sounds_gcf := 2 else i_source_2007_shared_sounds_gcf := 0; /// точно
    if not source_materials_gcf then i_source_materials_gcf := 1047 else i_source_materials_gcf := 0;  /// точно
    if not source_models_gcf then i_source_models_gcf := 449 else i_source_models_gcf := 0;  /// точно
    if not source_sounds_gcf then i_source_sounds_gcf := 975 else i_source_sounds_gcf := 0;  /// точно

    iCore_All := i_source_2007_binaries_2_gcf + i_source_2007_shared_materials_gcf + i_source_2007_shared_models_gcf + i_source_2007_shared_sounds_gcf + i_source_materials_gcf + i_source_models_gcf + i_source_sounds_gcf;
  end;



  if ((hl2_ep1_CheckBox.Checked and hl2_ep1_CheckBox.Enabled) or (hl2_ep2_CheckBox.Checked and hl2_ep2_CheckBox.Enabled)) then /// ядро ресурсов эпизодов и только их
  begin
    if not episodic_2007_shared_gcf then i_episodic_2007_shared_gcf := 273 else i_episodic_2007_shared_gcf := 0;
    if not episode_1_shared_gcf then i_episode_1_shared_gcf := 1229 else i_episode_1_shared_gcf := 0;

    iCoreEpisodes := i_episode_1_shared_gcf + i_episodic_2007_shared_gcf
  end;



  if One_Episode_Selected then  /// файл hl2_russian.gcf относится ко всем 3-м играм
  begin
    if not half_life_2_russian_gcf then i_half_life_2_russian_gcf := 784 else i_half_life_2_russian_gcf := 0;

    ihl2_russian_Size := i_half_life_2_russian_gcf;
  end;



  if (hl2_ep1_ru_RadioButton.Checked and hl2_ep1_ru_RadioButton.Enabled) or (hl2_ep2_ru_RadioButton.Checked and hl2_ep2_ru_RadioButton.Enabled) then /// half-life 2 episode one russian.gcf относится к 2-м эпизодам
  begin
    if not half_life_2_episode_one_russian_gcf then i_half_life_2_episode_one_russian_gcf := 539 else i_half_life_2_episode_one_russian_gcf := 0; /// точно

    ihl2_ep1_russian_Size := i_half_life_2_episode_one_russian_gcf
  end;



  NeedSize := iCore_All + iCoreEpisodes + ihl2_Size + ihl2_russian_Size + ihl2_russian_buka_Size + ihl2_ep1_Size + ihl2_ep1_russian_Size + ihl2_ep2_Size + ihl2_ep2_russian_Size + ihl2_ep2_english_Size + iPortal_russian_Size + iPortal_english_Size + iPortal_Size;


  if FreeMB < NeedSize then
  begin
    if WizardForm.CurPageID = wpSelectDir then WizardForm.NextButton.Enabled := False;

    NeedSizeLabel.Font.Color := $48c1ca;

    No_Space := True;
  end
  else
  begin
    if WizardForm.CurPageID = wpSelectDir then WizardForm.NextButton.Enabled := not IsStringCyrillic(WizardForm.DirEdit.Text);

    NeedSizeLabel.Font.Color := clWindowText;

    No_Space := False;
  end;

  NeedSizeLabel.Caption := ExpandConstant('{cm:Needed_Size} ') + FloatToStr(round(NeedSize/1024*100)/100) + ExpandConstant(' {cm:Gb}'); // + IntToStr(NeedSize) + ' Mb';
end;
/// конец



где Param(чекбокс отмечен через параметр запуска) и Game_From_INI_Selected(чекбокс отмечен из ключа рядом лежащего ини) это булев переменные
если одна из них True, то длинный рассчёт
...
half_life_2_russian_gcf := FileExists(WizardForm.DirEdit.Text + '\half-life 2_russian.gcf');
...
обрабатывается в InitializeWizard и в WizardFormDirEditOnChange
укоротил и упростил эту процедуру как мог

если есть ещё способы по ускорению скорости её работы, то скажите пожалуйста

Leka_651 08-08-2012 13:58 1966816

Johny777,
твой скрипт работает замечательно. детает то что мне нужно :)
но при попытке соединить его с моим вылетает ошибка:

Compiling [code] section
Error on line 2084 in d:\setup\sbis-setup\setup-eo.iss: Column 4:
Duplicate identifier 'TSHFileOpStruct'
Compile aborted.

на строке
Код:

 
type  // это сторока 2084
  TSHFileOpStruct=record
    Wnd: HWND;
    wFunc: UINT;
    pFrom: PChar;
    pTo: PChar;
    fFlags: Word;
    fAnyOperationsAborted: BOOL;
    hNameMappings: HWND;
    lpszProgressTitle: PChar;
  end;

вот где дублируется, не понимаю. поиск по файлам не находит повторений(

вот все мои скрипты и файлы для сборки
http://wtrns.fr/fs097Jn71d0RQUwgkj

Johny777 08-08-2012 15:53 1966872

Leka_651,
скачай отсюда http://forum.oszone.net/showthread.p...99#post1201499
или отсюда (проще установка) http://innoultra.ru/?page_id=18
расширенную версию Inno
установи расширенный компилятор ANSI
попробуй скомпилировать

ели будет ошибка закомментируй так (возможно инно уже знает этот тип, те он уже встроен заводом):
читать дальше »
Код:

{type  // это сторока 2084
  TSHFileOpStruct=record
    Wnd: HWND;
    wFunc: UINT;
    pFrom: PChar;
    pTo: PChar;
    fFlags: Word;
    fAnyOperationsAborted: BOOL;
    hNameMappings: HWND;
    lpszProgressTitle: PChar;
  end;}


ещё раз попробуй

Цитата:

Цитата Leka_651
где дублируется, не понимаю »

может в модуле, если ты ими пользуешься

Цитата:

Цитата Leka_651
твой скрипт работает замечательно. детает то что мне нужно »

наконец-то я хоть что-то путное собрал. Радует
_______________________--
по ссылке на твой архив пишет, что файл устарел и больше не доступен

Leka_651 08-08-2012 16:03 1966876

Johny777,
спасибо. пойду попробую :)

Johny777,
ошибка осталась :(
до этого у меня стояла версия 5.5.0 и твой скрипт работал. ошибка похоже у меня

Цитата:

Цитата Johny777
может в модуле, если ты ими пользуешься »

я не знаю что такое модули в inno setup :(


вот новая ссылка. теперь должно качаться
http://download.sbis.ru/files/setup.zip

Leka_651 08-08-2012 16:22 1966885

упс... как-то у меня два сообщения в одно слились :dont-know

Johny777 08-08-2012 17:20 1966917

Leka_651, ну и тяжёлый же у тебя скрипт. Запутался
Цитата:

Цитата Leka_651
я не знаю что такое модули »

например этот
#include "SHFileOperation.iss"
которого рядом нет
но если ты его подключаешь, то и будет вылетать с ошибкой, тк эта же функция используется и для этой версии копирования (бэкапа)
function SHFileOperation(const lpFileOp: TSHFileOpStruct):integer; external 'SHFileOperation@shell32.dll stdcall';

попробую другую функцию копирования использовать.

Leka_651 08-08-2012 17:34 1966920

Johny777,
это не все скрипты. я лишнее убрала

я могу обойтись без этого модуля
#include "SHFileOperation.iss"

я его закомментировала и сборка пошла)) пока не заморачивайся с другой функцией. сейчас посмотрю как будет работать)

Leka_651 08-08-2012 17:49 1966927

Johny777,
не хочет работать.

буду сейчас разбираться где косяк.

Johny777 08-08-2012 17:56 1966929

Leka_651,
не знаю как ты, но лично я модулями вообще не пользуюсь, тк путаюсь сильно
у меня например основной скрипт инсталла халфы 2 длиной в около 9000 строк(никаких модулей) и ошибки дублирующихся функций и другие устранял очень быстро
также код становится очень наглядным, хоть и длинный
функции и процедуры сверху
использование ниже ( Я знаю в дельфи можно объявить процедуру(её имя) в шапке и потом писать где угодно, а здесь, в Инно, так нельзя)
переменные в самом верху и тд
попробуй записать всё в одном скрипте в порядке чтения компилятором (сверху вниз)! :)
добавь комментарии для себя,

Leka_651 08-08-2012 18:05 1966935

Johny777,
я бы рада, но у меня 21 файл, по которым собираются 44 сетапа, и пока большая часть не мое творение. а времени все привести в порядок нет - нужно ошибки править :(
буду мучаться дальше :) спасибо за помощь.

Johny777,
можешь рассказать чем отличаются inno ultra и простая inno?

Serega 08-08-2012 19:50 1966985

Цитата:

Цитата Johny777
только вот вылетала »

Другими словами Insert('\', dir, Length(dir)+1); это тоже самое, что dir := dir + '\';. Написал так, т.к. процедура Insert работает быстрее, а почему вылетела такая ошибка, не знаю...
Цитата:

Цитата Johny777
исправил (выделил зелёным): »

всё правильно сделали
Цитата:

Цитата Johny777
форма появляется при таком вот условии »

Если при проверке количества файлов вам не нужно знать их всё количество, то можно подкорректировать функцию именно по вашим условиям:
читать дальше »

Код:

function GetFileCount(dir: string): Integer;
var
  FindFiles: TFindRec;
begin
  Result := 0;
  if FindFirst(dir + '\*_update.exe', FindFiles) then
    begin
      repeat
        if FindFiles.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
          case FindFiles.Name of
            {#FNames}: Result := Result + 1;
          end;
      until not FindNext(FindFiles) or (Result > 1);
      FindClose(FindFiles);
    end;
end;


Цитата:

Цитата Johny777
если есть ещё способы по ускорению скорости её работы »

Для увеличения скорости по мере возможности старайтесь меньше обращаться к контролам формы, т.е. загоняйте эти значения в переменные и уже потом работаете с этими переменными.
читать дальше »

Код:

//////////////////////////////////////////////////////////
  i_portal_russian_gcf: Integer;                      // 25
  dir: string;
begin
  if not Size_Form_Exist then
  begin
    if not Param and not Game_From_INI_Selected then
    begin
      dir := WizardForm.DirEdit.Text;
      half_life_2_russian_gcf := FileExists(dir + '\half-life 2_russian.gcf');
      half_life_2_buka_russian_gcf := FileExists(dir + '\half-life 2 buka russian.gcf');
      half_life_2_2007_base_content_gcf := FileExists(dir + '\half-life 2 2007 base content.gcf');
///////////////////////////////////////////////////////


Для уменьшения количества переменных я бы использовал массивы, а при однообразных вызовах работал через for... to...do. Так же по возможности нужно стараться разгружать InitializeWizard запуская большие расчёты в отдельном потоке.

Batistas 08-08-2012 20:24 1967001

Как и обещал, поставил виртуальную машину, попробовал скопилировать - экзэшник скомпилирован, запускается, но выдает ошибку в самом конце установки - http://s1.ipicture.ru/uploads/20120808/bNfOvdds.png . Я так посмотрел на скрипт, попробовал добавить два слэша в одну из строк. Результат - экзэшник не запускается и выдает ошибку, что и на 7 - http://s1.ipicture.ru/uploads/20120808/c1CTB8sV.png . Сдается мне, что ошибка в самом скрипте...
Вот скрин от знакомого - та же самая ерундень - http://img-life.ru/upload_image/0be8...48a6b50795.JPG (компиляция завершена, идет окончание установки)

El Sanchez 09-08-2012 09:30 1967196

Batistas, вы не читаете, что вам пишут:
Цитата:

Цитата El Sanchez
Оказалось, что юникоду не понравились метод createElement при создании нод и метод setAttribute при создании аттрибутов. Процедуру CreateDCPlusPlus в своем предыдущем посте исправил. »

Либо меняете версию компилятора на ANSI и остаетесь на старой версии скрипта, либо компилятор какой хотите, но используйте исправленную версию скрипта (поменялась только процедура CreateDCPlusPlus).

Batistas 09-08-2012 10:03 1967213

El Sanchez, теперь я прочитал, видимо проглядел. Поставил ansi-версию, ошибки все равно вылетают. http://s1.ipicture.ru/uploads/20120809/WTFVVU16.png , http://s1.ipicture.ru/uploads/20120809/zUJ2xwg3.png

Spell1999 09-08-2012 10:38 1967241

люди помогите плиз как и чем можно сжать файлы до максимума? я жал и раром фриарком 7 зип но сёравно очень слабо жмёт.

alert30 09-08-2012 10:48 1967243

Spell1999, NanoZip.

Batistas 09-08-2012 10:54 1967245

Spell1999, все от конкретного файла зависит. http://s1.ipicture.ru/uploads/20120809/jvZcF9SW.png , http://s1.ipicture.ru/uploads/20120809/jHQMmJ9z.png

Spell1999 09-08-2012 10:54 1967246

и чё это за чуш

Batistas, я также делал но непомогает

я немогу понтять чем жмут. например maxpayne 3 с 25 гигов сжали до 12 это как?

alert30 09-08-2012 11:00 1967252

Цитата:

Цитата Spell1999
и чё это за чуш »

Не чушь, этот архиватор сильнее жмет.
Цитата:

Цитата Spell1999
я немогу понтять чем жмут. например maxpayne 3 с 25 гигов сжали до 12 это как? »

Потому что там было много видео и музыки в папке этой игры.

Spell1999 09-08-2012 11:03 1967254

несопрю она висит вся на музыке и видео. но сёравно фриарк нежмёт так.

Batistas 09-08-2012 11:03 1967255

Spell1999, скорее всего удалили ненужное. Вот еще для сжатия - http://www.youtube.com/watch?v=CQcJJ_FyUnE

Spell1999 09-08-2012 11:07 1967260

Batistas, я тоже так думал сначала. но потом скачал установил она тянет почти на 25 гигов как лицензия, там ничё не вырезано. ща гляну видос попробую.

El Sanchez 09-08-2012 11:31 1967271

Цитата:

Цитата Batistas
Поставил ansi-версию, ошибки все равно вылетают. »

Batistas, попробуйте вместо объекта Microsoft.XMLDOM подставить одно из значений: MSXML2.DOMDocument, MSXML2.DOMDocument.3.0, MSXML2.DOMDocument.4.0, MSXML2.DOMDocument.6.0.
Если будет ругань, то оформите ReadDCPlusPlus вот так:
читать дальше »

Код:

function ReadDCPlusPlus(Filename, Node, Default: String): String;
var
    objXMLDoc: Variant;
begin
    Result := Default;
    if not FileExists(Filename) then Exit;
    try
        objXMLDoc := CreateOleObject('Microsoft.XMLDOM'); //или другой объект
        objXMLDoc.load(Filename);
        objXMLDoc.async := False;
        if objXMLDoc.parseError.errorCode <> 0 then Exit;
        Result := objXMLDoc.selectSingleNode(Node).text;
    except
        ShowExceptionMessage;
        Exit;
    end;
end;


Johny777 09-08-2012 11:44 1967280

Spell1999,
по вопросам сжатия читай тут http://forum.ru-board.com/topic.cgi?...=30239&start=0
тут http://forum.ru-board.com/topic.cgi?forum=5&topic=32025
большинство (даже почти все) из так называемых "репаков" сжимаются на основе средств сжатия и преобразования
файлов поддерживаемых библиотекой IsDone (распаковка)
качай его отсюда http://176.9.1.113:52080/showthread.php?t=34&page=49
читай к нему справку и пользуйся, если хочешь (справка должна идти в комплекте, то бишь в архиве)
эта тема предназначена для написания/помощи в написании кода на основе языка Object Pascal
используемом в инно и всего того что стоит в справке по инно - стандартные средства

Ivan_009 09-08-2012 14:10 1967374

Покажите пример наложение текстур на кнопки с двум состояниям искал везде 4 или 3 состояния... :sorry:

Spell1999 09-08-2012 15:15 1967427

Johny777, спс до меня допёрла кажись)))

Johny777 09-08-2012 18:40 1967558

Ivan_009,
текстурирование кнопок
2 состояния - обычное и при нажатии
код:
читать дальше »
Код:


#define ButtonWidth "80" ; ширина кнопки
#define ButtonHeight "25" ; высота

#define ButtonFontColor "clWhite" ;цвет шрифта кнопок

#define TextureWidth "160" ;ширина картинки-текстуры
#define TextureHeight "25" ;высота


[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=.

;Изображение размером 160х25 (можете поменять в купе с настройками в препроцессоре, в шапке)
;левая половина - обычное состояние, правая - при нажатии
BitmapResource=button:button.bmp


[code]
var
  ButtonPanel: array [0..4] of TPanel;
  ButtonImage: array [0..4] of TBitmapImage;
  ButtonLabel: array [0..4] of TLabel;

procedure ButtonLabelClick(Sender: TObject);
var
  Button: TButton;
begin
  with WizardForm do
  begin
    case TLabel(Sender).Tag of
      0: Button := BackButton;
      1: Button := NextButton;
      2: Button := CancelButton;
      3: Button := DirBrowseButton;
      4: Button := GroupBrowseButton;
    else exit
    end;
  end;
  Button.OnClick(Button);
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ButtonImage[TLabel(Sender).Tag].Left:= -ScaleX({#ButtonWidth});
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ButtonImage[TLabel(Sender).Tag].Left := ScaleX(0);
end;

procedure LoadButtonImage(AButton: TButton; AButtonIndex: integer);
var
  Image: TBitmapImage;
  Panel: TPanel;
  Labl: TLabel;
begin
  Panel:=TPanel.Create(WizardForm)
  with Panel do
  begin
    SetBounds(AButton.Left,AButton.Top,AButton.Width,AButton.Height);
    Tag := AButtonIndex;
    Parent := AButton.Parent;
  end;

  ButtonPanel[AButtonIndex] := Panel;

  Image:=TBitmapImage.Create(WizardForm)
  with Image do
  begin
    Width := ScaleX({#TextureWidth});
    Height := ScaleY({#TextureHeight});
    Enabled := False;
    Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON');
    Parent := Panel;
  end;

  ButtonImage[AButtonIndex]:=Image;

  with TLabel.Create(WizardForm) do
  begin
    Tag := AButtonIndex;
    Parent := Panel;
    Width := Panel.Width;
    Height := Panel.Height;
    Transparent := True;
    OnClick := @ButtonLabelClick;
    OnDblClick := @ButtonLabelClick;
    OnMouseDown := @ButtonLabelMouseDown;
    OnMouseUp := @ButtonLabelMouseUp;
  end;

  Labl:=TLabel.Create(WizardForm)
  with Labl do
  begin
    Autosize := True;
    Alignment := taCenter;
    Tag := AButtonIndex;
    Transparent := True;           
    Font.Color := {#ButtonFontColor};
    Caption := AButton.Caption;
    OnClick := @ButtonLabelClick;
    OnMouseDown := @ButtonLabelMouseDown;
    OnMouseUp := @ButtonLabelMouseUp;
    OnDblClick := @ButtonLabelClick;
    Parent := Panel;
  end;
 
  ButtonLabel[AButtonIndex]:= Labl;
end;

procedure UpdateButton(AButton: TButton;AButtonIndex: integer);
begin
  ButtonPanel[AButtonIndex].Visible := AButton.Visible;
  with ButtonLabel[AButtonIndex] do
  begin
    Caption := AButton.Caption;
    Left := ButtonPanel[AButtonIndex].Width div 2 - ButtonLabel[AButtonIndex].Width div 2;
    Top := ButtonPanel[AButtonIndex].Height div 2 - ButtonLabel[AButtonIndex].Height div 2;
  end;
end;


procedure InitializeWizard();
begin
  with WizardForm do
  begin
    BackButton.Width:={#ButtonWidth};
    BackButton.Height:={#ButtonHeight};
    NextButton.Width:={#ButtonWidth};
    NextButton.Height:={#ButtonHeight};
    CancelButton.Width:={#ButtonWidth};
    CancelButton.Height:={#ButtonHeight};
    DirBrowseButton.Width:={#ButtonWidth};
    DirBrowseButton.Height:={#ButtonHeight};
    GroupBrowseButton.Width:={#ButtonWidth};
    GroupBrowseButton.Height:={#ButtonHeight};
   
    LoadButtonImage(BackButton,0);
    LoadButtonImage(NextButton,1);
    LoadButtonImage(CancelButton,2);
    LoadButtonImage(DirBrowseButton,3);
    LoadButtonImage(GroupBrowseButton,4);
  end;
end;

procedure CurPageChanged(CurPageID: Integer); 
begin
  UpdateButton(WizardForm.BackButton,0);
  UpdateButton(WizardForm.NextButton,1);
  UpdateButton(WizardForm.CancelButton,2);
  UpdateButton(WizardForm.DirBrowseButton,3);
  UpdateButton(WizardForm.GroupBrowseButton,4);
end;



текстура (положить рядом со скриптом) :

Ivan_009 09-08-2012 18:54 1967566

Johny777, а возможно ли в свою форму отмены текстурировать эти кнопки.... :unsure:
или использовать вместе с деинсталлятором.
и как сделать чтобы при нажатии на чекбокс не создавать ярлык в меню пуск кнопка становилась неактивной......Заранее спасибо за любую помощь.........

Batistas 09-08-2012 21:07 1967637

El Sanchez, спасибо, скрипт завелся :) Я его немного подрихтовал: добавил прописывание абсолютного пути до звуков и русификации; Прописал добавление описания, бан мессэйджа, аплоад спид. Добавил древо папок и файлов, прогресс бар с отображением процентов установки, чекбокс добавления ярлыка на панель задач в Win 7. Все ок. Но вот решил добавить выбор директории для временных файлов. И тут начали ошибки вылетать...Вот код:
читать дальше »

//ANSI Version
#define MyAppName "Synergetic & MaxiRu DC-P2P Pack"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "-=Batista=-"
#define MyAppURL "http://synergetic-hub.org/"
#define MyAppExeName "ApexDC-s16_4.exe"
#define StartupIcon "Запускать при старте Windows"

[Setup]
AppId={{E20E5BAA-70B0-4EE4-8D27-B1E312B1C083}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=Output
OutputBaseFilename=Synergetic & MaxiRu DC-P2P Pack 1.0.0
SetupIconFile=Icon.ico
Compression=lzma2
SolidCompression=yes
//ArchitecturesInstallIn64BitMode=x64
WizardImageFile=WizardImage.bmp
WizardSmallImageFile=WizardSmallImage.bmp

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

[CustomMessages]
russian.NickNamePageCaption=Информация о пользователе
russian.NickNamePageDescription=Какой ник у Вас в DC++?
russian.NickNamePageSubcaption=Укажите ник и нажмите "Далее"%n%nРекомендуемые символы в нике:%n0123456789%nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%n()+=[]^_{{})"%nАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя
russian.NickNamePageEditName=Имя пользователя в DC++:
russian.DownloadDirPageCaption=Выбор каталога для загрузки
russian.DownloadDirPageDescription=Где будут храниться загружаемые файлы?
russian.DownloadDirPageSubcaption=Укажите каталог для скачки (при старте он будет автоматически "расшарен")
russian.ShareDirPageCaption=Выбор каталога для общего доступа
russian.ShareDirPageDescription=Где будут храниться файлы для общего доступа?
russian.ShareDirPageSubcaption=Укажите каталог для файлов общего доступа
russian.TempDownloadDirCaption=Выбор каталога для временных файлов
russian.TempDownloadDirPageDescription=Где будут храниться временные файлы?
russian.TempDownloadDirPageSubcaption=Укажите каталог для временных файлов

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1
Name: quicklaunchicon7; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; MinVersion: 0,6.1
Name: startupicon; Description: {#StartupIcon}; GroupDescription: {cm:AdditionalIcons}

[Files]
Source: ApexDC-s16_4.exe; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: Progress()
Source: AVIPreview.exe; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: Progress()
Source: PinToTasckbar.vbs; DestDir: {tmp}; Flags: deleteafterinstall; AfterInstall: Progress()
Source: Synergetic DC++ Community.url; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: Progress()
Source: Новые возможности клиента ApexDC++.txt; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: Progress()
Source: EmoPacks\*; DestDir: {app}\EmoPacks\; AfterInstall: Progress();
Source: EmoPacks\Images\*;DestDir: {app}\EmoPacks\Images\;AfterInstall: Progress();
Source: EmoPacks\RadoX-Pack\*;DestDir: {app}\EmoPacks\RadoX-Pack\; AfterInstall: Progress();
Source: EmoPacks\Skype\*;DestDir: {app}\EmoPacks\Skype\; AfterInstall: Progress();
Source: EmoPacks\WAJIM-MegaEmoPack\*;DestDir: {app}\EmoPacks\WAJIM-MegaEmoPack\; AfterInstall: Progress();
Source: Settings\*; DestDir: {app}\Settings\; AfterInstall: Progress();
Source: Sounds\*; DestDir: {app}\Sounds\; AfterInstall: Progress();
Source: Themes\*; DestDir: {app}\Themes\; AfterInstall: Progress();
Source: Toolbars\*; DestDir: {app}\Toolbars; AfterInstall: Progress();

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
Name: {userstartup}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: startupicon

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent
Filename: {#MyAppURL}; Verb: open; Description: Посетить сайт проекта Synergetic & MaxiRu; Flags: postinstall shellexec skipifsilent
Filename: {tmp}\PinToTasckbar.vbs; Parameters: """{app}\ApexDC-s16_4.exe"""; Flags: shellexec; Tasks: quicklaunchicon7

[code]
var
NickNamePage: TInputQueryWizardPage;
DownloadDirPage, ShareDirPage: TInputDirWizardPage;
// TempDownloadDirPage: TInputDirWizardPage;
AboutInfoButton: TButton;
URLlink: TLabel;

procedure CreateDCPlusPlus(Filename: String);
var
objXMLDoc: Variant;
begin
try
objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
except
ShowExceptionMessage;
Exit;
end;
objXMLDoc.async := False;
objXMLDoc.AppendChild(objXMLDoc.createProcessingInstruction('xml', 'version="1.0" encoding="utf-8" standalone="yes"'));
objXMLDoc.AppendChild(objXMLDoc.createNode(1, 'DCPlusPlus', ''));

//settings node
objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createElement('Settings'));

//nick node
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createElement('Nick'));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/Nick').setAttribute('type', 'string');
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/Nick').text := NickNamePage.Values[0];

//downdir node
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createElement('DownloadDirectory'));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/DownloadDirectory').setAttribute('type', 'string');
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/DownloadDirectory').text := DownloadDirPage.Values[0];

//russian xml
if FileExists(ExpandConstant('{app}\Settings\Russian.xml')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'LanguageFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/LanguageFile').text :=(ExpandConstant('{app}\Settings\Russian.xml'));
end;

if FileExists(ExpandConstant('{app}\Sounds\PrivateMessage.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'BeepFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/BeepFile').text :=(ExpandConstant('{app}\Sounds\PrivateMessage.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\DownloadBegins.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'BeginFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/BeginFile').text :=(ExpandConstant('{app}\Sounds\DownloadBegins.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\DownloadFinished.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'FinishedFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/FinishedFile').text :=(ExpandConstant('{app}\Sounds\DownloadFinished.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\AltSourceAdded.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SourceFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SourceFile').text :=(ExpandConstant('{app}\Sounds\AltSourceAdded.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\UploadFinished.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'UploadFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/UploadFile').text :=(ExpandConstant('{app}\Sounds\UploadFinished.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\FakerFound.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'FakerFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/FakerFile').text :=(ExpandConstant('{app}\Sounds\FakerFound.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\MyNickInMainChat.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'ChatNameFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/ChatNameFile').text :=(ExpandConstant('{app}\Sounds\MyNickInMainChat.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\FileCorrupted.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundTTH', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundTTH').text :=(ExpandConstant('{app}\Sounds\FileCorrupted.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\UnhandledException.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundException', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundException').text :=(ExpandConstant('{app}\Sounds\UnhandledException.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\HubConnected.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundHubConnected', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundHubConnected').text :=(ExpandConstant('{app}\Sounds\HubConnected.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\HubDisconnected.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundHubDisconnected', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundHubDisconnected').text :=(ExpandConstant('{app}\Sounds\HubDisconnected.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\FavUser.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundFavUserOnline', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundFavUserOnline').text :=(ExpandConstant('{app}\Sounds\FavUser.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\FavUserDisconnected.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundFavUserOffline', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundFavUserOffline').text :=(ExpandConstant('{app}\Sounds\FavUserDisconnected.wav'));
end;

if FileExists(ExpandConstant('{app}\EmoPacks\WAJIM-MegaEmoPack v1.2c FiNAL.xml')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'EmoticonsFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/EmoticonsFile').text :='WAJIM-MegaEmoPack v1.2c FiNAL';
end;

//share node
objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createElement('Share'));
objXMLDoc.selectSingleNode('//DCPlusPlus/Share').AppendChild(objXMLDoc.createElement('Directory'));
objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').setAttribute('Virtual', ExtractFileName(RemoveBackSlash(ShareDirPage.Values[0])));
objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').text := ShareDirPage.Values[0];

//tempdir node
// objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createElement('TempDownloadDir'));
// objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/TempDownloadDir').setAttribute('type', 'string');
// objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/TempDownloadDir').text := TempDownloadDirPage.Values[0];

//prevapps node
objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createElement('PreviewApps'));
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps').AppendChild(objXMLDoc.createElement('Application'));
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Name', 'AVI Preview');
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Application', ExpandConstant('{app}\AVIPreview.exe'));
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Arguments', '%[file]');
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Extension', 'avi;divx;mpg;mpeg;vob');

//Description
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'Description', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/Description').text :='[Synergetic & MaxiRu DC-P2P Pack 1.0.0]';

//BanMessage
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'BanMessage', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/BanMessage').text :='Вы забанены. Расшарьте больше файлов или откройте больше слотов!';

//UploadSpeed
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'UploadSpeed', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/UploadSpeed').text :='100';

objXMLDoc.save(Filename);
end;

function ReadDCPlusPlus(Filename, Node, Default: String): String;
var
objXMLDoc: Variant;
begin
Result := Default;
if not FileExists(Filename) then Exit;
try
objXMLDoc := CreateOleObject('Microsoft.XMLDOM'); //или другой объект
objXMLDoc.load(Filename);
objXMLDoc.async := False;
if objXMLDoc.parseError.errorCode <> 0 then Exit;
Result := objXMLDoc.selectSingleNode(Node).text;
except
ShowExceptionMessage;
Exit;
end;
end;

procedure CreateNickNamePage;
begin
NickNamePage := CreateInputQueryPage(wpSelectTasks, ExpandConstant('{cm:NickNamePageCaption}'), ExpandConstant('{cm:NickNamePageDescription}'), ExpandConstant('{cm:NickNamePageSubcaption}'));
NickNamePage.Add(ExpandConstant('{cm:NickNamePageEditName}'), False);
NickNamePage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Settings/Nick', '');
end;

procedure CreateDownloadDirPage;
begin
DownloadDirPage := CreateInputDirPage(NickNamePage.ID, ExpandConstant('{cm:DownloadDirPageCaption}'), ExpandConstant('{cm:DownloadDirPageDescription}'), ExpandConstant('{cm:DownloadDirPageSubcaption}'), False, 'Новая папка');
DownloadDirPage.Add('');
DownloadDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Settings/DownloadDirectory', WizardDirValue + '\Downloads-P2P');
end;

procedure CreateShareDirPage;
begin
ShareDirPage := CreateInputDirPage(DownloadDirPage.ID, ExpandConstant('{cm:ShareDirPageCaption}'), ExpandConstant('{cm:ShareDirPageDescription}'), ExpandConstant('{cm:ShareDirPageSubcaption}'), False, 'Новая папка');
ShareDirPage.Add('');
ShareDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Share/Directory', '');
end;

//procedure CreateTempDownloadDirPage;
//begin
// TempDownloadDirPage := CreateInputDirPage(ShareDirPage.ID, ExpandConstant('{cm:TempDownloadDirCaption}'), ExpandConstant('{cm:TempDownloadDirPageDescription}'), ExpandConstant('{cm:TempDownloadDirPageSubcaption}'), False, 'Новая папка');
// TempDownloadDirPage.Add('');
// TempDownloadDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Settings/TempDownloadDir', WizardDirValue + '\Temp');
//end;

procedure ControlOnClick(Sender: TObject);
var
ResultCode: Integer;
begin
if Sender is TButton then MsgBox('© -=Batista=-, 2012', mbInformation, MB_OK);
if Sender is TLabel then ShellExec('open', '{#MyAppURL}', '', '', SW_SHOW, ewNoWait, ResultCode);
end;

procedure CreateAboutInfoButton;
begin
AboutInfoButton := TButton.Create(WizardForm);
with AboutInfoButton do begin
Parent := WizardForm;
SetBounds(WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width, WizardForm.CancelButton.Top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
Caption := 'Автор...';
OnClick := @ControlOnClick;
end;
end;

procedure CreateURLlink;
begin
URLlink := TLabel.Create(WizardForm);
with URLlink do begin
Parent := WizardForm;
Left := 2*AboutInfoButton.Left + AboutInfoButton.Width;
Top := AboutInfoButton.Top + AboutInfoButton.Height - Height;
Caption := '{#MyAppURL}';
Font.Color := clBlue;
Font.Style := [fsUnderline];
Cursor := crHand;
OnClick := @ControlOnClick;
end;
end;

//function SetWindowTheme(hwnd: HWND; pszSubAppName: pchar; pszSubIdList: pchar): Longint; external 'SetWindowTheme@uxtheme.dll stdcall delayload';

var
TDV: TFolderTreeView;
TFV: TStartMenuFolderTreeView;

procedure TDVOnChange(Sender: TObject);
begin
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'MyApp';
end;

procedure TFVOnChange(Sender: TObject);
begin
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'MyApp';
end;

var
ProgressLabel, SizeLabel: TLabel;

procedure Progress();
var
size: integer;

begin
with WizardForm.ProgressGauge do
ProgressLabel.Caption:= IntToStr((Position-Min)/((Max - Min)/100)) + '%';
FileSize(ExpandConstant(CurrentFileName), size);
SizeLabel.Caption:= IntToStr(size) + ' bytes';
end;

procedure InitializeWizard();
begin
CreateNickNamePage;
CreateDownloadDirPage;
// CreateTempDownloadDirPage;
CreateShareDirPage;
CreateAboutInfoButton;
CreateURLlink;

TDV:= TFolderTreeView.Create(WizardForm);
TDV.Top:= WizardForm.DirEdit.Top+28;
TDV.Width:= 417;
TDV.Height:= 100;
TDV.OnChange:= @TDVOnChange;
TDV.Parent:= WizardForm.SelectDirPage;

TFV:= TStartMenuFolderTreeView.Create(WizardForm);
TFV.Top:= WizardForm.GroupEdit.Top+28;
TFV.Width:= 417;
TFV.Height:= 100;
TFV.SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{us erstartup}'),ExpandConstant('{commonstartup}'));
TFV.OnChange:= @TFVOnChange;
TFV.Parent:= WizardForm.SelectProgramGroupPage;

ProgressLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top := Top + Height + ScaleY(8);
ProgressLabel.Left:= Left + Width/2 - ScaleX(8);
ProgressLabel.AutoSize := True;
ProgressLabel.Parent := WizardForm.InstallingPage;
end;

SizeLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
SizeLabel.Top := Top + Height + ScaleY(8);
SizeLabel.Left:= Left;
SizeLabel.AutoSize := True;
SizeLabel.Parent := WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssPostInstall: CreateDCPlusPlus(ExpandConstant('{app}\Settings\DCPlusPlus.xml'));
end;
end;

Мой неправильный код заслешован. Не подскажешь как правильно сделать? :)

Johny777 09-08-2012 21:28 1967658

Цитата:

Цитата Ivan_009
а возможно ли в свою форму отмены текстурировать эти кнопки.... »

не для меня
тем кнопкам не присоено событие в OnClick. Только ModalResult
и смысл текстурировать кнопку на форме деинсталятора (родной), если здесь нет состояния "неактивна"
проще уж тогда вообще скрыть, тк от неё толку ноль

Цитата:

Цитата Ivan_009
и как сделать чтобы при нажатии на чекбокс не создавать ярлык в меню пуск кнопка становилась неактивной. »

я ж тебе уже делал кастомный чекбокс "не создовать значки в меню Пуск" в этой теме
Забыл?

Ivan_009 10-08-2012 00:11 1967768

Johny777, мне надо чтобы при нажатии на чекбокс текстурированная кнопка становилась неактивной.....У меня же все наоборот....:rotate:
В твоем примере....

Johny777 10-08-2012 00:57 1967787

Ivan_009,
так состояния "заблокирована" нет
используй пример с 4-мя состояниями и в конце процедуры OnClick чекбокса припиши UpdateButtons
вот так (только что проверил)
кнопка обзор блокируется
Код:

procedure Твой_кастомный_чекбокс_OnClick(Sender: TObject);
begin


    WizardForm.GroupEdit.Enabled := not TCheckBox(Sender).Checked;
    WizardForm.GroupBrowseButton.Enabled := not TCheckBox(Sender).Checked;

    UpdateButtons();

end;

=========================================================================================

Batistas,
смотри
El Sanchez вынес создание страниц в процедуры, которые выполняются в InitializeWizard
процедуры выполняется между логическими скобками begin и end
те сверху вниз (от начала до конца) и никак иначе
а теперь смотри в каком порядке они - процедуры - у тебя перечислены:

CreateNickNamePage;
CreateDownloadDirPage; -- сначала эта
CreateTempDownloadDirPage; -- потом эта
CreateShareDirPage;
CreateAboutInfoButton;
CreateURLlink;

а теперь посмотри на функцию создания страницы в процедуре CreateTempDownloadDirPage
первой настройкой (выделил зелёным) идёт страница после которой должна создаться эта - TempDownloadDirPage
TempDownloadDirPage := CreateInputDirPage(ShareDirPage.ID, ...
те ты указывать в функции создания страницы создать страницу такую-то после ещё не созданной но которая будет создана следующей "по списку"
компилятор выполняет код сверху вниз, те ты понимаешь, что так нельзя и ошибка неизбежна?

также у тебя есть некоторые недочёты в коде
например в событии OnChange элемента TStartMenuFolderTreeView, те при изменении директории (взаимодействии с деревом папок меню "Пуск")
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'MyApp';
в конце дописывается "MyApp"
это явно не было твоей целью
тоже самое касается и TFolderTreeView

позволил себе всё вышеописанное исправить и записать грамотнее
результат:
читать дальше »
Код:



//ANSI Version
#define MyAppName "Synergetic & MaxiRu DC-P2P Pack"
#define MyAppVersion "1.0.0"
#define MyAppPublisher "-=Batista=-"
#define MyAppURL "http://synergetic-hub.org/"
#define MyAppExeName "ApexDC-s16_4.exe"
#define StartupIcon "Запускать при старте Windows"

[Setup]
AppId={{E20E5BAA-70B0-4EE4-8D27-B1E312B1C083}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=Output
OutputBaseFilename=Synergetic & MaxiRu DC-P2P Pack 1.0.0

Compression=lzma2
SolidCompression=yes
//ArchitecturesInstallIn64BitMode=x64

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

[CustomMessages]
russian.NickNamePageCaption=Информация о пользователе
russian.NickNamePageDescription=Какой ник у Вас в DC++?
russian.NickNamePageSubcaption=Укажите ник и нажмите "Далее"%n%nРекомендуемые символы в нике:%n0123456789%nabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%n()+=[]^_{{})"%nАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя
russian.NickNamePageEditName=Имя пользователя в DC++:
russian.DownloadDirPageCaption=Выбор каталога для загрузки
russian.DownloadDirPageDescription=Где будут храниться загружаемые файлы?
russian.DownloadDirPageSubcaption=Укажите каталог для скачки (при старте он будет автоматически "расшарен")
russian.ShareDirPageCaption=Выбор каталога для общего доступа
russian.ShareDirPageDescription=Где будут храниться файлы для общего доступа?
russian.ShareDirPageSubcaption=Укажите каталог для файлов общего доступа
russian.TempDownloadDirCaption=Выбор каталога для временных файлов
russian.TempDownloadDirPageDescription=Где будут храниться временные файлы?
russian.TempDownloadDirPageSubcaption=Укажите каталог для временных файлов

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1
Name: quicklaunchicon7; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; MinVersion: 0,6.1
Name: startupicon; Description: {#StartupIcon}; GroupDescription: {cm:AdditionalIcons}

[Files]
Source: ApexDC-s16_4.exe; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: Progress()
Source: AVIPreview.exe; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: Progress()
Source: PinToTasckbar.vbs; DestDir: {tmp}; Flags: deleteafterinstall; AfterInstall: Progress()
Source: Synergetic DC++ Community.url; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: Progress()
Source: Новые возможности клиента ApexDC++.txt; DestDir: "{app}"; Flags: ignoreversion; AfterInstall: Progress()
Source: EmoPacks\*; DestDir: {app}\EmoPacks\; AfterInstall: Progress();
Source: EmoPacks\Images\*;DestDir: {app}\EmoPacks\Images\;AfterInstall: Progress();
Source: EmoPacks\RadoX-Pack\*;DestDir: {app}\EmoPacks\RadoX-Pack\; AfterInstall: Progress();
Source: EmoPacks\Skype\*;DestDir: {app}\EmoPacks\Skype\; AfterInstall: Progress();
Source: EmoPacks\WAJIM-MegaEmoPack\*;DestDir: {app}\EmoPacks\WAJIM-MegaEmoPack\; AfterInstall: Progress();
Source: Settings\*; DestDir: {app}\Settings\; AfterInstall: Progress();
Source: Sounds\*; DestDir: {app}\Sounds\; AfterInstall: Progress();
Source: Themes\*; DestDir: {app}\Themes\; AfterInstall: Progress();
Source: Toolbars\*; DestDir: {app}\Toolbars; AfterInstall: Progress();

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
Name: {userstartup}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: startupicon

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent
Filename: {#MyAppURL}; Verb: open; Description: Посетить сайт проекта Synergetic & MaxiRu; Flags: postinstall shellexec skipifsilent
Filename: {tmp}\PinToTasckbar.vbs; Parameters: """{app}\ApexDC-s16_4.exe"""; Flags: shellexec; Tasks: quicklaunchicon7

[code]
var
NickNamePage: TInputQueryWizardPage;
DownloadDirPage, ShareDirPage, TempDownloadDirPage: TInputDirWizardPage;
// TempDownloadDirPage: TInputDirWizardPage;
AboutInfoButton: TButton;
URLlink: TLabel;

procedure CreateDCPlusPlus(Filename: String);
var
objXMLDoc: Variant;
begin
try
objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
except
ShowExceptionMessage;
Exit;
end;
objXMLDoc.async := False;
objXMLDoc.AppendChild(objXMLDoc.createProcessingInstruction('xml', 'version="1.0" encoding="utf-8" standalone="yes"'));
objXMLDoc.AppendChild(objXMLDoc.createNode(1, 'DCPlusPlus', ''));

//settings node
objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createElement('Settings'));

//nick node
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createElement('Nick'));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/Nick').setAttribute('type', 'string');
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/Nick').text := NickNamePage.Values[0];

//downdir node
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createElement('DownloadDirectory'));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/DownloadDirectory').setAttribute('type', 'string');
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/DownloadDirectory').text := DownloadDirPage.Values[0];

//russian xml
if FileExists(ExpandConstant('{app}\Settings\Russian.xml')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'LanguageFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/LanguageFile').text :=(ExpandConstant('{app}\Settings\Russian.xml'));
end;

if FileExists(ExpandConstant('{app}\Sounds\PrivateMessage.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'BeepFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/BeepFile').text :=(ExpandConstant('{app}\Sounds\PrivateMessage.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\DownloadBegins.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'BeginFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/BeginFile').text :=(ExpandConstant('{app}\Sounds\DownloadBegins.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\DownloadFinished.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'FinishedFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/FinishedFile').text :=(ExpandConstant('{app}\Sounds\DownloadFinished.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\AltSourceAdded.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SourceFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SourceFile').text :=(ExpandConstant('{app}\Sounds\AltSourceAdded.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\UploadFinished.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'UploadFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/UploadFile').text :=(ExpandConstant('{app}\Sounds\UploadFinished.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\FakerFound.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'FakerFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/FakerFile').text :=(ExpandConstant('{app}\Sounds\FakerFound.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\MyNickInMainChat.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'ChatNameFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/ChatNameFile').text :=(ExpandConstant('{app}\Sounds\MyNickInMainChat.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\FileCorrupted.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundTTH', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundTTH').text :=(ExpandConstant('{app}\Sounds\FileCorrupted.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\UnhandledException.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundException', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundException').text :=(ExpandConstant('{app}\Sounds\UnhandledException.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\HubConnected.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundHubConnected', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundHubConnected').text :=(ExpandConstant('{app}\Sounds\HubConnected.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\HubDisconnected.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundHubDisconnected', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundHubDisconnected').text :=(ExpandConstant('{app}\Sounds\HubDisconnected.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\FavUser.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundFavUserOnline', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundFavUserOnline').text :=(ExpandConstant('{app}\Sounds\FavUser.wav'));
end;

if FileExists(ExpandConstant('{app}\Sounds\FavUserDisconnected.wav')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'SoundFavUserOffline', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/SoundFavUserOffline').text :=(ExpandConstant('{app}\Sounds\FavUserDisconnected.wav'));
end;

if FileExists(ExpandConstant('{app}\EmoPacks\WAJIM-MegaEmoPack v1.2c FiNAL.xml')) then
begin
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'EmoticonsFile', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/EmoticonsFile').text :='WAJIM-MegaEmoPack v1.2c FiNAL';
end;

//share node
objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createElement('Share'));
objXMLDoc.selectSingleNode('//DCPlusPlus/Share').AppendChild(objXMLDoc.createElement('Directory'));
objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').setAttribute('Virtual', ExtractFileName(RemoveBackSlash(ShareDirPage.Values[0])));
objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').text := ShareDirPage.Values[0];

//tempdir node
// objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createElement('TempDownloadDir'));
// objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/TempDownloadDir').setAttribute('type', 'string');
// objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/TempDownloadDir').text := TempDownloadDirPage.Values[0];

//prevapps node
objXMLDoc.selectSingleNode('DCPlusPlus').AppendChild(objXMLDoc.createElement('PreviewApps'));
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps').AppendChild(objXMLDoc.createElement('Application'));
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Name', 'AVI Preview');
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Application', ExpandConstant('{app}\AVIPreview.exe'));
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Arguments', '%[file]');
objXMLDoc.selectSingleNode('//DCPlusPlus/PreviewApps/Application').setAttribute('Extension', 'avi;divx;mpg;mpeg;vob');

//Description
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'Description', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/Description').text :='[Synergetic & MaxiRu DC-P2P Pack 1.0.0]';

//BanMessage
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'BanMessage', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/BanMessage').text :='Вы забанены. Расшарьте больше файлов или откройте больше слотов!';

//UploadSpeed
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'UploadSpeed', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/UploadSpeed').text :='100';

objXMLDoc.save(Filename);
end;

function ReadDCPlusPlus(Filename, Node, Default: String): String;
var
objXMLDoc: Variant;
begin
Result := Default;
if not FileExists(Filename) then Exit;
try
objXMLDoc := CreateOleObject('Microsoft.XMLDOM'); //или другой объект
objXMLDoc.load(Filename);
objXMLDoc.async := False;
if objXMLDoc.parseError.errorCode <> 0 then Exit;
Result := objXMLDoc.selectSingleNode(Node).text;
except
ShowExceptionMessage;
Exit;
end;
end;

procedure CreateNickNamePage;
begin
NickNamePage := CreateInputQueryPage(wpSelectTasks, ExpandConstant('{cm:NickNamePageCaption}'), ExpandConstant('{cm:NickNamePageDescription}'), ExpandConstant('{cm:NickNamePageSubcaption}'));
NickNamePage.Add(ExpandConstant('{cm:NickNamePageEditName}'), False);
NickNamePage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Settings/Nick', '');
end;

procedure CreateDownloadDirPage;
begin
DownloadDirPage := CreateInputDirPage(NickNamePage.ID, ExpandConstant('{cm:DownloadDirPageCaption}'), ExpandConstant('{cm:DownloadDirPageDescription}'), ExpandConstant('{cm:DownloadDirPageSubcaption}'), False, 'Новая папка');
DownloadDirPage.Add('');
DownloadDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Settings/DownloadDirectory', WizardDirValue + '\Downloads-P2P');
end;

procedure CreateShareDirPage;
begin
ShareDirPage := CreateInputDirPage(DownloadDirPage.ID, ExpandConstant('{cm:ShareDirPageCaption}'), ExpandConstant('{cm:ShareDirPageDescription}'), ExpandConstant('{cm:ShareDirPageSubcaption}'), False, 'Новая папка');
ShareDirPage.Add('');
ShareDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Share/Directory', '');
end;

procedure CreateTempDownloadDirPage;
begin
 TempDownloadDirPage := CreateInputDirPage(ShareDirPage.ID, ExpandConstant('{cm:TempDownloadDirCaption}'), ExpandConstant('{cm:TempDownloadDirPageDescription}'), ExpandConstant('{cm:TempDownloadDirPageSubcaption}'), False, 'Новая папка');
 TempDownloadDirPage.Add('');
 TempDownloadDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\Settings\DCPlusPlus.xml', '//DCPlusPlus/Settings/TempDownloadDir', WizardDirValue + '\Temp');
end;                                       

procedure ControlOnClick(Sender: TObject);
var
ResultCode: Integer;
begin
if Sender is TButton then MsgBox('© -=Batista=-, 2012', mbInformation, MB_OK);
if Sender is TLabel then ShellExec('open', '{#MyAppURL}', '', '', SW_SHOW, ewNoWait, ResultCode);
end;

procedure CreateAboutInfoButton;
begin
AboutInfoButton := TButton.Create(WizardForm);
with AboutInfoButton do begin
Parent := WizardForm;
SetBounds(WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width, WizardForm.CancelButton.Top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
Caption := 'Автор...';
OnClick := @ControlOnClick;
end;
end;

procedure CreateURLlink;
begin
URLlink := TLabel.Create(WizardForm);
with URLlink do begin
Parent := WizardForm;
Left := 2*AboutInfoButton.Left + AboutInfoButton.Width;
Top := AboutInfoButton.Top + AboutInfoButton.Height - Height;
Caption := '{#MyAppURL}';
Font.Color := clBlue;
Font.Style := [fsUnderline];
Cursor := crHand;
OnClick := @ControlOnClick;
end;
end;

//function SetWindowTheme(hwnd: HWND; pszSubAppName: pchar; pszSubIdList: pchar): Longint; external 'SetWindowTheme@uxtheme.dll stdcall delayload';


var
  ProgressLabel, SizeLabel: TLabel;
  TDV: TFolderTreeView;
  TFV: TStartMenuFolderTreeView;

procedure TFV_and_TDV_OnChange_and_else(Sender: TObject);
begin
  if Sender is TStartMenuFolderTreeView then WizardForm.GroupEdit.Text := AddBackslash(TStartMenuFolderTreeView(Sender).Directory) + '{#SetupSetting("DefaultGroupName")}';
  if Sender is TFolderTreeView then WizardForm.DirEdit.Text:= AddBackslash(TFolderTreeView(Sender).Directory) + '{#MyAppName}';
 
  if Sender is TCheckBox then
  begin
    TFV.Enabled := not TCheckBox(Sender).Checked;
    WizardForm.GroupEdit.Enabled := not TCheckBox(Sender).Checked;
    WizardForm.GroupBrowseButton.Enabled := not TCheckBox(Sender).Checked;
  end;
end;




procedure Progress();
var
  size: integer;
begin
  with WizardForm.ProgressGauge do
  ProgressLabel.Caption:= IntToStr((Position-Min)/((Max - Min)/100)) + '%';
  FileSize(ExpandConstant(CurrentFileName), size);
  SizeLabel.Caption:= IntToStr(size) + ' бт';
end;

procedure InitializeWizard();
begin
  CreateNickNamePage;
  CreateDownloadDirPage;
  CreateShareDirPage;
  CreateTempDownloadDirPage;
  CreateAboutInfoButton;
  CreateURLlink;
 
  WizardForm.NoIconsCheck.OnClick := @TFV_and_TDV_OnChange_and_else;

  TDV := TFolderTreeView.Create(WizardForm);
  with TDV do
  begin
    Top:= WizardForm.DirEdit.Top + ScaleY(28);
    Width:=  ScaleX(417);
    Height:= ScaleY(100);
    OnChange := @TFV_and_TDV_OnChange_and_else;
    Parent := WizardForm.SelectDirPage;
  end;

  TFV:= TStartMenuFolderTreeView.Create(WizardForm);
  with TFV do
  begin
    Top:= WizardForm.GroupEdit.Top + ScaleY(28);
    Width:=  ScaleX(417);
    Height:= ScaleY(100);
    SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{userstartup}'),ExpandConstant('{commonstartup}'));
    OnChange:= @TFV_and_TDV_OnChange_and_else;
    Parent:= WizardForm.SelectProgramGroupPage;
  end;


  ProgressLabel := TLabel.Create(WizardForm);
  with ProgressLabel do
  begin
    Top := WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(8);
    Left:= WizardForm.ProgressGauge.Left + WizardForm.ProgressGauge.Width/2 - ScaleX(8);
    AutoSize := True;
    Parent := WizardForm.InstallingPage;
  end;

  SizeLabel := TLabel.Create(WizardForm);
  with SizeLabel do
  begin
    Top := WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(8);
    Left:= WizardForm.ProgressGauge.Left;
    AutoSize := True;
    Parent := WizardForm.InstallingPage;
  end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpSelectProgramGroup: TFV.Enabled := WizardForm.GroupBrowseButton.Enabled; // это если первый раз не создавать значки то при повторном запуске инсталл возьмёт настройку из реестра и заблокирует эдит и кнопку а TFV Нет и чтоб это глупо не смотрелось делаем такую проерку
  end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssPostInstall: CreateDCPlusPlus(ExpandConstant('{app}\Settings\DCPlusPlus.xml'));
  end;
end;



и на будущее убирай свой код в тег [more][code] твой код [/code][/more] тк без отступов код просматривать тяжело

====================================================================

El Sanchez,
спасибо
не знал про такую манеру написания if Sender is TStartMenuFolderTreeView ... до недавних пор
это в немалой для меня мере развязывает руки :)
раньше писал
case TButton(Sender) или case TLabel(Sender).Tag of

Batistas 10-08-2012 01:54 1967813

Johny777, честно сказать, я так и не понял, чем мой код в плане tempdownloaddir отличается от твоего...А то, что InitializeWizard CreateTempDownloadDirPage не на нужно месте - я в курсе, не зря же я её заслэшевал. Сам посуди - все процедуры в InitializeWizard идут по порядку, хотя я с таким же успехом мог ставить их вперед, но я же почему-то этого не сделал. =) Инсталятор, кстати, выдает ошибку. Так что вопрос актуален. А в плане остального кода - не я его писал. Я брал готовые примеры и вручную прикручивал к скрипту от El Sanchez'a . Самое главное, что это приводило к нужному результату. А длиннее\кароче код это не имеет особого значения. "TStartMenuFolderTreeView" я брал из готового примера древа дисков и папок:

читать дальше »



[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[code]
var
TDV: TFolderTreeView;
TFV: TStartMenuFolderTreeView;

procedure TDVOnChange(Sender: TObject);
begin
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'MyApp';
end;

procedure TFVOnChange(Sender: TObject);
begin
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'MyApp';
end;

procedure InitializeWizard();
begin
TDV:= TFolderTreeView.Create(WizardForm);
TDV.Top:= WizardForm.DirEdit.Top+28;
TDV.Width:= 417;
TDV.Height:= 100;
TDV.OnChange:= @TDVOnChange;
TDV.Parent:= WizardForm.SelectDirPage;


TFV:= TStartMenuFolderTreeView.Create(WizardForm);
TFV.Top:= WizardForm.GroupEdit.Top+28;
TFV.Width:= 417;
TFV.Height:= 100;
TFV.SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{us erstartup}'),ExpandConstant('{commonstartup}'));
TFV.OnChange:= @TFVOnChange;
TFV.Parent:= WizardForm.SelectProgramGroupPage;
end;



Spell1999 10-08-2012 03:02 1967833

Вложений: 1
люди мне дали клёвый скритп но там вот такая ошибка http://forum.oszone.net/attachment.p...1&d=1344553184 и незнаю что делать всё облазил вроде всё нормально а не компилица скрипт. поогите вот код ботвы

неполучилось скинуть скрипт вообщем вот сам файл http://rghost.ru/39688804

Batistas 10-08-2012 03:03 1967834

Johny777, правильный порядок инициализации был испорчен, ибо я перебирал последовательности, ибо только после добавления криэйттемпдир появляется ошибка. Именно после нее, хотя делается все по аналогии. А толку от правильного порядка инициализации? Он не является причиной ошибки. Ты можешь прямо сейчас его испортить - инсталятор будет компилироваться. Максимум, что будет - компонент, который находится не на своем месте не будет работать. Другой вопрос, что даже при правильном порядке ошибка вылетает. И вылетает ошибка на 253 строку - http://s2.ipicture.ru/uploads/20120810/U3w46t5i.png Заслешиваем CreateTempDownloadDirPage и вуаля - инсталятор компилируется без единой ошибки.

YURSHAT 10-08-2012 06:00 1967852

Batistas, а я ведь вам на ru-board готовый скрипт выложил, зря только писал :(

El Sanchez 10-08-2012 09:32 1967895

Цитата:

Цитата Batistas
Мой неправильный код заслешован. Не подскажешь как правильно сделать? »

  • В теле процедуры CreateTempDownloadDirPage создание страницы TempDownloadDirPage сделано после ShareDirPage, так что Johny777 прав - в InitializeWizard CreateTempDownloadDirPage должен идти после CreateShareDirPage.
  • В CreateDCPlusPlus не исправлены ноды как я писал в исправленном скрипте (settings node, nick node, downdir node, share node, tempdir node, prevapps node)
  • После правок переместить ноды tempdir node, Description, BanMessage, UploadSpeed выше ноды share node

Batistas 10-08-2012 09:55 1967910

YURSHAT, да я там написал, мне дня четыре никто не отвечал. На пятый день написал один "умный" и сказал, что тут альтруистов нет =\ А насчет не пригодится, это ты зря =) Мне все пригодится :)

Batistas 10-08-2012 10:33 1967928

El Sanchez,
1)Я это изначально знал;
2)Вы сами писали, что начальный скрипт заводится на ANSI;
3)Вот именно из-за такого перемещения я и перепутал местами инициализацию. Сделал, как Вы сказали - та же ошибка.

Вот архив со скриптом - http://narod.ru/disk/59165927001.1aa...08.12.rar.html. Попробуйте сами скомпилировать setup_2.iss и сами все увидите.

El Sanchez 10-08-2012 20:00 1968208

Batistas, все чудесатее и страньше. Скомпилировал, запустил, установил, не ругнулось, запустил поверх несколько раз, с какой-то попытки поймал ошибку. Посмотрите на свой последний скриншот. Из него видно, что функция ReadDCPlusPlus отработала по крайней мере не меньше 2 раз, значит и проблемная строка тоже. У меня ошибка произошла при отработке процедуры CreateTempDownloadDirPage, вызов функции ReadDCPlusPlus, попытка чтения значения ноды из файла DCPlusPlus.xml. Смотрим, как вы создаете эту ноду:
Код:

//tempdir node
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings').AppendChild(objXMLDoc.createNode(1, 'TempDownloadDir', ''));
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/TempDownloadDir').setAttribute('type', 'string');
objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/TempDownloadDir').text := DownloadDirPage.Values[0];

1. Строку с setAttribute я сказал убрать вообще, не нужен этот атрибут. Я убрал только эту строку и ошибка исчезла. Правда, позже вернув ее назад, ошибку получить не удалось :).
2. DownloadDirPage.Values[0] заменить на TempDownloadDirPage.Values[0].

P.S. Я еще говорил сменить XML Parser на более новый, пробуйте:
Цитата:

Цитата El Sanchez
Batistas, попробуйте вместо объекта Microsoft.XMLDOM подставить одно из значений: MSXML2.DOMDocument, MSXML2.DOMDocument.3.0, MSXML2.DOMDocument.4.0, MSXML2.DOMDocument.6.0. »


Batistas 10-08-2012 21:46 1968276

El Sanchez, все сделал - та же самая ошибка

Gnom_aka_Lexander 10-08-2012 22:29 1968308

Ivan_009, Легко...
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*Code]
var
  FlagG, FlagT : Boolean;
  CurLeft, CurTop : Integer;
 
procedure ShiftGTimer(Sender: TObject);
begin
  case FlagG of
    True  : WizardForm.Left := WizardForm.Left + 3;
    False : WizardForm.Left := WizardForm.Left - 3;
  end;
  if WizardForm.Left <= 0 then
    FlagG := True;
  if WizardForm.Left >= CurLeft then
    FlagG := False;
end;

procedure ShiftTTimer(Sender: TObject);
begin
  case FlagT of
    True  : WizardForm.Top := WizardForm.Top + 3;
    False : WizardForm.Top := WizardForm.Top - 3;
  end;
  if WizardForm.Top <= 0 then
    FlagT := True;
  if WizardForm.Top >= CurTop then
    FlagT := False;
end;

procedure InitializeWizard();
begin
  FlagG := False;
  FlagT := False;
  with WizardForm do
  begin
    Width := ClientWidth;
    Height := ClientHeight;
    BorderStyle := bsNone;
    CurLeft := Left;
    CurTop := Top;
  end;
  with TTimer.Create(WizardForm) do
  begin
    Interval := 40;
    OnTimer := @ShiftGTimer;
  end;
  with TTimer.Create(WizardForm) do
  begin
    Interval := 40;
    OnTimer := @ShiftTTimer;
  end;
end;


YURSHAT 10-08-2012 22:35 1968310

Цитата:

Цитата Gnom_aka_Lexander
Легко... »

:lol:

Ivan_009 10-08-2012 22:41 1968314

Gnom_aka_Lexander, не работает :o
Мне нужно чтобы передвигать мышью а не чтобы она сама ходуном ходила.....:jump:

YURSHAT 10-08-2012 23:16 1968329

Вложений: 1
Ivan_009

Ivan_009 10-08-2012 23:32 1968337

YURSHAT, Спасибо большое :up но почемуто с данным скриптом нехочет работать.

YURSHAT 11-08-2012 01:32 1968371

Ivan_009, ну коль выкладываете киллометровый скрипт, то выкладывайте полностью, с нужными файлами. Ибо что бы проверить, нужно скомпилить, а у меня нет времени подбирать нужные файлы....

Snoopak96 11-08-2012 11:43 1968432

Ivan_009,
http://rghost.ru/39717893

Ivan_009 11-08-2012 11:53 1968437

Snoopak96, Респект :clapping: и большое спасибо :up все работает...

Ivan_009 11-08-2012 14:47 1968487

Как вставить свою картинку в форму отмены.... :search:

Johny777 11-08-2012 15:08 1968497

Цитата:

Цитата Ivan_009
Как вставить свою картинку в форму отмены.... »

Ну Вань как и любую другую (приписал пару комментариев)

читать дальше »
Код:

[Setup]
AppName=Cancel_Demo
AppVerName=Cancel_Demo
DefaultDirName={pf}\Cancel_Demo

// пакуем картинку в экзешник
BitmapResource=CancelPic:C:\Program Files (x86)\Inno Setup 5\WizModernSmallImage.bmp


[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl;
Name: English; MessagesFile: compiler:Languages\English.isl;


[CustomMessages]
Russian.Close=Выход
English.Close=Exit

Russian.Exit_Install=Выйти из инсталлятора?
English.Exit_Install=Exit Installer?

Russian.Exit_Install_2=Отменить установку?
English.Exit_Install_2=Cancel Installation?


[code]
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord; external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: LongWord; uPosition, uFlags: UINT): BOOL; external 'DeleteMenu@user32.dll stdcall';
function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLongA@user32.dll stdcall';
function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLongA@user32.dll stdcall';

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
var
  MyExit: TSetupForm;

begin
  Confirm := False;

  MyExit := CreateCustomForm();
  with MyExit do
  begin
    Position := poScreenCenter;
    ClientWidth := ScaleX(200);
    ClientHeight := ScaleY(87);
    Caption := ExpandConstant('{cm:Close}');
    Color := clBtnFace;
    DeleteMenu(GetSystemMenu(MyExit.Handle,False), $F060,0); /// сделать кнопку "закрыть" неактивной
    SetClassLong(MyExit.Handle, -26, GetClassLong(MyExit.Handle, -26) or $200); /// блокировка комбинации alt + f4

    with TLabel.Create(nil) do
    begin
      AutoSize := False;
      if WizardForm.CurPageID = wpInstalling then
      begin
        if ActiveLanguage = 'Russian' then SetBounds(ScaleX(37), ScaleY(16), ScaleX(140), ScaleY(30)) else SetBounds(ScaleX(47), ScaleY(16), ScaleX(140), ScaleY(30));
        Caption := ExpandConstant('{cm:Exit_Install_2}');
      end else
      begin
        if ActiveLanguage = 'Russian' then SetBounds(ScaleX(30), ScaleY(16), ScaleX(140), ScaleY(30)) else SetBounds(ScaleX(65), ScaleY(16), ScaleX(140), ScaleY(30));
        Caption := ExpandConstant('{cm:Exit_Install}');
      end;
      Parent := MyExit;
      Font.Size := 9;
    end;
   
    with TBitmapImage.Create(nil) do // картинка не имеет переменной, ведь никаких действий с ней не планируется?
    begin
      Parent := MyExit; /// Родитель - наша форма отмены
      Left := ScaleX(0);
      Top := ScaleY(0);
      AutoSize := True; /// заместо ширины, высоты можно просто указать "авторазмер"
      Bitmap.LoadFromResourceName(HInstance, '_IS_CANCELPIC'); /// грузим картинку
    end;

    with TButton.Create(nil) do
    begin
      Parent := MyExit;
      Caption := ExpandConstant(SetupMessage(msgButtonNo));
      SetBounds(ScaleX(18), ScaleY(47), ScaleX(71), ScaleY(25));
      Cursor := crHand;
      ModalResult:= mrNo;
    end;

    with TButton.Create(nil) do
    begin
      Caption := ExpandConstant(SetupMessage(msgButtonYes));
      Parent := MyExit;
      SetBounds(ScaleX(110), ScaleY(47), ScaleX(71), ScaleY(25));
      Cursor := crHand;
      ModalResult := mrYes;
    end;

    case ShowModal() of

      mrNo : Cancel := False;

      mrYes :
      begin
        case
          WizardForm.CurPageID of
          wpInstalling : Application.Title := ExpandConstant(' ' + SetupMessage(msgButtonCancel) + '...');
        end;
      end;

    end;

    Free;
  end;
end;


Ivan_009 11-08-2012 23:05 1968663

Почему при использовании ISVideo повтор идет нормально но стоит нажать кнопку Stop и Play так все как только видео доходит доконца и все больше неповторяется в чем может быть проблема вот код.....

Johny777 12-08-2012 01:12 1968766

Ivan_009,
узнаю своё кодище :)
улучшил с точки зрения оптимизации

читать дальше »
Код:

procedure ISVideoInit(Handle: THandle; FileName: PAnsiChar; L,T,W,H: Integer); external 'ISVideoInit@files:ISVideo.dll stdcall';
procedure ISVideoPause(); external 'ISVideoPause@files:ISVideo.dll stdcall';
procedure ISVideoPlay(); external 'ISVideoPlay@files:ISVideo.dll stdcall';
procedure ISVideoStop(); external 'ISVideoStop@files:ISVideo.dll stdcall';
procedure ISVideoRePlay(); external 'ISVideoRePlay@files:ISVideo.dll stdcall';
procedure ISVideoClose(); external 'ISVideoClose@files:ISVideo.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 InitializeWizard2();
begin
  ExtractTemporaryFile('video.avi');
  XVIDInstall;
end;

procedure CurPageChanged1(CurPageID: Integer);
begin
  case CurPageID of
    wpInstalling:
    begin
      SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) xor $2000000);
      ISVideoInit(WizardForm.Handle, ExpandConstant('{tmp}\video.avi'), ScaleX(1), ScaleY(1), ScaleX(748), ScaleY(421));
      ISVideoRePlay;
    end;

    wpFinished:
    begin
      SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) or $2000000);
      ISVideoClose;
    end;
  end;
end;

procedure Play_Stop_Pause(Sender: TObject);
begin
  case TNewButton(Sender).Tag of
 
    1: ISVideoPause();  /// Pause
   
    2: ISVideoRePlay; // play  /// вот тут и был косяк. вместо  ISVideoPlay(); нужно  ISVideoRePlay; (ISVideo !Re! Play;)
   
    3:        /// Stop
    begin 
      ISVideoClose();
      ISVideoInit(WizardForm.Handle, ExpandConstant('{tmp}\video.avi'), ScaleX(1), ScaleY(1), ScaleX(748), ScaleY(421));
      ISVideoStop();
    end;
   
  end;
end;


procedure InitializeWizard1();
begin
  with TNewButton.Create(nil) do
  begin
    Caption := 'Pause';
    Parent := WizardForm;
    SetBounds(ScaleX(130),ScaleY(488),ScaleX(50),ScaleY(25));
    Font.Name := 'Georgia';
    Font.Size := 10;
    Cursor :=crHand;
    Tag := 1;
    OnClick := @Play_Stop_Pause;
  end;

  with TNewButton.Create(nil) do
  begin
    Caption := 'Play';
    Parent := WizardForm;
    SetBounds(ScaleX(190),ScaleY(488),ScaleX(50),ScaleY(25));
    Font.Name := 'Georgia';
    Font.Size := 10;
    Cursor :=crHand;
    Tag := 2;
    OnClick := @Play_Stop_Pause;
  end;

  with TNewButton.Create(nil) do
  begin
    Caption := 'Stop';
    Parent := WizardForm;
    SetBounds(ScaleX(250),ScaleY(488),ScaleX(50),ScaleY(25));
    Font.Name := 'Georgia';
    Font.Size := 10;
    Cursor :=crHand;
    Tag := 3;
    OnClick := @Play_Stop_Pause;
  end;
end;


касательно видео я так понял тебе нужна "петля" после нажатия на кнопку Play
исправил (в код посмотри)

и Вань заимей привычку с файлами выкладывать
я сейчас четверть часа искал Isvideo, собирал скрипт, чтоб сделать у себя проигрывание и только потом начал искать ошибку

El Sanchez 12-08-2012 11:41 1968860

Цитата:

Цитата Batistas
El Sanchez, все сделал - та же самая ошибка »

Batistas, скрины приведите во время ошибки: 1) функции ReadDCPlusPlus, 2) процедуры InitializeWizard.

Ivan_009 12-08-2012 13:08 1968887

Johny777, а как теперь скрыть данные кнопки и отобразить их на wpInstalling: :tomato2:
Подскажи если не трудно...:unsure:

Johny777 12-08-2012 14:25 1968921

Ivan_009,
тогда придётся вернуть переменные
ещё улучшил код
теперь на одну кнопку меньше, тк объединил проигрывание и паузу, а запуск видео и прочее перенёс из переключения страниц в этапы установки
код: (приписал комментарии)
читать дальше »
Код:

#include "xvid.iss"

[Setup]
AppName=ISVideo
AppVerName=1.5.0
AppPublisher=AVMan
CreateAppDir=no
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[Files]
Source: Video.avi; DestDir: {tmp}; Flags: dontcopy;
Source: ISVideo.dll; DestDir: {tmp}; Flags: dontcopy;
Source: xvidcore.dll; DestDir: {tmp};Flags: dontcopy;

Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs
Source: {fonts}\*; DestDir: {app}\Files; Flags: external recursesubdirs


[code]
var
  Play_Pause_Button, StopButton: TNewButton;
  Paused: boolean; /// вводим логическую переменную

procedure ISVideoInit(Handle: THandle; FileName: PAnsiChar; L,T,W,H: Integer); external 'ISVideoInit@files:ISVideo.dll stdcall';
procedure ISVideoPause(); external 'ISVideoPause@files:ISVideo.dll stdcall';
procedure ISVideoPlay(); external 'ISVideoPlay@files:ISVideo.dll stdcall';
procedure ISVideoStop(); external 'ISVideoStop@files:ISVideo.dll stdcall';
procedure ISVideoRePlay(); external 'ISVideoRePlay@files:ISVideo.dll stdcall';
procedure ISVideoClose(); external 'ISVideoClose@files:ISVideo.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 CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssInstall:  /// перед устанокой
    begin
      ExtractTemporaryFile('video.avi'); /// извлекаем видео перед установкой. Это лучше чем при запуске инстала, тк скорость запуска возрастёт
      XVIDInstall;

      Play_Pause_Button.Show;  /// делаем кнопки видимыми
      StopButton.Show;

      SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) xor $2000000);
      ISVideoInit(WizardForm.Handle, ExpandConstant('{tmp}\video.avi'), ScaleX(1), ScaleY(1), ScaleX(748), ScaleY(421)); /// инициализируем видео

      ISVideoRePlay;  /// запускаем проигрывание
    end;

    ssPostInstall:  /// после установки
    begin
      SetWindowLong(WizardForm.Handle, (-20), GetWindowLong(WizardForm.Handle, (-20)) or $2000000);
      ISVideoClose;  /// закрываем видео

      Play_Pause_Button.Free; /// разрушаем кнопки (или можешь просто прятать PauseButton.Visible := False; или  PauseButton.Hide)
      StopButton.Free;
    end;
  end;
end;

procedure Play_Stop_Pause(Sender: TObject);
begin
  case TNewButton(Sender) of

  // PauseButton:  /// Pause

    Play_Pause_Button:
    begin
      if Paused then /// если в переменной True, то
      begin
        ISVideoRePlay; // play - запускаем видео
        TNewButton(Sender).Caption := 'Pause'; /// меняем текст кнопки (TNewButton(Sender) типэлемента(посыльный), от которог идёт команда) на "паузу"
        Paused := False; /// пишем что сняли с паузы (заметь преременная для удобства переводится как "на паузе")
      end else /// в противном случае, те в переменной значение False
      begin
        ISVideoPause(); /// ставим видео на паузу и меняем текст кнопки
        TNewButton(Sender).Caption := 'Play';
        Paused := True; /// пишем значение
      end;
    end;

    StopButton:        /// Stop
    begin
      ISVideoClose();
      ISVideoInit(WizardForm.Handle, ExpandConstant('{tmp}\video.avi'), ScaleX(1), ScaleY(1), ScaleX(748), ScaleY(421));
      ISVideoStop();

      Play_Pause_Button.Caption := 'Play';
      Paused := True; /// пишем значение
    end;

  end;
end;


procedure InitializeWizard();
begin
  MsgBox('Чтоб имитировать установку во время установки будут скопированы справки и шрифты', mbInformation, MB_OK);
  WizardForm.Width := ScaleX(700);
  WizardForm.Height := ScaleY(600);

  Paused := False; /// присваиваем начальное значение Caption := 'Pause';

  Play_Pause_Button := TNewButton.Create(nil);
  with Play_Pause_Button do
  begin
    Caption := 'Pause';
    Parent := WizardForm;
    SetBounds(ScaleX(190),ScaleY(488),ScaleX(50),ScaleY(25));
    Font.Name := 'Georgia';
    Font.Size := 10;
    Cursor :=crHand;
    OnClick := @Play_Stop_Pause;
    Hide; // сразу прячем
  end;

  StopButton := TNewButton.Create(nil);
  with StopButton do
  begin
    Caption := 'Stop';
    Parent := WizardForm;
    SetBounds(ScaleX(250),ScaleY(488),ScaleX(50),ScaleY(25));
    Font.Name := 'Georgia';
    Font.Size := 10;
    Cursor :=crHand;
    OnClick := @Play_Stop_Pause;
    Hide; // сразу прячем
  end;
end;



наглядный пример со всем необходимым в архиве:
http://sendfile.su/647969

Batistas 12-08-2012 16:10 1968962

El Sanchez, самое смешное, что теперь ошибка не вылетает Оо День не трогал и вдруг заработало Оо

Mafioza 13-08-2012 18:30 1969617

Помогите пожалуйста я делаю инсталл Opera , и как мне сделать так чтобы была флажок 'сделать браузером по умолчанию' и после деинсталяции по умолчанию стал тот который был до opera , заранее спасибо

Ivan_009 14-08-2012 13:13 1970022

Как сделать данные линии подскажите пожалуйста кто знает... :search:

sergey3695 14-08-2012 14:23 1970066

Ivan_009,
// Для примера (убери если надо)
with WizardForm do begin
InnerNotebook.Hide;
OuterNotebook.Hide;
end;
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Code_]
procedure InitializeWizard();
var
  Bevel: TBevel;
  NewStaticText: TNewStaticText;
begin
with WizardForm do begin
  InnerNotebook.Hide;
  OuterNotebook.Hide;
end;   
  NewStaticText:= TNewStaticText.Create(WizardForm);
with NewStaticText do
begin
  Left:= ScaleX(72);
  Top:= ScaleX(82);
  Caption := '  Пример  '
  Parent:= WizardForm;
end; 
  Bevel:= TBevel.Create(WizardForm);
with Bevel do
begin
  Shape := bsFrame;
  SetBounds(ScaleX(48),ScaleY(88),ScaleX(281),ScaleY(113));
  Parent:= WizardForm;
end; 
end;


То,что на скрине, там тупо делали по бевалу. Так гораздо проще и лучше. :-)

Yury_Prizrak 14-08-2012 17:44 1970201

Всем привет. Возник вопрос - как завершить установку и откатить изменения при определенных условиях? Все условия я запрограммировал. Прверяются они при нажатии определенной кнопки далее:
Код:

//Функция проверки наличия Meneger при установленном сервисе
function NextButtonClick(CurPageID: Integer): Boolean;
var
AppPath, AppValue: string;
begin
        if not Installed then
        begin
                if (not (CurPageID = ServicePage.ID)) then
                begin
                    Result := True;
                    Exit;
                end;
               
                if ServiceCheck then
                begin       
                        AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Control_is1,InstallLocation|}'));
                        if not FileExists(AppPath + '\Manager.exe') then
                        begin
                                MsgBox('Не найден Manager!', mbInformation, mb_Ok)
                                \\что написать сдесь чтобы начось завершение инсталляции и откат изменений???       
                        end;
                        Result := True;       
                end;
    end
    else
    begin
    Result := True;
    end;
end;

И еще вопрос - работаю с xml документом:
Код:

        // пользовательские настройки
        XMLNode := XMLDoc.selectSingleNode('//aaa');
        if not VarIsEmpty(XMLNode) then
        begin
                XMLAttributes := XMLNode.attributes;
                //  Код bbb
                XMLAttrib := XMLAttributes.getNamedItem('bbb');
                XMLAttrib.text := bbb;

Как сначала проверить наличие атрибута 'bbb'

Ivan_009 14-08-2012 23:49 1970400

Как использовать разные кнопки через bmp как тут... :unsure:

Johny777 15-08-2012 02:59 1970467

Mafioza,
реестр не знаю
извиняй
жди кто подскажет

==================================================================================================== ========

Yury_Prizrak,
давай писать компактнее
убирай пожалуйста свои коды дополнительно в [more] [/more]
Цитата:

Цитата Yury_Prizrak
как завершить установку и откатить изменения ... при нажатии определенной кнопки далее »

откат работает только во время установки (между этапами ssInstall и ssPostInstall), а нажатие на кнопку далее - это уже до или после установки
поэтому можно только удалить, а откат (под откатом имею ввиду не удаление, а какие-то действия типа возвращения бэкапа) делать в функциях удаления
Цитата:

Цитата Yury_Prizrak
\\что написать сдесь чтобы начось завершение инсталляции и откат изменений??? »

объясню на основе примера (приписал комментарии) :
читать дальше »
Код:

[Setup]
AppName=Test Mouse Event
AppVersion=1.5
OutputDir=.
AppId=TheBestAppIdEver
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\Setup_B}


[code]
var
  Errorcode: Integer;

function InitializeSetup(): Boolean; /// в твоём случае функция нажатия на кнопку далее
var
  AppPath, UninsPath: String;
begin
  Result := True;

  UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}'));
  AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}'));

  if AppPath <> '' then if MsgBox(ExpandConstant('Установлена. Удалить?'), mbError, MB_YESNO) = IDYES then /// в твоём случае 'Не найден Manager!'
  begin
    Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, Errorcode);  /// запускаем деинсталятор
    Result := True;
  end
  else Result := True;
end;

function RollingBack: boolean; // создаём функцию возвращающую булев значение в конце(в данном случае после месседжбокса) или в зависимости от чего-то
begin
  Result := False; /// встроенная переменная Result возвращает False

  MsgBox('Все дела перед удалением обделаны', mbInformation, mb_Ok) // здесь делаешь свои дела, если надо

  Result := True; /// после дел возвращает True а этот результат уже передаётся Result-у деинсталятора, который есть разрешение на удаление
end;

function InitializeUninstall(): Boolean;  /// версия полу-тихого деинсталятора // могу дать полностью тихое
begin
  Result := False;

  if not UninstallSilent then
  begin
    Exec(ExpandConstant('{uninstallexe}'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ErrorCode);
    Exit;
  end;

  if MsgBox(FmtMessage(SetupMessage(msgConfirmUninstall), ['{#SetupSetting("AppName")}']), mbInformation, MB_YESNO) = idYes then
  begin
    Result := RollingBack;
    MsgBox(FmtMessage(SetupMessage(msgUninstalledAll), ['{#SetupSetting("AppName")}']), mbInformation, MB_OK);
  end
  else Result := False;
end;



================================================================================================

Ivan_009,
за основу взял пример "4 состояния"
добавил второй входной параметр процедуре текстурирования кнопок
смотри
procedure LoadButtonImage(AButton: TButton; Texture: Integer);
///////////// название///////////(название кнопки; номер тестуры);
номер текстуры в данном случае целое число (1 или 2)
в самой процедуре:
if Texture = 1 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON1');
if Texture = 2 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON2');

использование:
LoadButtonImage(WizardForm.BackButton, 1)
те грузим картинку процедурой LoadButtonImage и в скобках через запятую отправляем ей параметры (родная кнопка "назад", 1), где 1 - это тестура номер 1

код:
читать дальше »
Код:

[Setup]
;Используется текстура размером 320х23, где размер одной кнопки 80х23
;обычное состояние - при наведении - при нажатии - заблокировано
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=.
BitmapResource=button1:buttonA.bmp|button2:buttonB.bmp

[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl";


[code]

const
  ButtonWidth = 80;
  ButtonHeight = 27;

var
  WizardLabel: TLabel;
  ButtonPanel: array of TPanel;
  ButtonImage: array of TBitmapImage;
  ButtonLabel: array of TLabel;
  UsedButtons: array of TButton;
  ButtonsCount: Integer;

procedure ButtonLabelClick(Sender: TObject);
var
  Button: TButton; n, i: Integer;
begin
  i:= TLabel(Sender).Tag; ButtonImage[i].Left:= 0
  for n:=0 to (ButtonsCount-1) do
  begin
    if i = n then Button:= UsedButtons[n];
  end;
  Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n, I: Integer;
begin
I:=TLabel(Sender).Tag;
//Сначала восстанавливаем картинку у всех кнопок, так надо иначе могут быть глюки
for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end;
//Теперь собственно ставим нужную картинку
if (ButtonLabel[i].Enabled)and(ButtonImage[i].Left <> -ButtonWidth*2) then begin ButtonImage[i].Left:= -ButtonWidth; end;
end;

procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n: Integer;
begin
//Т.к Sender'ом выступает WizardLabel то не получится испльзовать индекс кнопки
for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end;
end;

procedure LoadButtonImage(AButton: TButton; Texture: Integer);
var n: Integer;
begin
n:=ButtonsCount; SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1); SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1); UsedButtons[n]:= AButton;

ButtonPanel[n]:=TPanel.Create(WizardForm)
ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height)
ButtonPanel[n].Tag:= n
ButtonPanel[n].Enabled:= AButton.Enabled
ButtonPanel[n].Parent:=AButton.Parent

ButtonImage[n]:=TBitmapImage.Create(WizardForm)
ButtonImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(320), ScaleY(27))
ButtonImage[n].Enabled:=False
if Texture = 1 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON1');
if Texture = 2 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON2');
ButtonImage[n].Parent:=ButtonPanel[n]

with TLabel.Create(WizardForm) do begin
Tag:=n
Parent:=ButtonPanel[n]
Width:=AButton.Width
Height:=AButton.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseMove:=@ButtonLabelMove
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end

ButtonLabel[n]:=TLabel.Create(WizardForm)
ButtonLabel[n].Autosize:=True
ButtonLabel[n].Alignment:=taCenter
ButtonLabel[n].Tag:=n
ButtonLabel[n].Enabled:= AButton.Enabled
ButtonLabel[n].Transparent:=True
ButtonLabel[n].Font.Color:=clBlack
ButtonLabel[n].Caption:=AButton.Caption
ButtonLabel[n].OnClick:=@ButtonLabelClick
ButtonLabel[n].OnDblClick:=@ButtonLabelClick
ButtonLabel[n].OnMouseMove:=@ButtonLabelMove
ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown
ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp
ButtonLabel[n].Parent:=ButtonPanel[n]

ButtonsCount:= ButtonsCount+1
end;

procedure UpdateButtons();
var n: Integer;
begin
for n:=0 to ButtonsCount-1 do begin
ButtonLabel[n].Caption:=UsedButtons[n].Caption
ButtonPanel[n].Visible:=UsedButtons[n].Visible
if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0;
ButtonLabel[n].Enabled:= UsedButtons[n].Enabled;
ButtonPanel[n].Enabled:= UsedButtons[n].Enabled;
//Ставим Left и Top лейбла соразмерно размеру лейбла
ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку активной
WizardForm.NextButton.Enabled:= True;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку неактивной
WizardForm.NextButton.Enabled:= False;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons()
end;

procedure InitializeWizard();
begin

WizardForm.Color := clWhite;


WizardLabel:= TLabel.Create(WizardForm)
WizardLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(WizardForm.Width), ScaleY(WizardForm.Height))
WizardLabel.Transparent:= True;
WizardLabel.AutoSize:=false;
WizardLabel.OnMouseMove:=@WizardLabelMove
WizardLabel.Parent:= WizardForm;

WizardForm.BackButton.Width:= ButtonWidth
WizardForm.BackButton.Height:= ButtonHeight

WizardForm.NextButton.Width:= ButtonWidth
WizardForm.NextButton.Height:= ButtonHeight

WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:= ButtonHeight

WizardForm.DirBrowseButton.Left:=ScaleX(337)
WizardForm.DirBrowseButton.Width:= ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight

WizardForm.GroupBrowseButton.Left:=ScaleX(337)
WizardForm.GroupBrowseButton.Width:= ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick

WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick


LoadButtonImage(WizardForm.BackButton, 1)
LoadButtonImage(WizardForm.NextButton, 2)
LoadButtonImage(WizardForm.CancelButton, 2)
LoadButtonImage(WizardForm.DirBrowseButton, 1)
LoadButtonImage(WizardForm.GroupBrowseButton, 2)
end;

procedure CurPageChanged(CurPageID: Integer);
begin
UpdateButtons()
end;



пример для наглядности с (двумя тестстурами) :
http://sendfile.su/649535

Yury_Prizrak 15-08-2012 11:19 1970547

Так, задачу немного упростим - как просто выйти из программы инсталляции в определенный момент - еще до начала копирования данных на диск. Тоесть например в момент нажатия кнопки далее на странице выбора пути выскакивал месседж - бла бла бла и при нажатии ок - инсталляция просто закрывалась - не трогая данных, находящихся на диске?

Есть решение WizardForm.Close; но оно вываливает окошко выбора - типа "а вы точно хотите завершить?"

nik1967 15-08-2012 11:49 1970573

Yury_Prizrak,
попробуй так
Код:

[ Code]
var
  Flag: boolean;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:= Flag=false;
end;


//Функция проверки наличия Meneger при установленном сервисе
function NextButtonClick(CurPageID: Integer): Boolean;
var
AppPath, AppValue: string;
begin
        if not Installed then
        begin
                if (not (CurPageID = ServicePage.ID)) then
                begin
                    Result := True;
                    Exit;
                end;
               
                if ServiceCheck then
                begin       
                        AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Control_is1,InstallLocation|}'));
                        if not FileExists(AppPath + '\Manager.exe') then
                        begin
                                MsgBox('Не найден Manager!', mbInformation, mb_Ok)
                                  Flag:= true;
                                  WizardForm.Close;
       
                        end;
                        Result := True;       
                end;
    end
    else
    begin
    Result := True;
    end;
end;


Yury_Prizrak 15-08-2012 12:42 1970617

nik1967, спасибо, работает. Может еще знаешь как наличие атрибута проверять? Было бы просто здорово! :)

Mafioza 15-08-2012 12:50 1970624

johny 777
не знаешь как довавить программу в автозагрузку через реестр , а не через *пуск\автозагрузка ???

Johny777 15-08-2012 12:56 1970626

Mafioza,
это знаю тк у меня есть пример:

читать дальше »
Код:

;Я себе создал лаунчере запуска программ, и хочу сделать в нём следующее:
;Создать чекбокс, если который выбрать то лаунчер бы запускался вместе с запуском виндовс т.е запускался при включении компьютера.
;Если же чекбокс не выбран, то запуск не происходилбы.
;Возможноли такое реализовать?
;_____________________________-
;Можно. При клике, если чекбокс выбран, то пишешь в ветку реестра
;HKEY_CURRENT_USER\Software\Microsoft\Windows\Curre ntVersion\Run
;строковый параметр, имя которого - твоя прога, а его значение путь до запускаемого файла, с параметрами ком. строки если нужно. Вот примерно так
;____________________________
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[code]
var
  RunBox: TCheckBox;

procedure CheckBoxClick(Sender: TObject);
begin
  if RunBox.Checked then
    RegWriteStringValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Run', 'MyAppName', AddQuotes(ExpandConstant('{srcexe}')))
  else
    RegDeleteValue(HKCU, 'Software\Microsoft\Windows\CurrentVersion\Run', 'MyAppName')
end;

procedure InitializeWizard();
begin
  RunBox:= TCheckBox.Create(WizardForm);
  RunBox.SetBounds(10, 325, 300, 18);
  RunBox.Caption:='Запускать при загрузке системы.';
  RunBox.OnClick:= @CheckBoxClick;
  RunBox.Parent:= WizardForm;
end;


nik1967 15-08-2012 12:58 1970630

Yury_Prizrak, никогда не работал с xml документами, может стоит посмотреть

El Sanchez 15-08-2012 15:47 1970733

Цитата:

Цитата Yury_Prizrak
Как сначала проверить наличие атрибута 'bbb' »

Yury_Prizrak,
Код:

//способ №1
XMLAttributes := XMLNode.attributes;
XMLAttrib := XMLAttributes.getNamedItem('bbb');
if not VarIsEmpty(XMLAttrib) then MsgBox(XMLAttrib.value, mbInformation, MB_OK);

//способ №2
XMLAttrib := XMLNode.getAttribute('bbb');
if not VarIsNull(XMLAttrib) then MsgBox(XMLAttrib, mbInformation, MB_OK);


Ivan_009 15-08-2012 16:41 1970765

Как передвинуть кнопку "завершить" где должна быть кнопка "отмена" :sorry:

Johny777 15-08-2012 17:39 1970805

Ivan_009,
кнопки "завершить" и "установить" нет!
это всё кнопка "далее" текст которой зависит от её, кнопки, расположения на той или иной странице

передвигать кнопки, если их расположение, на разных страницах разное нужно во встроенной процедуре переключения страниц
читать дальше »
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpFinished:
    begin
      /// здесь пишешь координаты кнопки (если ширина и высотра не менялись, то только Top и Left)
    end;
  end;
end;


также запомни для повышении оптимизации, укорачивания кода и тем самым удалении ненужного кода:
если ты кнопку например на странице приветствия расположил слева снизу
и на следующей странице она там же, то при переходе на след. страницу остаются настройки с предыдущей, те не надо указывать те же координаты пока кнопка там же
пример:
читать дальше »
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpWelcome:
    begin
      WizardForm.NextButton.SetBounds(ScaleX(543), ScaleY(556), ScaleX(87), ScaleY(27));
    end;
   
    wpSelectDir:
    begin
      WizardForm.NextButton.SetBounds(ScaleX(543), ScaleY(556), ScaleX(87), ScaleY(27));
    end;
  end;
end;



================================== Demo ===================================
настройки переключения как выше(для примера двигаем кнопку далее) :
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
UninstallFilesDir={app}\uninstall


[code]
procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpWelcome: WizardForm.NextButton.Left := ScaleX(5);

    wpSelectDir: WizardForm.NextButton.Left := ScaleX(30);

    wpReady: WizardForm.NextButton.Left := ScaleX(70);
  end;
end;



те же настройки через таймер (не использовать такой метод без нужды)
под расширенную версию:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
UninstallFilesDir={app}\uninstall


[code]
var
  Page_Timer: Longword;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Pages;
begin
  case WizardForm.CurPageID of
    wpWelcome: WizardForm.NextButton.Left := ScaleX(5);

    wpSelectDir: WizardForm.NextButton.Left := ScaleX(30);

    wpReady: WizardForm.NextButton.Left := ScaleX(70);
  end;
end;


procedure InitializeWizard;
begin
  Page_Timer := SetTimer(WizardForm.Handle, 3, 1, CallbackAddr('Pages')); /// где 3 уникальное число и в другом таймере должно быть другое, чтоб они не пересекались
end;

procedure DeinitializeSetup;
begin
  KillTimer(WizardForm.Handle, Page_Timer);
end;


Ivan_009 15-08-2012 17:49 1970810

Johny777, у меня почемуто вышло так

Johny777 15-08-2012 18:14 1970824

Ivan_009,
так сделай:
читать дальше »
Код:

в процедуре обновления кнопок припиши строки
procedure UpdateButtons();
begin
...
  ButtonPanel[n].Left:= UsedButtons[n].Left;
  ButtonPanel[n].Top:= UsedButtons[n].Top;
...
end;

if CurPageID = wpFinished then
begin
  ButtonPanel[1].Hide;
  WizardForm.NextButton.SetBounds(твои координаты);
  LoadButtonImage(WizardForm.NextButton, 2);
  UpdateButtons;
end;


дело в том что текстурирование не кнопок
а создание панелей поверх и на них картинок с 2-мя лейблами

Ivan_009 16-08-2012 00:51 1971016

Возможно ли на эти кнопки наложить текстуру :search:

Mafioza 16-08-2012 01:06 1971020

как ассоциировать файлы *.apm с программой Autoplay menu builder ? заранее спасибо !!!!!

Ivan_009 16-08-2012 01:17 1971022

Mafioza, при установке программы автоматически ассоциируются :read:

Fifth Intellect 16-08-2012 01:37 1971025

Цитата:

Цитата Mafioza
как ассоциировать файлы »

Смотри примеры в справке.
Делается примерно так
Ассоциация файлов

Пример 1
Код:

[Registry]
Root: HKLM; Subkey: "Software\Classes\.w3m"; ValueType: string; ValueName: ""; ValueData: "WorldEdit.Scenario"; Flags: uninsdeletevalue
Root: HKLM; Subkey: "Software\Classes\WorldEdit.Scenario\DefaultIcon"; ValueType: string; ValueName: ""; ValueData: "{app}\WorldEdit.exe,2"; Flags: uninsdeletevalue
Root: HKLM; Subkey: "Software\Classes\WorldEdit.Scenario\shell\open\command"; ValueType: string; ValueName: ""; ValueData: "{app}\World Editor.exe ""%1"""; Flags: uninsdeletevalue

Пример 2
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Registry]
Root: HKLM; Subkey: SOFTWARE\Classes\.v64; Check: CheckOption(0)
Root: HKLM; Subkey: SOFTWARE\Classes\.z64; Check: CheckOption(1)
Root: HKLM; Subkey: SOFTWARE\Classes\MP64; ValueType: string; ValueData: My Program; Flags: uninsdeletekey
Root: HKLM; Subkey: SOFTWARE\Classes\MP64\DefaultIcon; ValueType: string; ValueData: {app}\MyProgram.exe,0
Root: HKLM; Subkey: SOFTWARE\Classes\MP64\shell\open\command; ValueType: string; ValueData: {app}\MyProgram.exe %1

[ Code]
var
  Page: TInputOptionWizardPage;

procedure InitializeWizard();
begin
  Page := CreateInputOptionPage(wpSelectTasks,
  'Select File Extension Association', 'Which the file extension you would like to associate?',
  'Select the file extension you would like to associate with My Program,'#13#10'then click Next.',
  False, False);

  {0} Page.Add('.v64');
  {1} Page.Add('.z64');

Page.Values[0] := True;
end;

function CheckOption(OptionNum: integer): Boolean;
begin
  Result:= Page.Values[OptionNum];
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpReady then
    begin
    WizardForm.ReadyMemo.Lines.Add('');
      if Page.Values[1] or Page.Values[2] then
    WizardForm.ReadyMemo.Lines.Add('File extension association:');
      if Page.Values[1] then
    WizardForm.ReadyMemo.Lines.Add('      .v64');
      if Page.Values[2] then
    WizardForm.ReadyMemo.Lines.Add('      .z64');
  end;
end;



Пример 3

Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program

[Types]
Name: full; Description: Полная установка
Name: cu stom_clean; Description: Пользовательская установка; Flags: iscustom

[Components]
Name: main; Description: Основные компоненты; Types: full custom_clean; Flags: checkablealone
Name: main\ass; Description: Установить ассоциации:; Types: full custom_clean; Flags: checkablealone
Name: main\ass\ani; Description: .ani; Types: full custom_clean

[Registry]
Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani; ValueType: string; ValueName: ; ValueData: ; Components: main\ass\ani
Root: HKCU; Subkey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani; ValueType: string; ValueName: ProgID; ValueData: IrfanView.ani; Flags: uninsdeletevalue uninsdeletekeyifempty; Components: main\ass\ani

[ Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  String: String;
begin
if (CurStep = ssInstall) and (IsComponentSelected('main\ass\ani') = False) then
  if (ExpandConstant('{ reg:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani,ProgID}') = 'IrfanView.ani') or
    (ExpandConstant('{reg:HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani,ProgID}') = 'IrfanView.ANI') then
    begin
    RegDeleteValue(HKEY_CURRENT_ USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani', 'ProgID')
    if (RegQueryStringValue(HKEY_CURRENT_ USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani', '', String)) and (String = '') then
        RegDeleteValue(HKEY_CURRENT_ USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani', '')
    RegDeleteKeyIfEmpty(HKEY_CURRENT_USER, 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ani')
    end
end;



Первый пример можно так же ассоциировать не только через HKLM но и HKCU. Это уж по личному усмотрению, кому как удобно.

Вкратце:
HKLM - идёт как общая расчитана на всех пользователей, т.е при таком условии даже новый созданный юзер на компе автоматически ассоциируется с программой.
HKCU - В основном расчитана на одного пользователя, т.е при каком пользователе программа ассоциировалась то на нём и останется, на других зверей не повлеяет.

Johny777 16-08-2012 05:06 1971037

Эх Ваня...

в общем так
за основу взял "4 состояния"
1. Используется текстура размером 320х23, где размер одной кнопки 80х23
Теперь пофиг какая, тк картинка растягивается (только растягивать нужно в разумных пределах).
Главное чтоб были 4 кнопки одинакового размера с таким вот расположением картинок-состояний:
;обычное состояние - при наведении - при нажатии - заблокировано

2. тк картинка растягивается размеры кнопок больше не привязаны к константам
const
ButtonWidth = 80;
ButtonHeight = 23;
а это занчит, что кнопки могут быть отличными по размеру от ширины и высоты раздела тектстуры и друг от друга

3. сильно оптимизировал код:
убрал лишнее
переписал грамотнее
заменил процедуры наведения и "уведения" курсора мыши с кнопки (стали быстрее на глаз)

4. две текстуры для кнопок на месте как были

Результат:
читать дальше »
Код:

;обычное состояние - при наведении - при нажатии - заблокировано
[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=.
BitmapResource=button1:buttonA.bmp|button2:buttonB.bmp
LicenseFile=compiler:License.txt


[  Code]
var
  WizardLabel: TLabel;
  ButtonPanel: array of TPanel;
  ButtonImage: array of TBitmapImage;
  ButtonLabel: array of TLabel;
  UsedButtons: array of TButton;
  ButtonsCount: Integer;

procedure ButtonLabelClick(Sender: TObject);
var
  Button: TButton;
  n, i: Integer;
begin
  i:= TLabel(Sender).Tag;
  ButtonImage[i].Left := 0;
  for n:=0 to (ButtonsCount-1) do if i = n then Button:= UsedButtons[n];
  Button.OnClick(Button);
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-TLabel(Sender).Width*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelOnEnter(Sender: TObject);
var
  i: Integer;
begin
  i := TLabel(Sender).Tag;
  if (ButtonLabel[i].Enabled) then ButtonImage[i].Left:= -TLabel(Sender).Width;
end;

procedure ButtonLabelOnLeave(Sender: TObject);
var
  i: Integer;
begin
  i := TLabel(Sender).Tag;
  if (ButtonLabel[i].Enabled) then ButtonImage[i].Left := 0;
end;


procedure LoadButtonImage(AButton: TButton; Texture: Integer);
var
  n: Integer;
begin
  n := ButtonsCount;
  SetArrayLength(ButtonPanel, n+1);
  SetArrayLength(ButtonImage, n+1);
  SetArrayLength(ButtonLabel, n+1);
  SetArrayLength(UsedButtons, n+1);
  UsedButtons[n] := AButton;

  ButtonPanel[n]:=TPanel.Create(nil)
  with ButtonPanel[n] do
  begin
    SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height);
    Tag := n;
    Enabled := AButton.Enabled;
    Parent := AButton.Parent;
  end;

  ButtonImage[n]:=TBitmapImage.Create(nil)
  with ButtonImage[n] do
  begin
    SetBounds(ScaleX(0), ScaleY(0), AButton.Width*4, AButton.Height);
    Enabled:=False;
    Stretch := True;
    Parent:=ButtonPanel[n];
    if Texture = 1 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON1');
    if Texture = 2 then ButtonImage[n].Bitmap.LoadFromResourceName(HInstance, '_IS_BUTTON2');
  end;

  ButtonLabel[n]:=TLabel.Create(nil)
  with ButtonLabel[n] do
  begin
    Autosize := True;
    Alignment := taCenter;
    Tag := n;
    Enabled := AButton.Enabled;
    Transparent := True;
    Font.Color := clBlack;
    Caption := AButton.Caption;
    Parent := ButtonPanel[n];
  end;

  with TLabel.Create(nil) do
  begin
    Tag := n;
    Parent := ButtonPanel[n];
    Width := AButton.Width;
    Height := AButton.Height;
    Transparent := True;
    OnClick := @ButtonLabelClick;
    OnDblClick := @ButtonLabelClick;
    OnMouseEnter := @ButtonLabelOnEnter;
    OnMouseLeave := @ButtonLabelOnLeave;
    OnMouseDown := @ButtonLabelMouseDown;
    OnMouseUp := @ButtonLabelMouseUp;
  end;

  ButtonsCount := ButtonsCount + 1;
end;

procedure UpdateButtons();
var
  n: Integer;
begin
    for n:=0 to ButtonsCount-1 do
    begin
      with ButtonPanel[n] do
      begin
        Visible := UsedButtons[n].Visible;
        Enabled := UsedButtons[n].Enabled;
        Left:= UsedButtons[n].Left;
        Top:= UsedButtons[n].Top;
      end;
     
      with ButtonLabel[n] do
      begin
        Caption := UsedButtons[n].Caption;
        Enabled := UsedButtons[n].Enabled;
        Left := ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
        Top := ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
      end;
     
      if not UsedButtons[n].Enabled then ButtonImage[n].Left := - UsedButtons[n].Width*3 else ButtonImage[n].Left := 0;
    end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
  WizardForm.NextButton.Enabled:= True;
  UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
  WizardForm.NextButton.Enabled:= False;
  UpdateButtons()
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    Color := clWhite;
    LicenseAcceptedRadio.OnClick := @LicenceAcceptedRadioOnClick;
    LicenseNotAcceptedRadio.OnClick := @LicenceNotAcceptedRadioOnClick;
   
    NextButton.Width := ScaleX(60);
  end;

  LoadButtonImage(WizardForm.BackButton, 1)
  LoadButtonImage(WizardForm.NextButton, 1)
  LoadButtonImage(WizardForm.CancelButton, 2)
  LoadButtonImage(WizardForm.DirBrowseButton, 1)
  LoadButtonImage(WizardForm.GroupBrowseButton, 2)
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  UpdateButtons();
 
  if CurPageID = wpFinished then
  begin
    ButtonPanel[1].Hide;
    WizardForm.NextButton.Left := ScaleX(60);
    LoadButtonImage(WizardForm.NextButton, 2);
    UpdateButtons;
  end;
end;



скрин:


архив со всем необходимым:
http://sendfile.su/650210

==================== Важно!
читать дальше »

в изначальной версии этого скрипта тектурирование такое
сначала создаётся панель
на ней картинка
сверху лейбл прозрачный на всю панель на котрый мы: нажимаем, дважды нажимаем, наводим, уводим
а сверху другой по центру с надписью типа "Обзор" или "Далее "

так вот у двух последних лейблов и были эвенты : нажимаем, наводим, уводим
Почему?
да потому то что сначала создавался тот что на всю панель, а потом надпись и надпись ложилась сверху
у меня в коде этого нет, тк согдание идёт по порядку от begin до end;
те у меня сначала создаётся лейбл с надписью а потом другой - на всю панель - и он перекрывает тот
Если б не это то код выше был бы невозможен тк используется TLabel(Sender).Width
те берём размер посыльного лейбла
вот и получалось, что при наведении на большой всё в порядке, а при наведении на маленький ерунда

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

долго не мог докумекать почему пока не записал создание лейбла до создания кнопок

я говорю это потому что мне кажется это не все знают, а это важно!

Ivan_009 16-08-2012 14:29 1971255

Johny777, а возможно или нет наложить изображение через bmp на чекбоксы :unsure:

Johny777 16-08-2012 14:59 1971286

Ivan_009, в шапке пример El Sanchez-а "Создание кастомного чекбокса"
а вообще думаю можно доработать текстурирование кнопок под эти цели
не уверен

Ivan_009 17-08-2012 00:22 1971550

Как добавить крестик и кнопку свернуть вот сюда без использования ботвы подскажите кто знает заранее спасибо... :search:

Johny777 17-08-2012 02:59 1971582

Ivan_009,
3 способа:

1. использовать TNewButton с текстом "X" и "-"
(С текстурированием страницей назад можно добиться уровня 2-го способа)
код:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.


[  Code]
procedure Close_or_Minimize(Sender: TObject);
begin
  case TNewButton(Sender).Caption of
    'X': WizardForm.Close;
    '-': SendMessage(WizardForm.Handle,$112,61472,0);
  end;
end;

procedure InitializeWizard;
begin
  with WizardForm do
  begin
    OuterNotebook.Hide;
    BorderStyle := bsNone;
    Color := $506a5a;
  end;

  with TNewButton.Create(WizardForm) do
  begin
    Parent := WizardForm;
    SetBounds(WizardForm.Width - ScaleX(25),ScaleY(10),ScaleX(16),ScaleY(16));
    Caption := 'X';
    OnClick := @Close_or_Minimize;
    ShowHint := True;
    Hint := 'Закрыть';
  end;

  with TNewButton.Create(WizardForm) do
  begin
    Parent := WizardForm;
    SetBounds(WizardForm.Width - ScaleX(40),ScaleY(10),ScaleX(16),ScaleY(16));
    Caption := '-';
    OnClick := @Close_or_Minimize;
    ShowHint := True;
    Hint := 'Свернуть';
  end;
end;


2. использовать TNewSpeedButton с глифами (советую)
код:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

BitmapResource=Mini:min.bmp|Close:Close.bmp


[  Code]
procedure Close_or_Minimize(Sender: TObject);
begin
  case TNewSpeedButton(Sender).Hint of
    'Закрыть': WizardForm.Close;
    'Cвернуть': SendMessage(WizardForm.Handle,$112,61472,0);
  end;
end;

procedure InitializeWizard;
begin
  with WizardForm do
  begin
    OuterNotebook.Hide;
    BorderStyle := bsNone;
    Color := $506a5a;
  end;

  with TNewSpeedButton.Create(nil) do
  begin
    Parent := WizardForm;
    SetBounds(WizardForm.Width - ScaleX(50),ScaleY(10),ScaleX(16),ScaleY(16));
    Glyph.LoadFromResourceName(HInstance, '_IS_MINI');
    ShowHint := True;
    Hint := 'Cвернуть';
    OnClick := @Close_or_Minimize;
  end;

  with TNewSpeedButton.Create(nil) do
  begin
    Parent := WizardForm;
    ThemeEnabled := False;
    SetBounds(WizardForm.Width - ScaleX(25),ScaleY(10),ScaleX(16),ScaleY(16));
    Glyph.LoadFromResourceName(HInstance, '_IS_CLOSE');
    ShowHint := True;
    Hint := 'Закрыть';
    OnClick := @Close_or_Minimize;
  end;
end;


архив с кодом и картинками-примерами: http://sendfile.su/650884

3. использовать ImageButton (лучший вариант), те картинку с событиями как при текстурировании
извиняй
рисованием мне сейчас заниматься некогда
так что сам попробуй разобрать, будут вопросы спрашивай
пример такой кнопки это: ...\Inno Setup 5\Examples\Example_MouseEvent_ImgBtn.iss
там и наведение и нажатие и пр.
можно такую кнопку навернуть...
... не хуже чем в аэро стиле семёрки (свечение)!
но не думаю, что стоит с ним заморачиваться, если только ты не делаешь инсталл типа StarCraft 2 за авторством South

ChVL 17-08-2012 11:23 1971699

Чтобы положить файлы в папку "Мои видеозаписи" устанавливаю путь к этой папке:
Код:

[Сode]
const
MAX_PATH = 260;
CSIDL_MYVIDEO = $0e;
function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL;
external 'SHGetSpecialFolderPathA@shell32.dll stdcall'; 

function GetSpecialPath(CSIDL: Word): string;
var
s: string;
begin
SetLength(s, MAX_PATH);
if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then s := '';
Result:= PChar(s);
end;

Скрипт отрабатывает нормально, путь создаётся.
Прописываю путь к этой папке:
Код:

[Files]
Source: {code_GetSpecialPath}\MyProg; DestDir: {code:GetSpecialPath}\MyProg

Компилятор, однако, ругается на ошибку в строке:
function GetSpecialPath(CSIDL: Word): string;
пишет:
Invalid prototype for 'GetSpecialPath'

Как правильно прописать?

Gnom_aka_Lexander 17-08-2012 11:49 1971720

ChVL, вот так:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: {code_GetSpecialPath}\MyProg; DestDir: {code:GetVideoPath}\MyProg

[*code]
const
  MAX_PATH = 260;
  CSIDL_MYVIDEO = $0e;
function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL;
  external 'SHGetSpecialFolderPathA@shell32.dll stdcall';

function GetSpecialPath(CSIDL: Word): string;
var
  s: string;
begin
  SetLength(s, MAX_PATH);
  if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then s := '';
  Result:= PChar(s);
end;

function GetVideoPath(s: string): string;
begin
  Result:= GetSpecialPath(CSIDL_MYVIDEO);
end;


Протип выглядит так: function MyStrFunc(s: string): string;

ChVL 17-08-2012 12:57 1971744

Gnom_aka_Lexander,
Компиляция прошла, однако что-то не срослось при установке программы:


R.i.m.s.k.y. 17-08-2012 13:00 1971747

ChVL, может антивирь блокирует?

ChVL 17-08-2012 13:03 1971752

Цитата:

Цитата R.i.m.s.k.y.
может антивирь блокирует? »

У меня его нет в принципе.

Gnom_aka_Lexander 17-08-2012 13:10 1971759

Цитата:

Цитата Gnom_aka_Lexander
[Files] Source: {code_GetSpecialPath}\MyProg; DestDir: {code:GetVideoPath}\MyProg »

тут засада. MyProg это файл или папка?
Просто Мое Видео входит в системные файлы папки и система может не дать изменить то, что уже есть. По крайней мере семерка.

ChVL 17-08-2012 13:27 1971766

Цитата:

Цитата Gnom_aka_Lexander
это файл или папка? »

Папка.
Но какой-то выход из положения должен быть. Цель тривиальная: положить туда свою папку.

Gnom_aka_Lexander 17-08-2012 13:31 1971772

папка с содержимым? Просто вот так:
Код:

Source: {code_GetSpecialPath}\MyProg; DestDir: {code:GetVideoPath}\MyProg
это будет файл.
А вот так:
Код:

Source: {code_GetSpecialPath}\MyProg\*; DestDir: {code:GetVideoPath}\MyProg
содержимое папки без подпапок. Если нужно создать пустую папку, то лучше использовать секцию [Dirs] а не файлов.

ChVL 17-08-2012 13:38 1971780

Gnom_aka_Lexander,
То, что надо положить: папка\папка\файл

Gnom_aka_Lexander 17-08-2012 13:40 1971783

Код:

Source: {code_GetSpecialPath}\папка\папка\файл; DestDir: {code:GetVideoPath}\папка\папка

ChVL 17-08-2012 13:54 1971791

Gnom_aka_Lexander,
Естественно, обычная запись.

ChVL 17-08-2012 14:36 1971840

Кстати, в ХР та же ситуация:



Это подтверждает необходимость уточнять скрипт.

Gnom_aka_Lexander 17-08-2012 15:12 1971851

ChVL, тогда вот так:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={code:GetVideoPath}

[Files]
Source: GetVideoPath.iss; Flags : dontcopy;

[*code]
function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PAnsiChar; nFolder: Integer; fCreate: BOOL): BOOL;
  external 'SHGetSpecialFolderPathA@shell32.dll stdcall';

function GetSpecialPath(CSIDL: Word): string;
var
  s: string;
begin
  SetLength(s, 260);
  if not SHGetSpecialFolderPath(0, PAnsiChar(s), CSIDL, True) then s := '';
  Result:= PAnsiChar(s);
end;

function GetVideoPath(s : string): string;
begin
  Result:= GetSpecialPath($0e);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
    ForceDirectories(GetSpecialPath($0e) +'\MyProgName');
    ExtractTemporaryFileEx('GetVideoPath.iss',GetSpecialPath($0e)+'\MyProgName');
  end;
end;

но у меня почему-то распаковывает в папку видео, а не в подпапку MyProgName, которая даже не создается. Видимо, все-таки система запрещает вмешательство, не вижу других причин.

ChVL 17-08-2012 15:49 1971882

Вообще-то решение существует. Встречал несколько программ, у которых эта функция реализована. Но до секции [Сode] не добраться...

El Sanchez 17-08-2012 18:53 1971984

ChVL, так попробуйте. Если система будет выделываться, уберите флаг CSIDL_FLAG_CREATE.
Код:

[Files]
Source: test.txt; DestDir: {code:GetVideoPath}\test

[code]
const
    MAX_PATH = 260;
    CSIDL_MYVIDEO = $E;
    CSIDL_FLAG_CREATE = $8000;
    SHGFP_TYPE_DEFAULT = $1;

function SHGetFolderPath(hwndOwner: HWND; nFolder: Integer; hToken: THandle; dwFlags: DWORD; pszPath: String): Longint; external 'SHGetFolderPathA@shell32.dll stdcall';

function GetVideoPath(Param: String): String;
begin
    SetLength(Result, MAX_PATH);
    if SHGetFolderPath(0, CSIDL_MYVIDEO or CSIDL_FLAG_CREATE, 0, SHGFP_TYPE_DEFAULT, Result) <> 0 then Result := '';
    Result := CastIntegerToString(CastStringToInteger(Result));
end;


Ivan_009 18-08-2012 14:48 1972307

Как зделать так чтобы иконка отображалась в этой области... :sorry:

Johny777 18-08-2012 15:01 1972311

Ivan_009,
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: icon.ico; DestDir: {tmp}; Flags: dontcopy
 
[  Code]
function LoadImage(hInst: THandle; ImageName: PChar; ImageType: UINT; X, Y: Integer; Flags: UINT): THandle; external 'LoadImageA@user32.dll stdcall delayload';
 
procedure InitializeWizard;
begin
  ExtractTemporaryFile('icon.ico');
  SendMessage(WizardForm.Handle, $0080, 0, LoadImage(0,ExpandConstant('{tmp}')+'\icon.ico',1,16,16,$1010));
end;


где icon.ico - иконка 16 на 16 пикселей

Автор скрипта - South

Ваня!
только сейчас догнал этот пример тебе не катит, тк у тебя нет границ окна
вот код
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

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

[Files]
Source: "hl2.ico"; Flags: dontcopy

[  Code]
procedure InitializeWizard();
begin
  with WizardForm do
  begin
    OuterNotebook.Hide;
    BorderStyle := bsNone;
    Color := $506a5a;
  end;

  with TNewIconImage.Create(nil) do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(3), ScaleY(3), ScaleX(16), ScaleY(16));
    ExtractTemporaryFile('hl2.ico');
    Icon.LoadFromFile(ExpandConstant('{tmp}\hl2.ico'));
  end;
end;



с файлом: http://sendfile.su/651666 (проверено, одобрено)


использование на форме деинсталятора
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

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

[Files]
Source: "hl2.ico"; DestDir: {app}; Flags: ignoreversion nocompression; Attribs: hidden system;

[Code  ]
procedure InitializeWizard();
begin
  with WizardForm do
  begin
    OuterNotebook.Hide;
    BorderStyle := bsNone;
    Color := $506a5a;
  end;

  with TNewIconImage.Create(nil) do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(3), ScaleY(3), ScaleX(16), ScaleY(16));
    ExtractTemporaryFile('hl2.ico');
    Icon.LoadFromFile(ExpandConstant('{tmp}\hl2.ico'));
  end;
end;


procedure InitializeUninstallProgressForm();
begin
  UninstallProgressForm.BorderStyle := bsNone;
  UninstallProgressForm.Color := $506a5a;
  UninstallProgressForm.OuterNotebook.Hide;
  UninstallProgressForm.ProgressBar.Parent := UninstallProgressForm;
 
  if FileCopy(ExpandConstant('{app}\hl2.ico'), ExpandConstant('{tmp}\hl2.ico'), False) = True then
  begin
    with TNewIconImage.Create(nil) do
    begin
      Parent := UninstallProgressForm;
      SetBounds(ScaleX(3), ScaleY(3), ScaleX(16), ScaleY(16));
      Icon.LoadFromFile(ExpandConstant('{tmp}\hl2.ico'));
    end;
  end;
end;


sergey3695 18-08-2012 15:13 1972318

Цитата:

Цитата Ivan_009
Как зделать так чтобы иконка отображалась в этой области... »

А толку от неё там? Тупо чтобы была?
Если уж так нужно, то как-то так:

читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DisableFinishedPage=yes
OutputDir=.
Compression=lzma/ultra

[Languages]
Name: RUS; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: Files\Icon1.ico; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system;

[Code ]
function InitializeSetup(): Boolean;
begin
if not FileExists(ExpandConstant('{tmp}\Icon1.ico')) then ExtractTemporaryFile('Icon1.ico');
  Result:= True;
end;

var
  MyIcon: TNewIconImage; 

procedure InitializeWizard();
begin
with WizardForm do begin
  BorderStyle:= bsNone;
  InnerNotebook.Hide;
  OuterNotebook.Hide;
end;   
  MyIcon := TNewIconImage.Create(Wizardform);
with MyIcon do
begin
  Parent := Wizardform;
  SetBounds(ScaleX(5),ScaleY(5),ScaleX(16),ScaleY(16));
  Icon.LoadFromFile(ExpandConstant('{tmp}\Icon1.ico'));
end; 
end;


Johny777, на скрин посмотри. Ни че не видешь в правом углу, кнопки на которых свернуть и закрыть.

Johny777 18-08-2012 18:12 1972406

подскажите пожалуйста как в этой процедуре обрабатываемой при изменении лист бокса получить текст выбранного айтема
procedure FileListOnClick(Sender: TObject);
begin
// From_Edit.Text := FileList.Items(Sender).Text;
end;
код целиком:
читать дальше »

Код:

[Setup]
AppName=Test
AppVersion=1.0
DefaultDirName={pf}\Test
DefaultGroupName=Test
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=true
Uninstallable=false

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

[  Code]
var
  Page: TInputDirWizardPage;
  Extract_Button: TButton;
  From_Edit: TNewEdit;
  From_Button: TNewButton;
  To_Edit: TNewEdit;
  To_Button: TNewButton;
  FileList: TNewListBox;
  n: integer;
 
function GetFileCount(dir: string): Integer;
var
  FindFiles: TFindRec;
begin
  Result := 0;
  if FindFirst(dir + '\*.exe', FindFiles) then
    begin
      repeat
        if FindFiles.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then Result := Result + 1;
      until not FindNext(FindFiles) or (Result > 1);
      FindClose(FindFiles);
    end;
end;

procedure GetAllFiles( Path: string; Lb: TNewListBox );
var
sRec: TFindRec;
isFound: boolean;
begin
  isFound := FindFirst(Path +'\*.exe*',sRec);
  while isFound do
  begin
    if (sRec.Name <> '.') and (sRec.Name <> '..') then
    begin
      if (sRec.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY then
      GetAllFiles(Path + '\' + sRec.Name, Lb);
      Lb.Items.Add(Path + sRec.Name);
      n := FileList.Items.Count;
    end;
    Application.ProcessMessages;
    isFound := FindNext(sRec);
  end;
  FindClose(sRec);
end;
 

procedure FileListOnClick(Sender: TObject);
begin
//  From_Edit.Text := FileList.Items(Sender).Text;
end;

procedure BrowseButtonOnClick(Sender: TObject);
var
  Dir: String;
  MyExit: TSetupForm;
begin
  case TButton(Sender) of
    From_Button: if BrowseForFolder(SetupMessage(msgBrowseDialogLabel), Dir, False) then
    begin
    // From_Edit.Text := Dir;
      if GetFileCount(Dir) > 1 then
      begin
        MyExit := CreateCustomForm();
        with MyExit do
        begin
          Position := poScreenCenter;
          ClientWidth := ScaleX(400);
          ClientHeight := ScaleY(300);
          Caption := 'Уточнитель';
          Color := clWindow;

          with TButton.Create(nil) do
          begin
            Parent := MyExit;
            Caption := ExpandConstant(SetupMessage(msgButtonNo));
            SetBounds(ScaleX(18), ScaleY(220), ScaleX(71), ScaleY(25));
            Cursor := crHand;
            ModalResult:= mrNo;
          end;

          with TButton.Create(nil) do
          begin
            Caption := ExpandConstant(SetupMessage(msgButtonYes));
            Parent := MyExit;
            SetBounds(ScaleX(110), ScaleY(220), ScaleX(71), ScaleY(25));
            Cursor := crHand;
            ModalResult := mrYes;
          end;

          FileList := TNewListBox.Create(nil);
          with FileList do
          begin
            Parent := MyExit;
            SetBounds(ScaleX(0),ScaleY(0),ScaleX(400),ScaleY(200));
            ItemHeight := 13;
            ItemIndex := n;
            OnClick := @FileListOnClick;
          end;

          GetAllFiles(Dir, FileList );

          case ShowModal() of
            mrNo : MsgBox( '', mbError, MB_OK);
            mrYes : MsgBox( '', mbError, MB_OK);
          end;
        end;
      end;
    end;

    To_Button: if BrowseForFolder(SetupMessage(msgBrowseDialogLabel), Dir, True) then To_Edit.Text := Dir;

  end;
end;

procedure Edits_OnChange(Sender: TObject);
begin
  Extract_Button.Enabled := (From_Edit.Text <> '') and (To_Edit.Text <> '');
end;

procedure Extract(Sender: TObject);
var
  ErrorCode: Integer;
begin
  Exec(From_Edit.Text, '-y -o"' + To_Edit.Text + '"', From_Edit.Text, SW_HIDE, ewWaitUntilTerminated, ErrorCode);
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    Bevel.Hide;
    OuterNotebook.Hide;
  end;

  From_Edit := TNewEdit.Create(WizardForm);
  with From_Edit do
  begin
    Parent := WizardForm;
    Left := ScaleX(64);
    Top := ScaleY(168);
    Width := ScaleX(313);
    Height := ScaleY(21);
    OnChange := @Edits_OnChange;
  end;

  From_Button := TNewButton.Create(WizardForm);
  with From_Button do
  begin
    Caption := 'Обзор';
    Parent := WizardForm;
    Left := ScaleX(400);
    Top := ScaleY(168);
    Width := ScaleX(75);
    Height := ScaleY(25);
    OnClick := @BrowseButtonOnClick;
  end;

  To_Edit := TNewEdit.Create(WizardForm);
  with To_Edit do
  begin
    Parent := WizardForm;
    Left := ScaleX(64);
    Top := ScaleY(208);
    Width := ScaleX(313);
    Height := ScaleY(21);
    OnChange := @Edits_OnChange;
  end;

  To_Button := TNewButton.Create(WizardForm);
  with To_Button do
  begin
    Caption := 'Обзор';
    Parent := WizardForm;
    Left := ScaleX(400);
    Top := ScaleY(208);
    Width := ScaleX(75);
    Height := ScaleY(25);
    OnClick := @BrowseButtonOnClick;
  end;
 
  Extract_Button:=TButton.Create(WizardForm);
  with Extract_Button do
  begin
    Parent:=WizardForm;
    SetBounds(WizardForm.Width - ScaleX(300),WizardForm.Height - ScaleX(65),ScaleX(75),ScaleY(25));
    Caption:='Извлечь';
    Enabled := False;
    OnClick:=@Extract;
  end;
end;


Ivan_009 18-08-2012 19:36 1972444

Как сделать такие края в инсталляторе без ботвы..... :not-me:

nik1967 18-08-2012 23:14 1972571

Цитата:

Цитата Ivan_009
Как сделать такие края в инсталляторе без ботвы..... »

Выдернуть из AutoRun.iss Need for Speed™ Undercover'а.

Ivan_009 18-08-2012 23:47 1972587

nik1967, А поподробней можно какие функции :)

nik1967 19-08-2012 00:11 1972601

Ivan_009,
пример
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[ Code]
const
  Radius = 55; // Тут сами экспериментируйте

function CreateRoundRectRgn(p1, p2, p3, p4, p5, p6: Integer): THandle; external 'CreateRoundRectRgn@gdi32 stdcall';
function SetWindowRgn(hWnd: HWND; hRgn: THandle; bRedraw: Boolean): Integer; external 'SetWindowRgn@user32 stdcall';

procedure ShapeForm(aForm: TForm; edgeSize: integer);
var
  FormRegion:LongWord;
begin
  FormRegion:=CreateRoundRectRgn(0,0,aForm.Width,aForm.Height,edgeSize,edgeSize);
  SetWindowRgn(aForm.Handle,FormRegion,True);
end;

procedure InitializeWizard();
begin
  ShapeForm(WizardForm, radius);
end;

Только пропадает прозрачность.

Mafioza 19-08-2012 00:45 1972624

как сделать , окно подготовки к установке и его точный прогресс , хотя бы как в NSIS ?заранее спасибо !

Ivan_009 19-08-2012 01:13 1972635

Mafioza, ты про это что ли... :)
Johny777, как такое зделать незнаешь случаем... :not-me:

Johny777 19-08-2012 01:34 1972637

Ivan_009, Mafioza,
блин чуваки
харэ мудрить
я знаю как такое задать и поделюсь, но вы поймите простую вещь
у меня в инсталле при запуске извлекаются 75 картинок
на них отведено 74 деления прогрессбара на форме которая создаётся в начале InitializeWizard;
а в конце разрушается
сама процедура InitializeWizard; у меня длиной в 4200 строк
и все остальные деления (позиции прогреса) раскиданы на примерно равных интервалах по ней (25 делений)
те я не мог не отобразить запуск такого тяжёлого инсталла

если у вас сразу запускается, то вы и форму не особо увидите. Она мелькнёт и всё


а теперь подумайте
вот вы хотите вешать необдуманно рюшки которые - понты
Я тоже фанат всяких наворотов но скажу честно. Если бы мой инсталл запускался за пару секунд я бы форму даже не создавал

в общем призываю ещё раз пересмотреть желания
если вам нужны кастомные тормоза, то дело ваше. Выдеру пример у себя из кода

Прочитали?
Теперь ещё раз скажите нужно или нет
если не нужно то поудаляйте свои посты
если нужно оставьте. Заменю это сообщение на код

Fifth Intellect 19-08-2012 03:43 1972652

Цитата:

Цитата Johny777
а теперь подумайте
вот вы хотите вешать необдуманно рюшки которые - понты »

Мне тоже нравятся некоторые рюшечки, но в меру и если они несут в себе какую то полезность, ну, или необходимость, что то донести до пользователя, такой тюнинг действительно есть. Лично я выбираю "как можно больше дефолта+красоты+компактности+скорости загрузки и естесно + стабильности работы". Но вот то хочет Mafioza, именно то что показал товарищ Ivan_009 на скрине, лично я не представляю зачем такая пое**та вообще нужна. Это лишний код, лишний геморой, лишняя пустая трата времени. Полагаю это всего лишь понт. На мой взгляд в подобных штучках нет ничего что могло бы быть полезным. А так конечно это дело каждого, на вкус и цвет фломастеры разные ;).

Mafioza 19-08-2012 10:07 1972691

Fifth Intellect вообщето это не понт понятно некоторые инсталлы загружаются долго , мне нужен как ты говоришь этот геморой!

ChVL 19-08-2012 20:47 1972916

El Sanchez,
Ваш скрипт работает. Спасибо большое!
В чём смысл флага CSIDL_FLAG_CREATE? - Без него тоже работает.

El Sanchez 19-08-2012 22:19 1972970

Цитата:

Цитата ChVL
В чём смысл флага CSIDL_FLAG_CREATE? - Без него тоже работает. »

ChVL, у меня тоже. Флаг означает создать папку, если ее еще нет. В SHGetSpecialFolderPath, которую вы использовали, за это отвечает последний параметр, у вас он True. Эта функция устарела, поэтому я ее и заменил.

Johny777 20-08-2012 00:52 1973064

Цитата:

Цитата Mafioza
мне нужен »

держи
читать дальше »

Код:

[Setup]
AppName=Icon_Demo
AppVerName=Icon_Demo
DefaultDirName={pf}\Icon_Demo
Compression=none

[Files]
;DestName: "WizardForm.BitmapImage1.bmp"; Source: "Pics\Lambda_hand.bmp"; Flags: dontcopy solidbreak nocompression sortfilesbyextension
;DestName: "WizardForm.BitmapImage2.bmp"; Source: "Pics\D2_coast.bmp"; Flags: dontcopy solidbreak nocompression sortfilesbyextension
;DestName: "WizardForm.BitmapImage3.bmp"; Source: "Pics\GordonF.bmp"; Flags: dontcopy solidbreak nocompression sortfilesbyextension
;DestName: "WizardForm.BitmapImage4.bmp"; Source: "Pics\Borealis.bmp"; Flags: dontcopy solidbreak nocompression sortfilesbyextension
;DestName: "WizardForm.BitmapImage5.bmp"; Source: "Pics\portals.bmp"; Flags: dontcopy solidbreak nocompression sortfilesbyextension
;... итд

[  code]
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';

procedure InitializeWizard;////////////////////////////////////////////////////////////////////////////////////////// Initialize Wizard ////////////////////////////////////////////////////////////////////////////////////////////////
var
  Form: TSetupForm;
  LoadPrgsBar: TNewProgressBar;
  i: Integer;
begin
  Form := CreateCustomForm();
  with Form do
  begin
    ClientWidth := ScaleX(300);
    ClientHeight := ScaleY(271);
    BorderStyle := bsDialog;
    Caption := 'Загрузка';
    Left := GetSystemMetrics(16) - ClientWidth - ScaleX(16);
    Top := GetSystemMetrics(17) - ClientHeight - ScaleY(16);

    LoadPrgsBar := TNewProgressBar.Create(nil);
    with LoadPrgsBar do
    begin
      Parent := Form;
      SetBounds(ScaleX(0), ScaleY(0), ScaleX(300), ScaleY(27));
      Position := 0;
    end;

    Show;
    Repaint;
  end;

  /// пример распаковки изображений в цикле (называния картинок должны быть одинаковыми с разными номерами) = пример в секции файлов
//  with LoadPrgsBar do
//  begin
//    for i := 1 to 73 do
//    begin
//      ExtractTemporaryFile('WizardForm.BitmapImage' + IntToStr(i) + '.bmp');
//      Position := i;
//    end;
//  end;
 
    /// другой пример
//  ExtractTemporaryFile('warning_dark.bmp'); // извлекаем картинку
    LoadPrgsBar.Position := 1; // добавляем позицию
//  ExtractTemporaryFile('hl1.bmp');  /// извлекаеи ещё одну
    LoadPrgsBar.Position := 2; // добавляем позицию

    /// создаеём что-то
    LoadPrgsBar.Position := 3; // добавляем позицию



  Form.Free; /// писать в самом конце процедуры. Те освобождаем форму
end;


взял у себя из кода
правда без картинки
чисто функционал
нужна будет добавь таким макаром http://forum.oszone.net/post-1968497-631.html

ddv122 20-08-2012 13:55 1973324

Доброго дня, подскажите пожалуйста , если возле инсталлятора лежит к примеру файл 1.mp3, скопировать его в папку установки + под папки Music\\11\\
В итоге он после установки должен оказаться так к примеру С:\\1\\Music\\11\\1.mp3 но только если он имеется возле инсталлятора.

Johny777 20-08-2012 15:09 1973368

ddv122,
Код:

[Setup]
AppName=Icon_Demo
AppVerName=Icon_Demo
DefaultDirName={pf}\Icon_Demo
Compression=none

[Files]
Source: {src}\1.mp3; DestDir: {app}\Music\11; Flags: external skipifsourcedoesntexist

[Dirs]
Name: "{app}\Music\11"


MogilShik2007 20-08-2012 17:31 1973484

Всем привет!

Выложите скрипт двойного прогресс бара, нашел один, но чет смущает пункт SizeInfo.ini - чего это такое и откуда ее брать?

И такой вопрос на больших файлах пропадает моя иконка инсталлятора, это как то можно исправить?

Эээ, после запуска игры появляются такие значения в реестре:
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{EE4DEA71-3E59-432B-AF58-2B13E53D4F90}"; и т.д.
Root: HKLM; Subkey: "SOFTWARE\Classes\Record\{05266000-5465-3AA0-90F4-6FDD962F7F95}"; и т.д.

Где цифры выделены фиолетовым цветом, это можно как то прописать чтобы удалялось?

Johny777 20-08-2012 18:39 1973537

MogilShik2007,
сам хотел двойной прогрессбар
мне на руборде объяснили по научному - http://krinkels.org/showpost.php?p=8222&postcount=311
что это нереально или как-то так
давно забил (ну почти забил :) )

Ivan_009,
он о примере для не использующего исдан скрипта говорит
и в исдане вверху общее количество архивов
внизу текущий
те это не отображение конкретных файлов - мелких и больших!

MogilShik2007 20-08-2012 18:47 1973545

Johny777
Спасибо.

А что по поводу ключей реестра?

Вот кстати скрипт двойного прогресс бара:
Скрипт
#define SrcPath "Files\"
#define Mask "*.*"

#define FindHandle
#define FindResult
#define SearchPath SrcPath + Mask
#define AllFilesSize 0
#define CurFileSize 0

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy
#sub ProcessFoundFile
#define FileName FindGetFileName(FindHandle)
Source: {#SrcPath}{#FileName}; DestDir: {tmp}; Flags: ignoreversion; BeforeInstall: ProgressInit(); AfterInstall: ProgressReset()
#expr CurFileSize = FileSize(SrcPath + FileName)
#expr AllFilesSize = AllFilesSize + CurFileSize
#expr WriteIni( SourcePath + "\\SizeInfo.ini","Name", FileName, CurFileSize )
#expr WriteIni( SourcePath + "\\SizeInfo.ini","Size", "AllSize", AllFilesSize )
#endsub

#for {FindHandle = FindResult = FindFirst(SearchPath, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile

Source: SizeInfo.ini; Flags: dontcopy

[code]
type
TMsg = record
hwnd: HWnd;
msg: Word;
wParam: Word;
lParam: Word;
time: Longint;
pt: TPoint;
end;

TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
Msg: TMsg;
TimerID: LongWord;
ProgressBar: TNewProgressBar;
CurrentFileSize: LongInt;
OneStepSize: LongInt;
OldPosition: LongInt;
ReadyFlag: Boolean;
lbl, lbl1: TLabel;

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
function WrapTimerProc(callback: TProc; paramcount: Integer): Longword; external 'wrapcallback@files:innocallback.dll stdcall';

procedure ProgressInit();
begin
ProgressBar.Min:= 0;
ProgressBar.Position:= 0;
OldPosition:= WizardForm.ProgressGauge.Position;

ProgressBar.Max:= GetIniInt('Name', ExtractFileName(ExpandConstant(CurrentFileName)), 0, 0, 0, ExpandConstant('{tmp}\SizeInfo.ini'));

ReadyFlag:= True;
end;

procedure ProgressReset();
begin
ReadyFlag:= False;
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
res: LongWord;
begin
if ReadyFlag then
begin
ProgressBar.Position:= ProgressBar.Position + (WizardForm.ProgressGauge.Position - OldPosition) ;
OldPosition:= WizardForm.ProgressGauge.Position;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
pfunc: LongWord;
begin
if CurStep = ssInstall then
begin
pfunc:= WrapTimerProc(@OnTimer, 4);
TimerID:= SetTimer(0, 0, 20, pfunc);
end;
end;

procedure InitializeWizard();
begin
ReadyFlag:= False;
ExtractTemporaryFile('SizeInfo.ini');

ProgressBar := TNewProgressBar.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressBar.Left := Left;
ProgressBar.Top := Top + ScaleX(30);
ProgressBar.Width := Width;
ProgressBar.Height := Height;
ProgressBar.Parent := WizardForm.InstallingPage;
ProgressBar.Position := 0;
end;
end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;


Что за SizeInfo.ini и с чем его едят? )))

Ivan_009 20-08-2012 20:51 1973618

Как добавить в инсталлятор свой шрифт можно пример.... :sorry:

El Sanchez 20-08-2012 21:51 1973652

Цитата:

Цитата Ivan_009
Как добавить в инсталлятор свой шрифт можно пример.... »

Ivan_009, пример есть в шапке. В нем файл шрифта распаковывается во временную папку и подгружается оттуда. Для тех, кто использует расширенную версию Inno, возможен вариант с распаковкой шрифта в память, а не на диск. Вот пример:
Код:

#define Font "Rurintania.ttf"
#define FontName "Rurintania"

[Setup]
RawDataResource=font:{#Font}

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

function FindResource(hModule: THandle; lpName: String; lpType: Integer): THandle; external 'FindResource{#A}@kernel32.dll stdcall';
function LoadResource(hModule, hResInfo: THandle): THandle; external 'LoadResource@kernel32.dll stdcall';
function LockResource(hResData: THandle): Longint; external 'LockResource@kernel32.dll stdcall';
function SizeofResource(hModule, hResInfo: THandle): DWORD; external 'SizeofResource@kernel32.dll stdcall';
function AddFontMemResourceEx(pbFont: Longint; cbFont: DWORD; pdv: Longint; var pcFonts: DWORD): THandle; external 'AddFontMemResourceEx@gdi32.dll stdcall';
function RemoveFontMemResourceEx(fh: THandle): BOOL; external 'RemoveFontMemResourceEx@gdi32.dll stdcall';

const
    RT_RCDATA = 10;

var
    fh, hResInfo, hResAddr: THandle;
    pcFonts, iResSize: DWORD;

procedure InitializeWizard();
begin
    if not FontExists('{#FontName}') then
    begin
        hResInfo := FindResource(HInstance, '_IS_FONT', RT_RCDATA);
        iResSize := SizeofResource(HInstance, hResInfo);
        hResAddr := LockResource(LoadResource(HInstance, hResInfo));
        pcFonts := 1;
        fh := AddFontMemResourceEx(hResAddr, iResSize, 0, pcFonts);
    end;
    //отсюда начинаем указывать наш шрифт
    WizardForm.Font.Name := '{#FontName}';
end;

procedure DeinitializeSetup();
begin
    RemoveFontMemResourceEx(fh);
end;


Ivan_009 20-08-2012 22:14 1973661

El Sanchez, а в деинсталлятор как?

El Sanchez 21-08-2012 11:08 1973852

Цитата:

Цитата Ivan_009
El Sanchez, а в деинсталлятор как? »

Ivan_009, аналогично:
Код:

procedure InitializeUninstallProgressForm();
begin
    if not FontExists('{#FontName}') then
    begin
        hResInfo := FindResource(HInstance, '_IS_FONT', RT_RCDATA);
        iResSize := SizeofResource(HInstance, hResInfo);
        hResAddr := LockResource(LoadResource(HInstance, hResInfo));
        pcFonts := 1;
        fh := AddFontMemResourceEx(hResAddr, iResSize, 0, pcFonts);
    end;
    //
    UninstallProgressForm.Font.Name := '{#FontName}';
end;

procedure DeinitializeUninstall();
begin
    RemoveFontMemResourceEx(fh);
end;


Ivan_009 21-08-2012 16:53 1974057

При наложении текстур на кнопки эти процедуры нужны в IsDone скрипте или нет
WizardForm.CancelButton.Visible:=true;
WizardForm.CancelButton.Enabled:=false;
Подскажите заранее благодарю... :search:

alert30 21-08-2012 18:23 1974120

Ivan_009, ну так вроде отвечает на кнопочку "Отмены", потестируй.

Ivan_009 21-08-2012 23:05 1974311

Как добавить проценты удаления на деинсталлятор...Подскажите пожалуйста... :search:

apozlevich 22-08-2012 15:40 1974707

Всем доброго времени {суток}!
Появился вопрос: вот есть три файла с одинаковыми именами, как бы сделать так, что бы можно было выбрать, какой из них устанавливать? (Ооочень желательно еще и с выбором из командной строки).

R.i.m.s.k.y. 22-08-2012 15:47 1974715

apozlevich,
как-то так

Код:

[Components]
Name: f1; Description: File #1
Name: f2; Description: File #2
Name: f3; Description: File #3

[Files]
Components: f1; Source: Files\F1\File1, Destination: {app}
Components: f2; Source: Files\F2\File2, Destination: {app}
Components: f3; Source: Files\F3\File3, Destination: {app}

С комстрокой тебе чего именно нужно?

Respin 22-08-2012 16:44 1974765

Всем доброго времени суток.
Уважаемые программисты. Подскажите, пожалуйста, возможно ли через Inno подкачать недастающие файлы через интернет, не прибегая, к примеру "InnoTools Downloader "? Слышал про фунцию "Procedure url_download ", может кто знает как ей пользоватся? Через эту процедуру докачка файлов происходит во время устаноки и инсталлятор не переходит на другие странице чтобы скачать файлы.
Так же интерисует: Возможно ли запустить инсталлятор только при подключении к интернет? Если соединения нет, то и инсталлятор соответственно не запускается?
И самое важное: Возможно ли сделать запуск инсталлятора, только на определённой машине? Если sysuserinfoname не совпадает, то соответсвено: Result:= False
Спасибо за внимание.

alert30 22-08-2012 18:42 1974861

Цитата:

Цитата Respin
InnoTools Downloader »

Вы об этом?
http://www.sherlocksoftware.org/inno...ges/itd_ui.png

Johny777 22-08-2012 19:20 1974880

Цитата:

Цитата Ivan_009
Как добавить проценты удаления на деинсталлятор... »

читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs

[  code]
var
  UPercentsTimer: LongWord;
  UPercentsLabel: TLabel;
 
 
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
 


procedure UPercentsProc;
begin
  UPercentsLabel.Caption := IntToStr(UninstallProgressForm.ProgressBar.Position) + ' %';
end;

procedure DeinitializeUninstall();
begin
  KillTimer(0, UPercentsTimer);
end;

procedure InitializeUninstallProgressForm();
begin
  with UninstallProgressForm do
  begin
    OuterNotebook.Hide;
    ProgressBar.Parent := UninstallProgressForm;
    ProgressBar.Max := 100;

    UPercentsLabel:= TLabel.Create(nil);
    with UPercentsLabel do
    begin
      SetBounds(ProgressBar.Left + ScaleX(30),ProgressBar.Top + ProgressBar.Height + ScaleY(10), ProgressBar.Width, ProgressBar.Height);
      AutoSize:= True;
      Transparent := True;
      Parent:= UninstallProgressForm;
    end;
  end;
 
  UPercentsTimer:= SetTimer(UninstallProgressForm.Handle, 0, 10, CallbackAddr('UPercentsProc'));
end;



===============================================================================

Цитата:

Цитата apozlevich
Ооочень желательно еще и с выбором из командной строки »

для компонентов есть спец. ком. строка
в справке почитай

===============================================================================

Цитата:

Цитата Respin
возможно ли через Inno подкачать недастающие файлы через интернет, не прибегая, к примеру "InnoTools Downloader " »

эту тему почитай
в сообщении El Sanchez - а найдёшь!
Цитата:

Цитата Respin
Возможно ли запустить инсталлятор только при подключении к интернет? »

в шапке пример "IsInternetActive.iss"
впиши в него заместо процедуры InitializeWizard();
это:
читать дальше »
Код:

function InitializeSetup(): Boolean;
begin
  if IsInternetActive() then Result := True else
  begin
    MsgBox('Отсутствует соединение с интернетом. Бывай!', mbError, MB_OK);
    Result := False;
  end;     
end;


Ivan_009 22-08-2012 19:47 1974895

Johny777, Спасибо выручил... :up

apozlevich 22-08-2012 20:41 1974923

R.i.m.s.k.y., я Inno Setup изучал по скриптам из других инстоллеров, не знал про Components: :)
Про комстроку - в таком варианте можно будет указать, какой из компонентов ставить, и это хорошо :)

Respin 23-08-2012 11:19 1975273

Цитата:

Цитата alert30

Да, я именно это и имел в виду.

Johny777
Благодарю за инфу. Всё работает прекрасно.
Инсталлятор действительно не запускается без подключения к интернет, но всплывает окно о запросе подключения - это даже хорошо, но можно в него вписать свою надпись вместо: "Подключение коммутируемого соединения"?

По поводу скачивания файлов тоже всё прекрасно, только также есть один вопрос:
Можно ли обойтись без окна сохранить как? Просто нужно докачать недостающие файлы в {app} без запроса.

Johny777 23-08-2012 11:55 1975302

Цитата:

Цитата Respin
но всплывает окно о запросе подключения »

какое окно?
Цитата:

Цитата Respin
Можно ли обойтись без окна сохранить как? »

не знаю
код покажи! (код под тегами [more][code] твой код [/code][/more] )

Respin 23-08-2012 12:58 1975371

Цитата:

Цитата Johny777
какое окно? »

Запускается инсталлятор, проверяет нет ли интернет, интернета нет, появляется окно о запросе подключения. Только после отказа в подключении появляется сообщение, что интернета нет и на этом действие заканчивается. Соответсвенно, интернет есть - ничего не появляется, инсталлятор просто запускается.

По поводу окна о запросе сохранения файла:
Скрипт, как ты и сказал: в сообщении El Sanchez находится на этой странице (второй сверху). Может ты имел в виду другой код, но я нашёл только его.
читать дальше »
[code]
Код:

const
    INTERNET_OPEN_TYPE_PRECONFIG = 0;
    INTERNET_FLAG_NO_CACHE_WRITE = $4000000;
    INTERNET_FLAG_NEED_FILE = $10;
    INTERNET_FLAG_NO_AUTO_REDIRECT = $200000;
    HTTP_QUERY_LOCATION = 33;
    FILE_END = 2;
    INVALID_SET_FILE_POINTER = $FFFFFFFF;

var
    ProgressPage: TOutputProgressWizardPage;
    DownSpeedLabel, PercentLabel, PassedLabel, RemainLabel: TLabel;
    StartDownload: DWORD;
    FStream: TFileStream;
    fSize: DWORD;
    fName: String;
    Timer:  TTimer;
    LastSize, CurrentTimerEvent, LastTimerEvent: DWORD;
   

function InternetOpen(lpszAgent: String; dwAccessType: DWORD; lpszProxyName, lpszProxyBypass: String; dwFlags: DWORD): Integer; external 'InternetOpenA@wininet.dll stdcall';
function InternetOpenUrl(hInternet: Integer; lpszUrl, lpszHeaders: String; dwHeadersLength, dwFlags: DWORD; dwContext: DWORD_PTR): Integer; external 'InternetOpenUrlA@wininet.dll stdcall';
function InternetSetFilePointer(hFile: Integer; lDistanceToMove: Longint; lpDistanceToMoveHigh: Variant; dwMoveMethod, dwContext: DWORD): DWORD; external 'InternetSetFilePointer@wininet.dll stdcall';
function InternetReadFile(hFile: Integer; var lpBuffer: Char; dwNumberOfBytesToRead: DWORD; var lpdwNumberOfBytesRead: DWORD): BOOL; external 'InternetReadFile@wininet.dll stdcall';
function InternetQueryDataAvailable(hFile: Integer; var lpdwNumberOfBytesAvailable: DWORD; dwFlags: DWORD; dwContext: DWORD_PTR): Boolean; external 'InternetQueryDataAvailable@wininet.dll stdcall';
function InternetCloseHandle(hInternet: Integer): BOOL; external 'InternetCloseHandle@wininet.dll stdcall';
function DeleteUrlCacheEntry(lpszUrlName: String): BOOL; external 'DeleteUrlCacheEntryA@wininet.dll stdcall';
function HttpQueryInfo(hRequest: Integer; dwInfoLevel: DWORD; var lpvBuffer: Char; var lpdwBufferLength, lpdwIndex: DWORD): BOOL; external 'HttpQueryInfoA@wininet.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function StrFromTimeInterval(var pszOut: Char; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeIntervalA@shlwapi.dll stdcall';


////////////////////////////////////////////
function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;

function TicksToTime(Ticks: DWORD): String;
var
    i: Byte;
    arr: array [0..31] of Char;
begin
    for i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;

function RoundDword(dwValue: DWORD): DWORD;
begin
    dwValue := dwValue or (dwValue shr 1);
    dwValue := dwValue or (dwValue shr 2);
    dwValue := dwValue or (dwValue shr 4);
    dwValue := dwValue or (dwValue shr 8);
    dwValue := dwValue or (dwValue shr 16);
    Result := dwValue - (dwValue shr 1);
end;

procedure DownloadProgress(Sender: TObject);
begin
    try
        CurrentTimerEvent := GetTickCount;
        ProgressPage.SetText('Файл: '#9#9 + fName, 'Загружено: '#9 + BytesToSize(FStream.Size) + ' из ' + BytesToSize(fSize));
        PassedLabel.Caption := 'Прошло: '#9 + TicksToTime(CurrentTimerEvent-StartDownload);
        RemainLabel.Caption := 'Осталось: '#9 + TicksToTime(StrToInt(FormatFloat('0',(fSize-FStream.Size)*(CurrentTimerEvent-StartDownload)/FStream.Size)));
        with PercentLabel do
        begin
            Caption := FormatFloat('0.#0 %', (FStream.Size*100)/fSize);
            if Left <= (ProgressPage.ProgressBar.Width - Width) then
                Left := StrToInt(FormatFloat('0', FStream.Size*ProgressPage.ProgressBar.Width/fSize));
        end;
        if CurrentTimerEvent - LastTimerEvent >= 1000 then
        begin
            DownSpeedLabel.Caption := 'Скорость: '#9 + BytesToSize(FStream.Size-LastSize) + '/сек';
            LastTimerEvent := CurrentTimerEvent;
            LastSize := FStream.Size;
        end;
    finally
    end;
end;

procedure DownloadFile(urlFilename: String);
var
    i: SmallInt;
    lpBuffer: array of Char;
    lpdwNumberOfBytesRead, lpdwNumberOfBytesAvailable, lpdwBufferLength, lpdwIndex: DWORD;
    hInt, hRedir, hFile: Integer;
    fBuf: String;
begin
    try
        hInt := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, '', '', 0);
        if hInt <> 0 then
        try
            //Get file name and size
            hRedir := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE or INTERNET_FLAG_NO_AUTO_REDIRECT, 0);
            if hRedir = 0 then Exit;
            try
                SetArrayLength(lpBuffer, 1024);
                fSize := InternetSetFilePointer(hRedir, 0, NULL, FILE_END, 0);
                if fSize = INVALID_SET_FILE_POINTER then
                begin
                    lpdwBufferLength := GetArrayLength(lpBuffer);
                    lpdwIndex := 0;
                    HttpQueryInfo(hRedir, HTTP_QUERY_LOCATION, lpBuffer[0], lpdwBufferLength, lpdwIndex);
                    urlFilename := '';
                    for i := 0 to lpdwBufferLength-1 do urlFilename := urlFilename + lpBuffer[i];
                    hFile := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE, 0);
                    if hFile <> 0 then
                    try
                        fSize := InternetSetFilePointer(hFile, 0, NULL, FILE_END, 0);
                    finally
                        InternetCloseHandle(hFile);
                        DeleteUrlCacheEntry(urlFilename);
                    end;
                end;
            finally
                fName := ExtractFileName(urlFilename);
                InternetCloseHandle(hRedir);
                DeleteUrlCacheEntry(urlFilename);
            end;
            //
            hFile := InternetOpenUrl(hInt, urlFilename, '', 0, INTERNET_FLAG_NEED_FILE, 0);
            if hFile <> 0 then
            begin
                if GetSaveFileName('Сохранить как...', fName, '', '*' + ExtractFileExt(fName), ExtractFileExt(fName)) then
                try
                    DeleteFile(fName);
                    FStream := TFileStream.Create(fName, fmCreate);
                    ProgressPage.SetProgress(0, fSize);
                    ProgressPage.Show;
                    StartDownload := GetTickCount();
                    while (InternetQueryDataAvailable(hFile, lpdwNumberOfBytesAvailable, 0, 0) and (lpdwNumberOfBytesAvailable > 0)) do
                    begin
                        SetArrayLength(lpBuffer, RoundDword(lpdwNumberOfBytesAvailable));
                        InternetReadFile(hFile, lpBuffer[0], GetArrayLength(lpBuffer), lpdwNumberOfBytesRead);
                        ProgressPage.SetProgress(FStream.Size + lpdwNumberOfBytesRead, fSize);
                        fBuf := '';
                        for i := 0 to GetArrayLength(lpBuffer)-1 do fBuf := fBuf + lpBuffer[i];
                        FStream.WriteBuffer(fBuf, lpdwNumberOfBytesRead);
                        FStream.Seek(0, soFromEnd);
                        Timer.Enabled := FStream.Size <> fSize;
                    end;
                finally
                    FStream.Free;
                    ProgressPage.Hide;
                end;
            end;
        finally
            InternetCloseHandle(hFile);
            DeleteUrlCacheEntry(urlFilename);
        end;
    finally
        InternetCloseHandle(hInt);
    end;
end;

procedure CreateDownloadProgressPage;
begin
    ProgressPage := CreateOutputProgressPage('Загрузка файла', '');
    ProgressPage.ProgressBar.Top := ProgressPage.ProgressBar.Top + ProgressPage.ProgressBar.Height div 2;
    PercentLabel := TLabel.Create(WizardForm);
    with PercentLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := ProgressPage.ProgressBar.Top - Height - ScaleY(2);
        Transparent := True;
    end;
    DownSpeedLabel := TLabel.Create(WizardForm);
    with DownSpeedLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := ProgressPage.ProgressBar.Top + ScaleY(30);
        Transparent := True;
    end;
    PassedLabel := TLabel.Create(WizardForm);
    with PassedLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := DownSpeedLabel.Top + ScaleY(15);
        Transparent := True;
    end;
    RemainLabel := TLabel.Create(WizardForm);
    with RemainLabel do
    begin
        Parent := ProgressPage.Surface;
        Top := PassedLabel.Top + ScaleY(15);
        Transparent := True;
    end;
    Timer := TTimer.Create(WizardForm);
    with Timer do
    begin
        Interval := 100;
        OnTimer := @DownloadProgress;
        Enabled := False;
    end;
end;

//
procedure InitializeWizard();
begin
    CreateDownloadProgressPage;
end;
//

function NextButtonClick(CurPageID: Integer): Boolean;
begin
    if CurPageID = wpWelcome then
    begin
        DownloadFile('http://mse.dlservice.microsoft.com/download/7/6/0/760B9188-4468-4FAD-909E-4D16FE49AF47/ruRU/x86/mseinstall.exe');
        Result := True;
    end;
    Result := True;
end;



За открытие окна о сохранении отвечает строка:
читать дальше »
Код:

GetSaveFileName('Сохранить как...', fName, '', '*' + ExtractFileExt(fName), ExtractFileExt(fName))
И если её убрать, то файл сохраняется рядом с exe-ешником.

P.S. Стили окон меняются в зависимости от скина инсталлятора. Просто если в окне сохранения можно вписать "Сохранить как...", то в окне о подключении тоже как-то можно изменить надпись.

Ivan_009 24-08-2012 12:38 1976113

Помогите соеденить 2 скрипта чето неполучается... :sorry:

Ivan_009 24-08-2012 13:07 1976136

Johny777, В твоем примере почемуто до 100 процентов не доходит все время поразному то 93 то 85

Vista-w 24-08-2012 13:16 1976141

Подскажите пожалуйста как убрать два русских языка и списка? цель: оставить только русский и английский, если в строке [Languages] закомментить русский, то появляется ошибка, из за месседжей, которые написаны под версию языка.

Johny777 24-08-2012 13:19 1976146

Ваня, ты на код посмотри
UPercentsLabel.Caption := IntToStr(UninstallProgressForm.ProgressBar.Position) + ' %';
текст лейбла := переводим целое число в строковое(позиция прогресс бара деинсталятора) + ' %'
а теперь подумай проценты ли не доходят до 100% или твой прогрессбар?
к тому же в таймере эта функция с переводом числа обновляется каждые 10 милисекунд (в секунде 1000)
UPercentsTimer:= SetTimer(UninstallProgressForm.Handle, 0, 10, CallbackAddr('UPercentsProc'));
поставь одну если хочешь

Vista-w,
покажи всю секцию [Languages]

Ivan_009 24-08-2012 14:33 1976196

Johny777, Чтобы проценты равномерно шли и до 100 процентов... :biggrin:

Gnom_aka_Lexander 24-08-2012 14:40 1976202

Цитата:

Цитата Johny777
поставь одну если хочешь »

В любом случае, ввиду особенностей системы, практически невозможно использовать интервал менее 30-40 миллисекунд, соответственно минимальный интервал зависти уже от мощности компьютера. Отсюда и беда с процентами, когда
Цитата:

Цитата Ivan_009
почемуто до 100 процентов не доходит все время поразному то 93 то 85 »

Просто, когда прогрессбар приходит к концу, он попадает внутрь времени обновления и проценты не успевают обновиться.

Vista-w 25-08-2012 13:39 1976735

Johny777,
вот
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Languages\English.isl

Ivan_009 25-08-2012 14:17 1976757

Johny777, Как исправить вокруг кнопок обводку и при нажатии кнопки сьезжают вниз :(

Ivan_009 25-08-2012 16:45 1976825

Vista-w, так попробуй...
Name: russian; MessagesFile: compiler:Languages\Russian.isl
Name: english; MessagesFile: compiler:Languages\English.isl

alert30 25-08-2012 18:09 1976864

Vista-w, покажи код.

Vista-w 25-08-2012 18:25 1976874

...

Ivan_009 25-08-2012 18:29 1976876

Vista-w, у тебя 2 секции [Languages] убери одну... :yes:

Vista-w 25-08-2012 18:34 1976878

Ivan_009,
какой я не внимательный)) спс

Ivan_009 26-08-2012 20:42 1977380

Извиняюсь за тупой вопрос но если у меня компилятор ANSI в этой строке, что нужно поставить, чтобы не использовать...
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

Johny777 26-08-2012 20:45 1977382

Ivan_009,
если юникод то А - W
в противном случае (только ANSI) A - A

Raf-9600 27-08-2012 13:41 1977745

Ктонить может написать простенький скриптик, который в случае если выбран компонент "Game\Lokal" и нажата кнопка «Далее», проверял, существует ли ключ реестра "InstallPath" в ветке "HKLM\SOFTWARE\Blizzard Entertainment\Diablo II\" если ключ найден, то проверял по указанному в этом ключе реестра пути, существование файлов "Game.exe" и "d2data.mpq". Если всё найдено, то молча переходить на следующую страницу, если же файлы или ключ в реестре не найден, то выводить сообщение с кнопками «Да» и «Нет», на которые невозможно нажать в течение 10 секунд. По умолчанию выбрана кнопка «Да», и при нажатии на неё автоматически выбирался компонент "Game\Full" и осуществлялся автоматический переход на следующую страницу, если же нажать на «Нет» то осуществлялся переход на следующую страницу без дополнительных действий.

Johny777 27-08-2012 15:00 1977809

Raf-9600,

читать дальше »
Код:

[Setup]
AppName=My program
AppVerName=My program 1.5
DefaultDirName={pf}\My program
AppId=The_Best_AppId_Ever_Made

[Components]
Name: Game; Description: Game_Component;
Name: Game\Lokal; Description: Game_Local_Component; Flags: exclusive
Name: Game\Full; Description: Game_Full_Component; Flags: exclusive


[Files]
Source: Game.exe; DestDir: {app}
Source: d2data.mpq; DestDir: {app}


[code]
var
  Error_Form: TSetupForm;
  No_Clicked: boolean;

function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord; external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: LongWord; uPosition, uFlags: UINT): BOOL; external 'DeleteMenu@user32.dll stdcall';
function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLongA@user32.dll stdcall';
function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLongA@user32.dll stdcall';


procedure Error_Form_Button_OnClick(Sender: TObject);
begin
  case TButton(Sender).Caption of

    SetupMessage(msgButtonYes):
    begin
      with WizardForm do
      begin
        ComponentsList.Checked[2] := True;  /// где 2 - индекс компонета - 3-й по списку (отсчёт от 0)
        Enabled := True;
        NextButton.OnClick(nil);
      end;
    end;
   
    SetupMessage(msgButtonNo):
    begin
      with WizardForm do
      begin
        Enabled := True;
        No_Clicked := True;
        NextButton.OnClick(nil);
      end;
    end;
  end;
 
  Error_Form.Hide;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
var
  AppPath: String;
  Cycle: Integer;
  NO_Button, YES_Button: TButton;
begin
  Result := True;
  AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}'));

  if (CurPageID = wpSelectComponents) and  IsComponentSelected('Game\Lokal') then
  begin
    if not FileExists(AppPath + 'Game.exe') and not FileExists(AppPath + 'd2data.mpq') and not No_Clicked then
    begin
      Result := False;
      WizardForm.Enabled := False;
     
      Error_Form := CreateCustomForm;
      with Error_Form do
      begin
        Position := poScreenCenter;
        BorderStyle := bsDialog;
        ClientWidth := ScaleX(250);
        ClientHeight := ScaleY(100);
        Caption := SetupMessage(msgErrorTitle);
        Color := clBtnFace;
        DeleteMenu(GetSystemMenu(Error_Form.Handle,False), $F060,0); /// сделать кнопку "закрыть" неактивной
        SetClassLong(Error_Form.Handle, -26, GetClassLong(Error_Form.Handle, -26) or $200); /// блокировка комбинации alt + f4

        with TLabel.Create(nil) do
        begin
          SetBounds(ScaleX(15), ScaleY(10), ScaleX(290), ScaleY(30));
          AutoSize := False;
          Caption := 'будет выбран компнент Game_Full';
          WordWrap := True;
          Parent := Error_Form;
          Font.Size := 9;
        end;

        YES_Button := TButton.Create(nil)
        with YES_Button do
        begin
          Caption := SetupMessage(msgButtonYes);
          Parent := Error_Form;
          SetBounds(Error_Form.Width - ScaleX(90), ScaleY(65), ScaleX(71), ScaleY(25));
          Cursor := crHand;
          Enabled := False;
          OnClick := @Error_Form_Button_OnClick;
        end;

        NO_Button := TButton.Create(nil)
        with NO_Button do
        begin
          Caption := SetupMessage(msgButtonNo);
          Parent := Error_Form;
          SetBounds(Error_Form.Width - ScaleX(175), ScaleY(65), ScaleX(71), ScaleY(25));
          Cursor := crHand;
          Enabled := False;
          OnClick := @Error_Form_Button_OnClick;
        end;

        Application.Title := ' ' + SetupMessage(msgErrorTitle);

        Show;
        Repaint;
       
        Cycle := 10;
       
        repeat
          begin
            Sleep(1000);
            Cycle := Cycle - 1;
            Error_Form.Caption := IntToStr(Cycle) + ' Секунд';
          end;
        until (Cycle = 0)
       

        YES_Button.Enabled := True;
        NO_Button.Enabled := True;
      end;
       
    end;
  end;
end;

procedure InitializeWizard();
begin
  No_Clicked := False;
end;


Twoface 27-08-2012 16:00 1977856

Друзья помогите, кто нибудь прикрутите пожалуйста ISDone и если не сложно то сделайте кликабельное лого без фона.

Вот скрипт: http://rghost.ru/40017592

nik1967 27-08-2012 17:10 1977907

Raf-9600, Johny777,
А так не проще?
Код:

[Setup]
AppName=My program
AppVerName=My program 1.5
DefaultDirName={pf}\My program

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: Game; Description: Game_Component;
Name: Game\Lokal; Description: Game_Local_Component; Flags: exclusive; Types: full;
Name: Game\Full; Description: Game_Full_Component; Flags: exclusive;

[Files]
Source: Game.exe; DestDir: {app};
Source: d2data.mpq; DestDir: {app};

[Registry]
Root: HKLM; Subkey: "SOFTWARE\Blizzard Entertainment"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Blizzard Entertainment\Diablo II"; ValueName: "InstallPath"; ValueType: String; ValueData: "{app}\"; Flags: uninsdeletekey

[_Code]
function NextButtonClick(CurPageID: Integer): Boolean;
var
  AppPath: String;
begin
  Result:= true;
  AppPath:= RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Blizzard Entertainment\Diablo II\,InstallPath|}'));
if (CurPageID = wpSelectComponents) and  IsComponentSelected('Game\Lokal') then
if not FileExists(AppPath + 'Game.exe') and not FileExists(AppPath + 'd2data.mpq') then
if MsgBoxEx(0, 'Не найдены Game.exe и d2data.mpq'+#13#10+'Установить Game_Full_Component?', 'Проблема', MB_YESNO or MB_ICONQUESTION, 0, 10) = IDYES then
  WizardForm.ComponentsList.Checked[2]:= True  /// где 2 - индекс компонета - 3-й по списку (отсчёт от 0)
else
  WizardForm.ComponentsList.Checked[1]:= True; /// где 1 - индекс компонета - 2-й по списку (отсчёт от 0)
end;


Raf-9600 27-08-2012 17:21 1977916

nik1967, Если бы можно было сделать чтобы возможность нажать на Да\Нет появлялась только через 10 секунд, тогда было бы в самом деле лучше.

Johny777, Благодарю

alert30 27-08-2012 17:24 1977919

Twoface, не умеешь сам?

Twoface 27-08-2012 17:28 1977920

Цитата:

Цитата alert30
alert30 »

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

alert30 27-08-2012 17:42 1977930

Twoface, не пользовался Inno Setup Joiner?

Twoface 27-08-2012 18:20 1977943

Цитата:

Цитата alert30
Inno Setup Joiner »

Нет. Делал всё руками.

Raf-9600 27-08-2012 18:37 1977950

А можно ли программно изменить путь установки? Ну в смысле сменить содержимое {app}?

alert30 27-08-2012 18:40 1977953

Twoface, руками так же как бы правильно пользуюся, вот только сколько дублей выдает; тем самым и выдает ошибку. Попробуй эту утилиту, и отпишись результаты.

Twoface 27-08-2012 18:51 1977961

Цитата:

Цитата alert30
alert30 »

Прости, а как ею вообще пользоваться, вернее сказать как её запустить то, там просто .EXE файл.

Ivan_009 27-08-2012 19:03 1977967

Twoface, так

Twoface 27-08-2012 19:24 1977981

Цитата:

Цитата Ivan_009
Ivan_009 Ivan_009 сейчас на форуме »

Не могу не через командную строчку не через Експловер запустить.

Ivan_009 27-08-2012 19:43 1977992

Twoface, Для начала установи InnoUltra
http://innoultra.ru/?p=1

Twoface 27-08-2012 19:49 1977996

Цитата:

Цитата Ivan_009
Ivan_009 »

Готово. Теперь что нужно сделать, научи пожалуйста.

Ivan_009 27-08-2012 19:56 1978000

Twoface,
После чего, в проводнике выделяем подготовленные скрипты, и в контекстном меню выбираем Join Scripts.
И все :drug:

alert30 27-08-2012 20:31 1978021

Twoface, кажись, первый: из твоего проекта (iss-файл) выделяем все коды в секции [code] и копипастим, создаем отдельный iss, вставляемую (из копипаста) код Паскаля из секции [code], сохраняем. Второй: создаем 2-ой отдельный файл, из скачанного набора скрипта IsDone, и делаем то же самое, что и первое (копипастим и вставлем), сохраняем. Выделять две созданные проекты (iss-файлы), затем ПКМ -> Join scripts.

Не могу уже повторять, я реально написал, как это сделать.

Twoface 27-08-2012 20:44 1978032

Цитата:

Цитата alert30
alert30 »

Это я уже всё понял, я просто не могу запустить Join. Уже голова опухла, я первый раз, так что за слишком тупого не принимайте)))))))))

Ivan_009 27-08-2012 21:11 1978048

Twoface, Щас прикручу IsDone подожди немного... :yes:

Twoface 27-08-2012 21:17 1978052

Цитата:

Цитата Ivan_009
Ivan_009 »

Спасибо большое при большое!

Ivan_009 27-08-2012 21:35 1978065

Twoface, Лови скрипт в папку include положишь сами файлы IsDone....
Также исправил ошибку при выходе из инсталлятора была ошибка...
Таймеры забыли наверное... :happy:

Ivan_009 28-08-2012 11:17 1978382

У кого есть пример создания чекбоксов через ботву поделитесь пожалуйста...В самих примерах ботвы не нашол... :(

Gnom_aka_Lexander 28-08-2012 12:12 1978412

Ivan_009, btnCreate

Twoface 28-08-2012 14:25 1978490

Маленькая проблемка, прикрутил музыку через BASS_Module отдельно, ошибки не какой нет но и втот же момент не кнопки ВКЛ и ВКЛ а также музыка не начинает самостоятельно играть, посмотрите скрипт пожалуйста.

http://rghost.ru/40050819

Ivan_009 28-08-2012 15:19 1978524

Как скрыть данную кнопку....

Twoface 28-08-2012 15:31 1978533

Ivan_009,

Вот нарыл что-то: Мож один из вариантов тебе подойдёт.

1)
[code]
Procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then
begin
If WizardForm.FindComponent('DirBrowseButton') is TButton
then
TButton(WizardForm.FindComponent('DirBrowseButton' )).Hide;
end;
end;

2)
Procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.DirBrowseButton.hide //wpSelectDir
WizardForm.GroupBrowseButton.hide //wpSelectProgramGroup
end;

3)
procedure InitializeWizard();
begin
WizardForm.DirBrowseButton.hide;
end;

Ivan_009 28-08-2012 15:36 1978538

Twoface, Вот держи в папку BASS_Files добавь Music.mp3...

vint56 28-08-2012 16:08 1978555

Ivan_009 у тебя пример на ботве

procedure HideComponents;
begin
BtnSetVisibility(hDirBrowseBtn, false); // мы скрываем кнопку
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
HideComponents;
if CurPageID = wpSelectDir then // это где именно на станице выбор папки установки
begin
BtnSetVisibility(hDirBrowseBtn, true); // здесь мы показываем
end;
end;

Twoface 28-08-2012 16:15 1978561

Ivan_009,

Ошибка теперь выходит:

Twoface 28-08-2012 16:58 1978595

Ivan_009,

Спасибо за то что постарался помочь, век помнить буду. Всё, я сам сделал, правда голова чуть не лопнула но сделал.

Ivan_009 28-08-2012 19:25 1978692

как на финишной странице передвинуть текструированную кнопку через ботву.... :sorry:

nik1967 28-08-2012 19:38 1978699

Ivan_009,
в botva2.iss
Код:

function BtnCreate(hParent :HWND; Left, Top, Width, Height :integer; FileName :PAnsiChar; ShadowWidth :integer; IsCheckBtn :boolean) :HWND; external 'BtnCreate@{tmp}\botva2.dll stdcall delayload';
//hParent          - хэндл окна-родителя, на котором будет создана кнопка
//Left,Top,
//Width,Height      - без комментариев. то же что и для обычных кнопок
//FileName          - файл с изображением состояний кнопки
//                    для обычной кнопки нужно 4 состояния кнопки (соответственно 4 изображения)
//                    для кнопки с IsCheckBtn=True нужно 8 изображений (как для чекбокса)
//                    изображения состояний должны располагаться вертикально
//ShadowWidth      - кол-во пикселей от края рисунка кнопки, до реальной ее границы на рисунке.
//                    нужно чтобы состояние кнопки и курсор на ней менялись как положено
//IsCheckBtn        - если True, то будет создана кнопка (аналог CheckBox) имеющая включенное и выключенное состояние
//                    если False, то создастся обычная кнопка
//возвращаемое значение - хэндл созданной кнопки

или так
procedure BtnSetPosition(h:HWND; NewLeft, NewTop, NewWidth, NewHeight: integer);  external 'BtnSetPosition@{tmp}\botva2.dll stdcall delayload';
//устанавливает координаты левого верхнего угла и размер кнопки
//h                  - хэндл кнопки (результат возвращенный BtnCreate)
//NewLeft, NewTop    - новые координаты верхнего левого угла (в координатах родительского окна)
//NewWidth, NewHeight - новые ширина, высота кнопки


Пример
Код:

Procedure CurPageChanged(CurPageID: Integer);
Begin
case CurPageID of
  wpFinished:
    begin
      BtnSetPosition(hNextBtn, ScaleX(320),ScaleY(400),ScaleX(90),ScaleY(90));
  end;
 end;
end;


Ivan_009 28-08-2012 22:28 1978823

Как сделать деинсталлятор через ботву. Дело в том что инстал я сделал а как деинсталлятор не знаю... :(

MogilShik2007 29-08-2012 02:09 1978940

Повторюсь, так как не услышал ответа)))

После запуска игры появляются такие значения в реестре:
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{EE4DEA71-3E59-432B-AF58-2B13E53D4F90}"; и т.д.
Root: HKLM; Subkey: "SOFTWARE\Classes\Record\{05266000-5465-3AA0-90F4-6FDD962F7F95}"; и т.д.

Где цифры со скобками выделены фиолетовым цветом, это можно как то прописать чтобы удалялось?
ЗЫ. Если вручную прописывать эти ключи, то инсталлер ругается на скобы и не хочет делать сборку)))

L1nk3R 29-08-2012 08:12 1978999

Привет.
MogilShik2007, да легко.

читать дальше »
Код:

[Registry]
Root: HKLM; Subkey: SOFTWARE\Classes\CLSID\{{EE4DEA71-3E59-432B-AF58-2B13E53D4F90}; Flags: uninsdeletekey dontcreatekey
Root: HKLM; Subkey: SOFTWARE\Classes\Record\{{05266000-5465-3AA0-90F4-6FDD962F7F95}; Flags: uninsdeletekey dontcreatekey


Ivan_009 29-08-2012 13:23 1979172

Как текструировать DirEdit и GroupEdit через ботву....Заранее спасибо.

Johny777 29-08-2012 16:17 1979284

Цитата:

Цитата Ivan_009
Как текструировать DirEdit и GroupEdit через ботву »

нафиг тебе
сделай так

with WizardForm.DirEdit do
begin
BorderStyle := bsNone;
Color := clBtnFace;
end;

чтоб эдит сливался с окном (не было границ)
и картинку наложи

vint56 29-08-2012 16:38 1979300

Ivan_009, вот пример
читать дальше »
[Setup]
AppName=«Company of Heroes. Anthology»
AppVersion=1.5
DefaultDirName={pf}\Company of Heroes. Anthology
DefaultGroupName=Company of Heroes. Anthology


[Files]
Source: Files\botva2.dll; DestDir: {tmp}; Flags: dontcopy;
Source: Files\b2p.dll; DestDir: {tmp}; Flags: dontcopy;
Source: Files\Edit.png; DestDir: {tmp}; Flags: dontcopy;

[Icons]
Name: "{group}\«Company of Heroes. Anthology»"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,«Company of Heroes. Anthology»}"; Filename: "{uninstallexe}"

[code]
var
Edit,GroupEdit: Longint;
DirEditLabel, GroupEditLabel: TLabel;

#include "Modules\botva2.iss"

function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
Result:=True;
end;

procedure DirChange(Sender: TObject);
begin
DirEditLabel.Caption:=MinimizePathName(WizardForm.DirEdit.Text, DirEditLabel.Font, DirEditLabel.Width);
end;

procedure GroupChange(Sender: TObject);
begin
GroupEditLabel.Caption := MinimizePathName(WizardForm.GroupEdit.Text, GroupEditLabel.Font, GroupEditLabel.Width);
end;

procedure InitializeWizard;
begin
Edit:=ImgLoad(WizardForm.SelectDirPage.Handle,ExpandConstant('{tmp}\Edit.png'),ScaleX(0), ScaleY(81),ScaleX(332),ScaleY(22),True,True);
GroupEdit:=ImgLoad(WizardForm.SelectProgramGroupPage.Handle,ExpandConstant('{tmp}\Edit.png'),ScaleX( 0), ScaleY(81),ScaleX(332),ScaleY(22),True,True);
ImgApplyChanges(WizardForm.SelectDirPage.Handle);
ImgApplyChanges(WizardForm.SelectProgramGroupPage.Handle);

DirEditLabel := TLabel.Create(WizardForm);
with DirEditLabel do begin
AutoSize:=False;
SetBounds(ScaleX(5), ScaleY(85), ScaleX(446), ScaleY(15));
WordWrap:= True;
ShowAccelChar := False;
Transparent:=True;
Font.Name:= 'Arial'
Font.Size:= 9;
Font.Color:=$000000;
Font.Style:=[fsBold];
Caption := MinimizePathName(WizardForm.DirEdit.Text, DirEditLabel.Font, DirEditLabel.Width);
Parent := WizardForm.SelectDirPage;
end;

GroupEditLabel := TLabel.Create(WizardForm);
with GroupEditLabel do begin
AutoSize:=False;
SetBounds(ScaleX(5), ScaleY(85), ScaleX(446), ScaleY(15));
WordWrap:= True;
ShowAccelChar := False;
Transparent:=True;
Font.Name:= 'Arial'
Font.Size:= 9;
Font.Color:=$000000;
Font.Style:=[fsBold];
Caption := MinimizePathName(WizardForm.GroupEdit.Text, GroupEditLabel.Font, GroupEditLabel.Width);
Parent := WizardForm.SelectProgramGroupPage;
end;
WizardForm.DirEdit.OnChange := @DirChange;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text;
WizardForm.GroupEdit.OnChange := @GroupChange;
end;

procedure HideComponents;
begin
WizardForm.DirEdit.Hide;
WizardForm.GroupEdit.Hide;
DirEditLabel.Hide;
GroupEditLabel.Hide;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
HideComponents;
case CurPageID of
wpSelectDir:
begin
DirEditLabel.Show;
end;
wpSelectProgramGroup:
GroupEditLabel.Show;
end;
end;

procedure DeinitializeSetup();
begin
gdipShutdown;
end;

MogilShik2007 29-08-2012 19:40 1979425

Привет, подскажите скрипт и что за .dll использовались на скринах:


И если можно поподробнее)))

alert30 29-08-2012 20:06 1979442

MogilShik2007, набери в Google "ISDone" и ищи! Тысеача раз уже спросили!

Ivan_009 29-08-2012 21:14 1979476

Цитата:

Цитата MogilShik2007
Привет, подскажите скрипт и что за .dll использовались на скринах: »

Лови

Johny777 30-08-2012 11:09 1979722

El Sanchez,
можно пожалуйста пример загрузки скина из оперативки (тогда его не нужно копировать в директорию установки а оттуда в темп для деинсталятора и загрузка должна быть быстрее)?

и скажи можно ли пихать библиотеки в RawDataResource (если да то с примером пожалуйста для например той же ISSkin.dll)?
так не работает - procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@RawDataResource:skin stdcall setuponly';

в Example_RawDataResource.iss немного не то тк файл извлекается в конечном итоге в темп и грузится оттуда

al1511 30-08-2012 13:38 1979846

Здравствуйте!
Я использую Stormlib.dll для упаковки игровых архивов.
У меня не получается использовать Callback с помощью функции SFileSetAddFileCallback.
Вот описание функции: http://www.zezula.net/en/mpq/stormli...ecallback.html

Вылетает ошибка:
"Access violation at address xxxxxxxx. Write of address xxxxxxxx

Дебаггер указывает на SFileSetAddFileCallback (phMPQ, @AddFileCallback, 0);

Очень надеюсь на помощь, заранее спасибо!

Вот мой код:

Код:

var
phMPQ: THandle;

type
  TCallback = function (pvUserData: Integer; dwBytesWritten:DWORD; dwTotalBytes: DWORD; bFinalCall: BOOL): PAnsiChar;

function SFileSetAddFileCallback(phMPQ: THandle; pfnAddFileCB: TCallback ; pvUserData: Integer): BOOL; external 'SFileSetAddFileCallback@files:StormLib.dll stdcall';


// Функция, которая должна вызываться dll-кой
function AddFileCallback (pvUserData: Integer; dwBytesWritten:DWORD; dwTotalBytes: DWORD; bFinalCall: BOOL): PAnsiChar;
begin

end;


//
procedure CurStepChanged(CurStep: TSetupStep);
begin
SFileSetAddFileCallback (phMPQ, @AddFileCallback, 0);
end;


MogilShik2007 30-08-2012 17:10 1979989

Цитата:

Цитата alert30
MogilShik2007, набери в Google "ISDone" и ищи! Тысеача раз уже спросили! »

Мне нужен конкретный скрипт, как на скринах, а не сидеть и подбирать из нескольких десятков найденных в нете...

alert30 30-08-2012 17:47 1980016

MogilShik2007, http://freearc.org/ru/InnoSetup.aspx

El Sanchez 30-08-2012 18:50 1980047

Цитата:

Цитата Johny777
можно пожалуйста пример загрузки скина из оперативки (тогда его не нужно копировать в директорию установки а оттуда в темп для деинсталятора и загрузка должна быть быстрее)?
и скажи можно ли пихать библиотеки в RawDataResource (если да то с примером пожалуйста для например той же ISSkin.dll)? »

Этот геморрой не стоит свеч.

Цитата:

Цитата al1511
Я использую Stormlib.dll для упаковки игровых архивов.
У меня не получается использовать Callback с помощью функции SFileSetAddFileCallback. »

al1511,
Код:

var
  phMPQ: THandle;

function SFileSetAddFileCallback(hMpq: THandle; pfnAddFileCB, pvUserData: Longint): BOOL; external 'SFileSetAddFileCallback@files:stormlib.dll stdcall';

procedure AddFileCallback(pvUserData: Longint; dwBytesWritten, dwTotalBytes: DWORD; bFinalCall: BOOL);
begin
    //
end;

//
procedure CurStepChanged(CurStep: TSetupStep);
begin
    SFileSetAddFileCallback (phMPQ, CallbackAddr('AddFileCallback'), 0);
end;


Gnom_aka_Lexander 30-08-2012 19:14 1980062

Цитата:

Цитата El Sanchez
Этот геморрой не стоит свеч. »

там немного другое, инно этого точно не умеет. попытки были - модификации своего исполняемого файла инно также не поддерживает. Да и загрузку длл из Stream инно тоже не может. посему, только RawDataResource и только предварительная распаковка на диск. Хотя, никто не запрещает плагин, который будет за инно грузить нужные функции из длл прямо из памяти, куда эту длл можно кинуть из ресурсов. У Инно, все-таки, великолепная расширяемость плагинами, плюс есть простые и понятные примеры в папке Inno Setup 5\Examples\MyDll

Ivan_009 30-08-2012 19:24 1980066

Как на b2p сделать деинсталлятор как инсталлятор или это надо делать на botva2 подскажите пожалуйста...
На b2p не получается... :(

Gnom_aka_Lexander 30-08-2012 19:30 1980073

Ivan_009, никак. тоесть, можно, конечно - загнать графику в те-же RawDataResource и переписать модуль для b2p. Могу занятся, если время будет. но скорей всего в ближайшее время его не будет - мне на сборку-то мою, и то пришлось соавтора приглашать...
P.S. И да, b2p - это всего лишь воспомогательный плагин для botva2, который подает botva2 картинки из памяти, не более, сами картинки грузит из botva2.

JIeBaH 30-08-2012 20:30 1980097

Здравствуйте.
В общем, есть игра, которую можно модифицировать поместив в нужную папку файлы. Так вот, мне нужно создать инсталлятор, который распакует в папку указанную пользователем нужные файлы и папки. НО! Есть одна самая главная проблема, нужно чтобы при установке был выбор компонентов установки. Например, некие два файла это "Мод_1" следующие 3 файла "Мод_2" и нужно что бы пользователь ставил галочки, что ему нужно, а, что нет. Так вот, как это реализовать.
Заранее спасибо.

Gnom_aka_Lexander 30-08-2012 20:47 1980110

Справка. Секция [Files] и ее связь с секцией [Components]
Приер из инсталлятора InnoUltra:

читать дальше »
Код:

[Components]
Name: std;  Description: {cm:Comp2Label};  Flags: exclusive; Types: custom compact full;
Name: std\a; Description: {cm:CompANLabel}; Flags: exclusive; Types: custom compact full;
Name: std\u; Description: {cm:CompULabel};  Flags: exclusive; Types: custom compact;
[Files]
Source: ANSI\ISCC.exe; DestDir: {app}; Components: std\a
Source: ANSI\ISCmplr.dll; DestDir: {app}; Components: std\a
Source: ANSI\ISPP.dll; DestDir: {app}; Components: std\a
Source: ANSI\Setup.e32; DestDir: {app}; Components: std\a
Source: ANSI\SetupLdr.e32; DestDir: {app}; Components: std\a

Source: ANSI\Compil32.exe;    DestName: Compil32.exe; DestDir: {app}; Components: std\a;
Source: UNICODE\Compil32.exe; DestName: Compil32.exe; DestDir: {app}; Components: std\u;

Source: UNICODE\ISCC.exe; DestDir: {app};    Components: std\u
Source: UNICODE\ISCmplr.dll; DestDir: {app};  Components: std\u
Source: UNICODE\ISPP.dll; DestDir: {app};    Components: std\u
Source: UNICODE\Setup.e32; DestDir: {app};    Components: std\u
Source: UNICODE\SetupLdr.e32; DestDir: {app}; Components: std\u


HElmo 30-08-2012 22:02 1980155

Gnom_aka_Lexander, извиняюсь, это мне ответ? Если нет то простите, если да, то что с этим делать и как использовать? Заранее спасибо.

Gnom_aka_Lexander 30-08-2012 22:11 1980161

Цитата:

Цитата HElmo
извиняюсь, это мне ответ? »

Ага.
Цитата:

Цитата HElmo
то что с этим делать и как использовать? »

Использовать. Имена и надписи компонентов меняшь на свои, файлы тоже.

HElmo 30-08-2012 22:20 1980167

Gnom_aka_Lexander, а в какое место это вставлять в скрипте и где что менять, а то вдруг что-то не то изменю. Прочтите за надоедливость, первый раз с этим столкнулся. Заранее спасибо!

Gnom_aka_Lexander 30-08-2012 22:23 1980169

Ооо... Как можно первый раз столкнуться с тем, с чего обычно начинают? Почитайте справку на ночь - очень просветляет.

HElmo 30-08-2012 22:28 1980175

Gnom_aka_Lexander,
Англоязычная версия..,пожалуйста, просто изучать конкретно нет времени, пожалуйста. Что с этим кодом делать. Заранее спасибо.

Ivan_009 30-08-2012 22:38 1980184

Цитата:

Цитата HElmo
Англоязычная версия..,пожалуйста, просто изучать конкретно нет времени, пожалуйста. Что с этим кодом делать. Заранее спасибо. »

Для начала прочти это...http://rusfolder.com/20364329

Gnom_aka_Lexander 30-08-2012 22:41 1980185

Шапка, форума, первая строчка
Цитата:

Цитата El Sanchez
Показать/скрыть: Справка, руководство, примеры: »

Первая ссылка
Цитата:

Цитата El Sanchez
Русская справка в формате .chm к версии 5.4.3, авторы перевода BagIra, bugron; »

Ну почему никто никогда не начинает изучение нового предмета с изучения шапок тематических форумов?

Ivan_009 30-08-2012 23:30 1980199

Как сделать такой прогресс бар, чтобы на первом этапе извлекались сами файлы инсталлятора а на втором шла распаковка архивов IsDone... :sorry: Все перепробовал нехочет обьеденятся прогрессбар ssInstall и ssPostInstall, заранее спасибо...

Johny777 31-08-2012 00:18 1980212

Вань,
я исдан не знаю, но сильно сомневаюсь что это один прогрессбар
думаю товарищъ-автор инсталла скрин которого ты предоставил просто укоротил верхний прогрессбар и разместил его на том же уровне что и второй и слева от него
я уверен что поделённого на 2 части прогрессбара нет, если только ты его сам не создаёшь (пусть програмисты меня не пинают. Только-только начал паскаль изучать)

HElmo 31-08-2012 00:36 1980216

Gnom_aka_Lexander, Ivan_009, Огромное спасибо, с компонентами разобрался, получилось!!!Ура ура!Правда с 17 раза :(.
Теперь есть ещё одна задача, все файлы допустим устанавливаются в директорию: D:\Games\game\mods\version1 как указал пользователь, затем программа выходит две папки назад, попадает в папку: D:\Games\game и в нее распаковывает ещё одну папку с файлами, а после нажатия готово открывает ее. Вроде понятно описал, возможно ли это реализовать? Я так понял это как-то в секции Tasks пишется..Заранее спасибо...

SatHan 31-08-2012 03:49 1980251

Всем привет. У меня короче проблема при отмене/закрытии инстала. При сборке инсталятора через инно инсталятор запускается а дальше когда я например запускаю отмену то инсталятор долго не завершается не смотря на то что он в процессах не висит но ясно видно что загрузка процессора скачет из за него подскажите пожалуйста как сделать чтоб при отмене инсталятор быстро завершался?

Gnom_aka_Lexander 31-08-2012 07:00 1980278

SatHan, Скрипт покажи.
HElmo, Можно. Покажи структуру папок, как должно быть.

HElmo 31-08-2012 09:32 1980321

Gnom_aka_Lexander,
Вот весь код
читать дальше »
Код:

#define MyAppName "MODSHELMO"
#define MyAppVersion "2.0"
#define MyAppPublisher "HELMO"
 #define MyAppURL "HELMO"

[Setup]
AppId={{A4520E20-B884-4B0A-992C-07FC5D307AF2}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=C:\Users\Admin\Desktop
OutputBaseFilename=HELMO MODS
SetupIconFile=D:\Загрузки\World-of-Tanks.ico
Compression=lzma
SolidCompression=yes
Uninstallable=no

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

[Files]
Source: "C:\Users\Admin\Desktop\Jova\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs



Путь установки: D:\GAMES\World of tanks\World_of_tanks\res_mods\0.7.5, затем должно вернутся в папку World_of_tanks(не World of tanks) и туда распаковать папку из следующей дирректории: D:\GAMES\Mods, под названием Options и открыть ее. Но если пользователь выбрал другой путь, например С:\World_of_tanks\res_mods\0.7.5, тоже должно вернуться две папки назад в World_of_tanks . Заранее спасибо за помощь.

alert30 31-08-2012 09:32 1980322

SatHan, я так понял Вы сегодня зарегистрировались на форум, для начала для "новичков" нужен скрипт, который Вы используете...

al1511 31-08-2012 10:17 1980351

El Sanchez, в этом коде компилятор не устраивает тип CallbackAddr('AddFileCallback').
(Type mismatch)
Хотя если написать любой адрес ручную, то компилируется... Как тут быть?

Код:

var
  phMPQ: THandle;

function SFileSetAddFileCallback(hMpq: THandle; pfnAddFileCB, pvUserData: Longint): BOOL; external 'SFileSetAddFileCallback@files:stormlib.dll stdcall';

procedure AddFileCallback(pvUserData: Longint; dwBytesWritten, dwTotalBytes: DWORD; bFinalCall: BOOL);
begin
    //
end;

//
procedure CurStepChanged(CurStep: TSetupStep);
begin
    SFileSetAddFileCallback (phMPQ, CallbackAddr('AddFileCallback'), 0);
end;


SatHan 31-08-2012 10:21 1980356

Gnom_aka_Lexander, скрипт простой

читать дальше »
Код:

[Setup]
AppName=Моя программа
AppVersion=1.5
;AppVerName=Моя программа 1.5
AppPublisher=Моя компания, Inc.
AppPublisherURL=http://www.сайт.com/
AppSupportURL=http://www.сайт.com/
AppUpdatesURL=http://www.сайт.com/
DefaultDirName={pf}\Моя программа
DefaultGroupName=Моя программа
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

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

[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion

[Icons]
Name: "{group}\Моя программа"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,Моя программа}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Моя программа"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon


El Sanchez 31-08-2012 11:19 1980389

Цитата:

Цитата al1511
в этом коде компилятор не устраивает тип CallbackAddr('AddFileCallback'). »

al1511, код-то хоть полностью скопировали?

Gnom_aka_Lexander 31-08-2012 11:31 1980400

Цитата:

Цитата HElmo
DefaultDirName={pf} »

Никогда так не делай. При неаккуратных действиях, при деинсталляции можно сильно повредить папку програм файлс.
Мой совет - делаешь папку по умолчанию - DefaultDirName={pf}\GAMES\World of tanks\ или лучше даже {sd}\GAMES\World of tanks\, тогда при деинсталляции будет удалена только это папка.
далее раскладываешь структуру перед упаковкой, как нужно и прописываешь ее подробно в секции [Files].
Цитата:

Цитата HElmo
[Files] Source: "C:\Users\Admin\Desktop\Jova\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs »

Так, конечно, удобно. но очень неудобно в работе. воспользуйся Inno Script Studio от Kymoto Solutions там очень удобно работать с секциями скрипта и привязывать отдельные файлы к компонентам.

SatHan 31-08-2012 12:34 1980449

Цитата:

Цитата alert30
нужен скрипт, который Вы используете... »

скрипт выше только что это даст что я его выложил?

Цитата:

Цитата SatHan
скрипт простой »

и вот его (инсталятор) нужно быстро завершить.
Сами попробуйте запустить простой скомпилированый инсталятор инно зайдите в диспетчер задач во вкладку дополнительно и завершите инсталятор и сами всё увидите что несмотря на то что инсталятор не висит в процессах а загрузка процессора на две три секунды поднимается.

задался вопрос как через секцию run перезагрузить компьютер?

Johny777 31-08-2012 13:25 1980483

Цитата:

Цитата SatHan
как через секцию run перезагрузить компьютер? »

[Run]
Filename: shutdown.exe; Parameters: /r /t 10; Flags: runhidden

R.i.m.s.k.y. 31-08-2012 13:39 1980495

Johny777 SatHan, и если открыты окна в ворде человек карму погнет тебе :)

Код:

[Run]
Filename: shutdown.exe; Parameters: /r /t 10; Description: Перегрузить компьютер; Flags: postinstall


Twoface 31-08-2012 14:11 1980516

У меня проблема не большая с Splash. Сперва появляется окно выбора языка инстолятора, затем сам контур инсталятора в чёрном цвете и на нём появляется сам Splash, потом когда Splash исчезает то на инсталяторе появляется приветствие и т.д. Добавлял скрипт Splash в другие инсталяторы и такой проблемы я там не наблюдал. Люди добрые, помогите.

Вот чем я пользуюсь, через подключения модуля:

читать дальше »
[code]
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

procedure Splash();
begin
ExtractTemporaryFile('splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\splash.png',1000,3000,1000,0,255,False, $FFFFFF,10);
end;

al1511 31-08-2012 14:20 1980527

Цитата:

Цитата El Sanchez
код-то хоть полностью скопировали? »

Полностью.

Я так понимаю в Inno Setup вообще проблема с указателями ))

El Sanchez 31-08-2012 15:07 1980575

Цитата:

Цитата al1511
Полностью. »

al1511, код покажите.
Цитата:

Цитата al1511
Я так понимаю в Inno Setup вообще проблема с указателями )) »

al1511, не реализованы, но это не проблема.

Ivan_009 31-08-2012 15:39 1980601

Twoface, Код полностью с модулями в студию... :drug:

Twoface 31-08-2012 16:21 1980647

Ivan_009,
Отправил в ЛС.

SatHan 31-08-2012 17:54 1980706

Johny777, R.i.m.s.k.y., Спасибо.
R.i.m.s.k.y., да это было не важно что из окон открыто. Главное было параметры shutdown в инно узнать.
просто я прописывал перезагрузку как указала команда shutdown help
[Run]
Filename: shutdown.exe; Parameters: -r -t 5; Flags: runhidden nowait postinstall unchecked
что в конечном счете у меня перезагрузка не происходила. а оказалось что в инно параметры задаются совсем другим способом.

а так для надежности есть более радикальный и удобный способ. например
читать дальше »
Код:

[#Code]
var
Res : integer;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then
begin
if MsgBox('Перезагрузить компьютер?',mbconfirmation, mb_yesno) = IDYES then
begin
Exec('shutdown.exe ', ' /r /t 5', ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilIdle, Res);
end;
end;
end;


R.i.m.s.k.y. 31-08-2012 17:55 1980708

SatHan, есть глобальная функция NeedRestart - почитай про нее

al1511 31-08-2012 21:20 1980820

El Sanchez, в том варианте, который вы предложили, при компиляции пишет type mismatch
Вот код:

Код:

var
  phMPQ: THandle;

function SFileSetAddFileCallback(hMpq: THandle; pfnAddFileCB, pvUserData: Longint): BOOL; external 'SFileSetAddFileCallback@files:stormlib.dll stdcall';

procedure AddFileCallback(pvUserData: Longint; dwBytesWritten, dwTotalBytes: DWORD; bFinalCall: BOOL);
begin
    //
end;

//
procedure CurStepChanged(CurStep: TSetupStep);
begin
    SFileSetAddFileCallback (phMPQ, @AddFileCallback, 0);
end;


А вот так пробовал я. В этом случае компилируется, но выходит ошибка в инсталляторе
"Exeption: Accsess violation at adress xxxxxxxx. Write of address xxxxxxxx


Код:

var
  phMPQ: THandle;

type
  TCallback = procedure (pvUserData: Integer; dwBytesWritten, dwTotalBytes: DWORD; bFinalCall: BOOL);

function SFileSetAddFileCallback(hMpq: THandle; pfnAddFileCB: TCallback; pvUserData: Integer): BOOL; external 'SFileSetAddFileCallback@files:stormlib.dll stdcall';

procedure AddFileCallback(pvUserData: Integer; dwBytesWritten, dwTotalBytes: DWORD; bFinalCall: BOOL);
begin
    //
end;

//
Procedure CurPageChanged(CurPageID: Integer);
begin
 
    SFileSetAddFileCallback (phMPQ, @AddFileCallback, 0);
end;


SatHan 01-09-2012 07:04 1980971

Цитата:

Цитата SatHan
подскажите пожалуйста как сделать чтоб при отмене инсталятор быстро завершался? »

может как можно (выгрузкой Unload или таймерами KillTimer) завершить? в помощи почитал но ничего не понял совсем что там нада делать.

при принудительном завершении setup.tmp и setup.exe всё равно нагрузка идёт, в %temp% обнаружил папки *..tmp. в одной из них есть ещё папка _isetup в ней два файла _RegDLL.tmp и _shfoldr.dll может из за них идёт нагрузка. мож на них нада какую процедуру повесить?

El Sanchez 01-09-2012 12:20 1981048

Цитата:

Цитата al1511
El Sanchez, в том варианте, который вы предложили, при компиляции пишет type mismatch
Вот код: »

Цитата:

Цитата al1511
SFileSetAddFileCallback (phMPQ, @AddFileCallback, 0); »

al1511, ну и где я это предлагал? Я написал:
Код:

SFileSetAddFileCallback(phMPQ, CallbackAddr('AddFileCallback'), 0);
CallbackAddr - функция из расширенной китайской версии Inno, возвращающая указатель на callback-функцию AddFileCallback. Если у вас оригинальная версия, то для работы с callback-функциями понадобится сторонняя библиотека innocallback.dll

al1511 02-09-2012 18:23 1981673

Цитата:

Цитата El Sanchez
CallbackAddr - функция из расширенной китайской версии Inno, »

Я не знал, что это функция из расширенной версии. Спасибо

al1511 03-09-2012 10:31 1982026

Callback работает, но теперь возникла другая проблема )) Во время упаковки файлов в архив окно Inno Setup зависает (как будто ждёт завершения выполнения dll) и отвисает только тогда, когда заканчивается добавление файлов в архив... Информация в окне во время добавления файлов не меняется, и окошко даже нельзя двигать...
Помогите, пожалуйста, разобраться!

spice 03-09-2012 11:14 1982042

Вложений: 1
Народ помогите новичку! слепил скрипт из is game script generator и решил вставить скин из isskins при компиляции выдает такую ошибку, что не так сделал?

Код:

[Setup]
SourceDir=.
OutputDir=Setup
AppName=GTA San Andreas
AppVerName=GTA San Andreas
AppVersion=GTA San Andreas
AppPublisher=Îëåã Ãèíèÿòîâ
AppCopyright=Îëåã Ãèíèÿòîâ
AppPublisherURL=SpiCeMaN@spaces.ru
AppSupportURL=SpiCeMaN@spaces.ru
AppUpdatesURL=SpiCeMaN@spaces.ru
DefaultDirName={pf}\GTA San Andreas
DefaultGroupName=GTA San Andreas
AllowNoIcons=yes
OutputBaseFilename=setup
WizardImageFile=C:\Users\Vadim\Desktop\ISS\GTA-San-Andreas.bmp
WizardSmallImageFile=C:\Users\Vadim\Desktop\ISS\grand_theft_auto_san_andreas_icon_v2_1_by_kamizanon-d4tuvym.bmp
SetupIconFile=C:\Users\Vadim\Desktop\ISS\grand_theft_auto_san_andreas_icon_v2_1_by_kamizanon-d4tuvym.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/normal
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1
LicenseFile=license.txt

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

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

[Files]
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "bass.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "C:\Users\Vadim\Desktop\ISS\GTA_San_Andreas-GTA_San_Andreas.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\Vadim\Desktop\ISS\ISSkin.dll; DestDir: {tmp}; Flags: dontcopy
Source: C:\Users\Vadim\Desktop\ISS\tiger.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: "C:\GAMES\GTA San Andreas\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Icons]
Name: "{group}\GTA San Andreas"; Filename: "{app}\gta_sa.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\GTA San Andreas"; Filename: "{app}\gta_sa.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\{cm:UninstallProgram,GTA San Andreas}"; Filename: "{uninstallexe}"

[Run]
Description: "{cm:LaunchProgram, GTA San Andreas}"; Filename: "{app}\gta_sa.exe"; WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent unchecked

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

[сode]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('aqualux.cjstyles');
LoadSkin(ExpandConstant('{tmp}\aqualux.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
UnloadSkin();
end;



const
  Indent=10;
  dURL=2;

var
  URLLabel,URLLabelShadow:TLabel;

procedure ShowMP3Panel(hMainFrm:HWND;StartVolume:integer;DefMP3Dir,BASSDir,MLabel:PChar;IsShowMP3Info,IsBkgFrmVisible:boolean;ShowTimeMP3Info:integer;dBottom:integer);external 'ShowMP3Panel@files:isgsg.dll stdcall';
procedure KillMP3Panel;external 'KillMP3Panel@files:isgsg.dll stdcall';

procedure URLLabelClick(Sender: TObject);
var
  ErrorCode:integer;
begin
  ShellExec('open','SpiCeMaN@spaces.ru','','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
end;

procedure URLLabelMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
  URLLabel.Top:=URLLabel.Top+dURL;
  URLLabel.Left:=URLLabel.Left+dURL;
  URLLabel.Font.Style:=URLLabel.Font.Style+[fsUnderline];
  URLLabel.Font.Color:=clBlue;
  URLLabelShadow.Visible:=False;
end;

procedure URLLabelMouseUp(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
  URLLabel.Top:=URLLabel.Top-dURL;
  URLLabel.Left:=URLLabel.Left-dURL;
  URLLabel.Font.Style:=URLLabel.Font.Style-[fsUnderline];
  URLLabel.Font.Color:=clMaroon;
  URLLabelShadow.Visible:=True;
end;

function InitializeSetup:boolean;
begin
  ExtractTemporaryFile('GTA_San_Andreas-GTA_San_Andreas.mp3');
  ExtractTemporaryFile('bass.dll');
  Result:=True;
end;

procedure InitializeWizard;
begin
  URLLabelShadow:=TLabel.Create(WizardForm);
  with URLLabelShadow do begin
    Top:=ScaleY(331);
    Left:=ScaleX(25);
    Caption:='SpiCeMaN@spaces.ru';
    AutoSize:=True;
    Parent:=WizardForm;
    Transparent:=True;
    Font.Color:=$969696;
    Font.Size:=9;
    Font.Style:=Font.Style+[fsBold];
  end;
  URLLabel:=TLabel.Create(WizardForm);
  with URLLabel do begin
    Top:=ScaleY(331)-dURL;
    Left:=ScaleX(25)-dURL;
    Caption:='SpiCeMaN@spaces.ru';
    AutoSize:=True;
    Parent:=WizardForm;
    Cursor:=crHand;
    Transparent:=True;
    Font.Color:=clMaroon;
    Font.Size:=9;
    Font.Style:=Font.Style+[fsBold];
    BringToFront;
    OnClick:=@URLLabelClick;
    OnMouseDown:=@URLLabelMouseDown;
    OnMouseUp:=@URLLabelMouseUp;
  end;
  ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'www.csmania.ru',False,False,0,Indent);
end;

procedure DeinitializeSetup;
begin
  KillMP3Panel;
end;


Habetdin 03-09-2012 11:59 1982064

spice, в секции [code] дублируются одинаковые функции/процедуры InitializeSetup и DeinitializeSetup. Fixed version, вроде должно работать :gigi:, только секция [code]:
Код:

procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

const
  Indent=10;
  dURL=2;

var
  URLLabel,URLLabelShadow:TLabel;

procedure ShowMP3Panel(hMainFrm:HWND;StartVolume:integer;DefMP3Dir,BASSDir,MLabel:PChar;IsShowMP3Info,IsBkgFrmVisible:boolean;ShowTimeMP3Info:integer;dBottom:integer);external 'ShowMP3Panel@files:isgsg.dll stdcall';
procedure KillMP3Panel;external 'KillMP3Panel@files:isgsg.dll stdcall';

procedure URLLabelClick(Sender: TObject);
var
  ErrorCode:integer;
begin
  ShellExec('open','http://spaces.ru/mysite/?name=SpiCeMaN','','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
end;

procedure URLLabelMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
  URLLabel.Top:=URLLabel.Top+dURL;
  URLLabel.Left:=URLLabel.Left+dURL;
  URLLabel.Font.Style:=URLLabel.Font.Style+[fsUnderline];
  URLLabel.Font.Color:=clBlue;
  URLLabelShadow.Visible:=False;
end;

procedure URLLabelMouseUp(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
  URLLabel.Top:=URLLabel.Top-dURL;
  URLLabel.Left:=URLLabel.Left-dURL;
  URLLabel.Font.Style:=URLLabel.Font.Style-[fsUnderline];
  URLLabel.Font.Color:=clMaroon;
  URLLabelShadow.Visible:=True;
end;

function InitializeSetup:boolean;
begin
  ExtractTemporaryFile('GTA_San_Andreas-GTA_San_Andreas.mp3');
  ExtractTemporaryFile('bass.dll');
  ExtractTemporaryFile('aqualux.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\aqualux.cjstyles'), '');
  Result:=True;
end;

procedure InitializeWizard;
begin
  URLLabelShadow:=TLabel.Create(WizardForm);
  with URLLabelShadow do begin
    Top:=ScaleY(331);
    Left:=ScaleX(25);
    Caption:='SpiCeMaN@spaces.ru';
    AutoSize:=True;
    Parent:=WizardForm;
    Transparent:=True;
    Font.Color:=$969696;
    Font.Size:=9;
    Font.Style:=Font.Style+[fsBold];
  end;
  URLLabel:=TLabel.Create(WizardForm);
  with URLLabel do begin
    Top:=ScaleY(331)-dURL;
    Left:=ScaleX(25)-dURL;
    Caption:='SpiCeMaN@spaces.ru';
    AutoSize:=True;
    Parent:=WizardForm;
    Cursor:=crHand;
    Transparent:=True;
    Font.Color:=clMaroon;
    Font.Size:=9;
    Font.Style:=Font.Style+[fsBold];
    BringToFront;
    OnClick:=@URLLabelClick;
    OnMouseDown:=@URLLabelMouseDown;
    OnMouseUp:=@URLLabelMouseUp;
  end;
  ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'www.csmania.ru',False,False,0,Indent);
end;

procedure DeinitializeSetup;
begin
  UnloadSkin();
  KillMP3Panel;
end;


spice 03-09-2012 12:04 1982071

я не понял что ты изменил, но все равно спасибо за помощь!

помогло!

Habetdin 03-09-2012 12:22 1982081

Цитата:

Цитата spice
что ты изменил »

читать дальше »
Например:
Код:

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('aqualux.cjstyles');
LoadSkin(ExpandConstant('{tmp}\aqualux.cjstyles'), '');
Result := True;
end;
...
function InitializeSetup:boolean;
begin
  ExtractTemporaryFile('GTA_San_Andreas-GTA_San_Andreas.mp3');
  ExtractTemporaryFile('bass.dll');
  Result:=True;
end;

Стало:
Код:

function InitializeSetup:boolean;
begin
  ExtractTemporaryFile('GTA_San_Andreas-GTA_San_Andreas.mp3');
  ExtractTemporaryFile('bass.dll');
  ExtractTemporaryFile('aqualux.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\aqualux.cjstyles'), '');
  Result:=True;
end;


P.S.: ISSJoiner из шапки должен помочь в будущем ;)

spice 03-09-2012 12:29 1982088

у меня все эти программы дополнения для inno setup есть но я ими не пользуюсь(не умею) у меня inno ultra.

как ISSJoiner пользоваться не подскажешь?

Gnom_aka_Lexander 03-09-2012 12:44 1982099

Цитата:

Цитата spice
как ISSJoiner пользоваться не подскажешь? »

Небольшое руководство по ипользованию утилиты ISS Joiner.
специально для тех, кто не любит читать, набросал.

spice 03-09-2012 12:58 1982104

Спасибо большое! теперь я разобрался!

spice 03-09-2012 17:30 1982259

Вложений: 1
народ помогите плиз! объединил 3 скрипта вроде все правильно сделал, но при компиляции такая ошибка

spice 03-09-2012 17:30 1982262

что это значит?

вот скрипт
Код:

; Ñêðèïò ñîçäàí ÷åðåç Ìàñòåð Inno Setup Script.
; ÈÑÏÎËÜÇÓÉÒÅ ÄÎÊÓÌÅÍÒÀÖÈÞ ÄËß ÏÎÄÐÎÁÍÎÑÒÅÉ ÈÑÏÎËÜÇÎÂÀÍÈß INNO SETUP!

[Setup]
; Ïðèìå÷àíèå: Çíà÷åíèå AppId èäåíòèôèöèðóåò ýòî ïðèëîæåíèå.
; Íå èñïîëüçóéòå îäíî è òîæå çíà÷åíèå â ðàçíûõ óñòàíîâêàõ.
; (Äëÿ ãåíåðàöèè çíà÷åíèÿ GUID, íàæìèòå Èíñòðóìåíòû | Ãåíåðàöèÿ GUID.)
AppId={{401CE660-D285-4327-AE2C-3CFB06643CC9}
AppName=ôîòî
AppVersion=1.5
;AppVerName=ôîòî 1.5
AppPublisher=Ìîÿ êîìïàíèÿ, Inc.
AppPublisherURL=http://www.ñàéò.com/
AppSupportURL=http://www.ñàéò.com/
AppUpdatesURL=http://www.ñàéò.com/
DefaultDirName={pf}\ôîòî
DefaultGroupName=ôîòî
OutputDir=C:\Users\Vadim\Desktop\ISS
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[Name]
Name: russian; Name: compiler:Name\Russian.isl



[CustomMessages]
russian.hour= ÷àñîâ
russian.min= ìèí
russian.sec= ñåê




[Files]
Source: C:\Users\Vadim\Desktop\ISS\ôîòî\innocallback.dll; Flags: dontcopy
Source: C:\Users\Vadim\Desktop\ôîòî\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; Ïðèìå÷àíèå: Íå èñïîëüçóéòå "Flags: ignoreversion" äëÿ ñèñòåìíûõ ôàéëîâ
Source: C:\Users\Vadim\Desktop\ISS\ôîòî\ISSkin.dll; DestDir: {tmp}; Flags: dontcopy
Source: C:\Users\Vadim\Desktop\ISS\ôîòî\aqualux.cjstyles; DestDir: {tmp}; Flags: dontcopy




[c0de]
type
PDisplay_Device = record
cb: DWord;
DeviceName: array [0..31] of char;
DeviceString: array [0..127] of char;
StateFlags: DWord;
DeviceID, DeviceKey: array [0..127] of char;
end;

TMixerCaps = record
vPid, vDriverVersion: DWord;
sName: array [0..31] of char;
Support, cDestinations: DWord;
end;

// Ïðîâåðêà âåðñèè Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
{Win9x}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
{WinNT}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
oneMB = 1024*1024;
NeedMHz = 1800;
NeedVideoRAM = 128;
NeedSoundCard = 'Creative X-Fi';
NeedMB = 512;
NeedPageFile = 1024;

var
InfoPage: TWizardPage;
TopText, BottomText: TNewStaticText;
ChangeText: Boolean;
SystemPanel, ProcessorPanel, VideoPanel,
AudioPanel, RAMPanel, PageFilePanel: TMemo;
SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
lpCaps: TMixerCaps;
Version: TWindowsVersion;
MemoryEx: TMemoryStatusEx;
n, errCode: Integer;
Keys: TArrayOfString;
DeviceValue: Cardinal;
lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
external 'GetSystemMetrics@user32.dll stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
external 'GetDeviceCaps@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
external 'CreateDCA@GDI32 stdcall';

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
external 'EnumDisplayDevicesA@user32.dll stdcall';

function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
external 'mixerGetDevCapsA@winmm.dll stdcall';

function mixerGetNumDevs: Integer;
external 'mixerGetNumDevs@winmm.dll stdcall';

// Äîïîëíèòü ÷èñëî äî êðàòíîãî Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
Result := (Bytes/Multiple + 1)*Multiple
else
Result := Bytes
end;

// Ïåðåâîä ÷èñëà â çíà÷åíèå Áò/Êá/Ìá/Ãá/Òá (äî 3õ çíàêîâ ïîñëå çàïÿòîé)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
if not noMB then
Result := FloatToStr(Int(Bytes)) + ' Ìá'
else
if Bytes < 1024 then
Result := FloatToStr(Int(Bytes)) + ' Áò'
else
if Bytes/1024 < 1024 then
Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Êá'
else
if Bytes/oneMB < 1024 then
Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Ìá'
else
if Bytes/oneMB/1000 < 1024 then
Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Ãá'
else
Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Òá'
StringChange(Result, ',', '.')
end;

// Óäàëåíèå íà÷àëüíûõ, êîíå÷íûõ è ïîâòîðíûõ ïðîáåëîâ
function DelSp(String: String): String;
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1)
Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2
for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

function CheckCPU(NeedMHz: Integer): Boolean;
var
String: String;
begin
String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys) // Êîëè÷åñòâî ÿäåð
for n := 0 to GetArrayLength(Keys)-1 do
RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
Exit
else
Result := True
end;

function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
MemoryEx.dwLength := SizeOf(MemoryEx)
if not GlobalMemoryStatusEx(MemoryEx) then
MsgBox('Îøèáêà ôóíêöèè:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
else
if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
Exit
else
Result := True
end;

procedure CreateCheckForm();
begin

TopText := TNewStaticText.Create(InfoPage)
with TopText do
begin
Parent := InfoPage.Surface
Left := 0
AutoSize := True
end

BottomText := TNewStaticText.Create(InfoPage)
with BottomText do
begin
Parent := InfoPage.Surface
Caption := 'Êîãäà Âû áóäåòå ãîòîâû ïðîäîëæèòü óñòàíîâêó, íàæìèòå «Äàëåå».'
Font.Color := clBlack
Left := 0
Top := 200
AutoSize := True
end

SystemPanel := TMemo.Create(InfoPage)
with SystemPanel do
begin
Text := 'Ñèñòåìà'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ScaleY(33)
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

SystemVersionPanel := TMemo.Create(InfoPage)
with SystemVersionPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := SystemPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

ProcessorPanel := TMemo.Create(InfoPage)
with ProcessorPanel do
begin
Text := 'Ïðîöåññîð'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := SystemPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

ProcessorMHzPanel := TMemo.Create(InfoPage)
with ProcessorMHzPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := ProcessorPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

VideoPanel := TMemo.Create(InfoPage)
with VideoPanel do
begin
Text := 'Âèäåîàäàïòåð'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ProcessorPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

VideoRAMPanel := TMemo.Create(InfoPage)
with VideoRAMPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := VideoPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

AudioPanel := TMemo.Create(InfoPage)
with AudioPanel do
begin
Text := 'Çâóêîâàÿ êàðòà'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := VideoPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

AudioNamePanel := TMemo.Create(InfoPage)
with AudioNamePanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := AudioPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

RAMPanel := TMemo.Create(InfoPage)
with RAMPanel do
begin
Text := 'Îáú¸ì ïàìÿòè'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := AudioPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

RAMTotalPanel := TMemo.Create(InfoPage)
with RAMTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := RAMPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

PageFilePanel := TMemo.Create(InfoPage)
with PageFilePanel do
begin
Text := 'Ôàéë ïîäêà÷êè'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := RAMPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;

PageFileTotalPanel := TMemo.Create(InfoPage)
with PageFileTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := PageFilePanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

end;

procedure UpdateInfo();
var
DeviceName, DeviceKey: String;
begin
ChangeText := False

GetWindowsVersionEx(Version)

// Îïåðàöèîííàÿ ñèñòåìà:
SystemVersionPanel.Color := $CCFFCC

DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
DeviceName := DeviceName + ' ' + DeviceKey
StringChange(DeviceName, 'Microsoft ', '')
SystemVersionPanel.Text := ' ' + DeviceName + ' ñáîðêà ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
'.' + IntToStr(Version.Build)

if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and // Windows 2000 SP4
(Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and // Windows XP SP2
(Pos('Vista', SystemVersionPanel.Text) = 0) and // Windows Vista (c ëþáûì SP èëè áåç íåãî)
(Pos('Windows 7', SystemVersionPanel.Text) = 0) then
begin
SystemVersionPanel.Color := $CCCCFF
ChangeText := True
end

// Ïðîöåññîð:
ProcessorMHzPanel.Color := $CCFFCC

if not CheckCPU(NeedMHz) then
begin
ProcessorMHzPanel.Color := $CCCCFF
ChangeText := True
end

ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
if GetArrayLength(Keys) > 1 then
ProcessorPanel.Text := 'Ïðîöåññîðû' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

// Âèäåîêàðòà:
VideoRAMPanel.Color := $CCFFCC

lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
DeviceKey := ''
n := 0
while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
(lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127) // Êëþ÷ äðàéâåðà ïîëó÷àåì èç API
StringChange(DeviceKey, '\Registry\Machine\', '')
errCode := 1
DeviceValue := 0
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
for n := 1 to Length(DeviceName) do
begin
DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
errCode := errCode*$100
end
else
if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
else
RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
DeviceName := ''
for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

if DeviceName <> '' then
if DeviceValue > 0 then
VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
else
VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
else
begin
VideoRAMPanel.Text := ' Äðàéâåð óñòðîéñòâà íå îáíàðóæåí'
VideoRAMPanel.Color := $CCCCFF
ChangeText := True
end
if (DeviceValue/oneMB < NeedVideoRAM) then
begin
VideoRAMPanel.Color := $CCCCFF
ChangeText := True
end
VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

// Çâóêîâàÿ êàðòà:
AudioNamePanel.Color := $CCFFCC

// for errCode := 0 to 1 do // Âûâîä îñíîâíîãî çâóêîâîãî óñòðîéñòâà
for errCode := 0 to mixerGetNumDevs do
begin
mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
DeviceName := ' '
for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
Delete(DeviceName, Pos(' [', DeviceName), 31)
StringChange(DeviceName, 'SB ', 'Creative ')
Delete(DeviceName, Pos(' Audio', DeviceName), 31)
SetArrayLength(Keys, errCode)
if errCode > 0 then Keys[errCode-1] := DeviceName
end

if GetArrayLength(Keys) > 1 then
begin
AudioPanel.Text := 'Çâóêîâûå êàðòû'
// AudioPanel.Text := 'Çâóêîâûå êàðòû (' + IntToStr(GetArrayLength(Keys)) +')'
AudioNamePanel.Text := ''
for n := 1 to GetArrayLength(Keys) do
AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1] // + '(' + IntToStr(n) + ')'
end
else
if GetArrayLength(Keys) = 0 then
begin
AudioNamePanel.Text := ' Äðàéâåð óñòðîéñòâà íå îáíàðóæåí'
AudioNamePanel.Color := $CCCCFF
ChangeText := True
end
else
AudioNamePanel.Text := Keys[0]
if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
AudioNamePanel.Text := AudioNamePanel.Text + ' (ðåêîìåíäóåòñÿ ' + NeedSoundCard + ')'

// Îáú¸ì ïàìÿòè:
RAMTotalPanel.Color := $CCFFCC
if not CheckMemorySize(NeedMB) then
begin
RAMTotalPanel.Color := $CCCCFF
ChangeText := True
end
RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' âñåãî, ' +
ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' èñïîëüçóåòñÿ, ' +
ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' ñâîáîäíî'

// Âèðòóàëüíàÿ ïàìÿòü:
PageFileTotalPanel.Color := $CCFFCC
PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' âñåãî, ' +
ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' çàíÿòî ñèñòåìíûì êýøåì'
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
begin
PageFileTotalPanel.Color := $CCCCFF
ChangeText := True
end

if ChangeText = True then
begin
TopText.Top := 0
TopText.Caption := 'Íå âñå êîìïîíåíòû óäîâëåòâîðÿþò ìèíèìàëüíûì òðåáîâàíèÿì èãðû.' #13
'Ïîæàëóéñòà, ïðîâåðüòå ïîçèöèè, âûäåëåííûå êðàñíûì öâåòîì.'
TopText.Font.Color := clRed
// WizardForm.NextButton.Enabled := False
end
else
begin
TopText.Caption := 'Âñå êîìïîíåíòû ñîîòâåòñòâóþò ìèíèìàëüíûì òðåáîâàíèÿì èãðû.'
TopText.Font.Color := clGreen
TopText.Top := 8
// WizardForm.NextButton.Enabled := True
end
end;

procedure InitializeWizard1();
begin
InfoPage := CreateCustomPage(wpLicense, 'Àïïàðàòíîå è ïðîãðàììíîå îáåñïå÷åíèå',
'Ïðîãðàììà óñòàíîâêè îáíàðóæèëà ñëåäóþùèå íàîáõîäèìûå êîìïîíåíòû.')
CreateCheckForm() // Ñîçäàíèå îáúåêòîâ TMemo, â êîòîðûõ áóäåò âûâîäèòñÿ èíôîðìàöèÿ î ñèñòåìå
UpdateInfo() // Îáíîâëåíèå èíôîðìàöèè î ñèñòåìå
end;

procedure CurPageChanged1(CurPageID: Integer);
begin
if CurPageID = InfoPage.ID then UpdateInfo() // Îáíîâëåíèå èíôîðìàöèè î ñèñòåìå
end;

// --- Source: 2.iss ------------------------------------------------------------
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
PercentsTimer: LongWord;
PercentsLabel: TLabel;

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption:= 'Âûïîëíåíî ' + NumToStr((Position*100)/Max) + ' %';
end;
End;

procedure DeinitializeSetup2();
begin
KillTimer(0, PercentsTimer);
end;

procedure InitializeWizard2();
begin
PercentsLabel:= TLabel.Create(WizardForm);
with PercentsLabel do
begin
Left:= WizardForm.ProgressGauge.Left;
Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Parent:= WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged2(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
end;
end;

// --- Source: 3.iss ------------------------------------------------------------
 type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
StartInstall: Integer;
TimeLabel: TLabel;
TimerID: Longword;

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

Function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;

Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail then            {hh: mm:ss format}
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000 then    {more than hour}
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000 then    {1..60 minutes}
        Result:= IntToStr(Ticks/60000) +m+' '+ IntToStr(Ticks/1000 - Ticks/1000/60*60) +s
    else Result:= Format('%.1n', [Abs(Ticks/1000)]) +s    {less than one minute}
End;

procedure GetTime(HandleW, Msg, idEvent, TimeSys: LongWord);
var Remaining: Integer;
begin
with WizardForm.ProgressGauge do begin
  if position > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((max - position)/position))
    TimeLabel.Caption:= 'Inoaeinu ' + TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)
    if (Remaining = 0) then TimeLabel.Caption:= 'Çàâåðøåíèå...'
  end;
end;

procedure InitializeWizard3();
begin
TimeLabel:= TLabel.Create(WizardForm)
TimeLabel.SetBounds(ScaleX(0), ScaleY(80), ScaleX(457), ScaleY(20));
TimeLabel.AutoSize:= False
TimeLabel.Transparent:= True;
TimeLabel.Parent:= WizardForm.InstallingPage;
end;

procedure CurStepChanged3(CurStep: TSetupStep);
begin
If CurStep = ssInstall then
  begin
    StartInstall:= GetTickCount
    TimerID:= SetTimer(0,0, 500, WrapTimerProc(@GetTime, 4))
  end;
end;

procedure DeinitializeSetup3();
begin
KillTimer(0, TimerID)
end;

// --- Dispatching code ------------------------------------------------------------

procedure InitializeWizard();
begin
  InitializeWizard1();
  InitializeWizard2();
  InitializeWizard3();
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  CurPageChanged1(CurPageID);
end;

procedure DeinitializeSetup();
begin
  DeinitializeSetup2();
  DeinitializeSetup3();
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  CurStepChanged2(CurStep);
  CurStepChanged3(CurStep);
end;


Twoface 03-09-2012 17:53 1982273

Цитата:

Цитата spice
spice »

У тебя дублируется функция: TTimerProc. Повтор.

spice 03-09-2012 18:10 1982282

блин а как это исправить?

SatHan 04-09-2012 01:03 1982515

Цитата:

Цитата spice
блин а как это исправить? »

Может так?

читать дальше »

Код:

[Setup]
AppId={{401CE660-D285-4327-AE2C-3CFB06643CC9}
AppName=oioi
AppVersion=1.5
;AppVerName=oioi 1.5
AppPublisher=Iiy eiiiaiey, Inc.
AppPublisherURL=http://www.naeo.com/
AppSupportURL=http://www.naeo.com/
AppUpdatesURL=http://www.naeo.com/
DefaultDirName={pf}\oioi
DefaultGroupName=oioi
OutputDir=C:\Users\Vadim\Desktop\ISS
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[Name]
Name: russian; Name: compiler:Name\Russian.isl

[CustomMessages]
russian.hour= Часы
russian.min= Минуты
russian.sec= Секунды


[Files]
Source: C:\Users\Vadim\Desktop\ISS\oioi\innocallback.dll; Flags: dontcopy
Source: C:\Users\Vadim\Desktop\oioi\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
;
Source: C:\Users\Vadim\Desktop\ISS\oioi\ISSkin.dll; DestDir: {tmp}; Flags: dontcopy
Source: C:\Users\Vadim\Desktop\ISS\oioi\aqualux.cjstyles; DestDir: {tmp}; Flags: dontcopy


[#code]
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
//
PDisplay_Device = record
cb: DWord;
DeviceName: array [0..31] of char;
DeviceString: array [0..127] of char;
StateFlags: DWord;
DeviceID, DeviceKey: array [0..127] of char;
end;

TMixerCaps = record
vPid, vDriverVersion: DWord;
sName: array [0..31] of char;
Support, cDestinations: DWord;
end;

// I?iaa?ea aa?nee Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
{Win9x}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
{WinNT}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif

const
DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
oneMB = 1024*1024;
NeedMHz = 1800;
NeedVideoRAM = 128;
NeedSoundCard = 'Creative X-Fi';
NeedMB = 512;
NeedPageFile = 1024;

var
InfoPage: TWizardPage;
TopText, BottomText: TNewStaticText;
ChangeText: Boolean;
SystemPanel, ProcessorPanel, VideoPanel,
AudioPanel, RAMPanel, PageFilePanel: TMemo;
SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
lpCaps: TMixerCaps;
Version: TWindowsVersion;
MemoryEx: TMemoryStatusEx;
n, errCode: Integer;
Keys: TArrayOfString;
DeviceValue: Cardinal;
lpDisplayDevice: PDisplay_Device;

function GetSystemMetrics(nIndex: Integer): Integer;
external 'GetSystemMetrics@user32.dll stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
external 'GetDeviceCaps@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
external 'CreateDCA@GDI32 stdcall';

function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
external 'EnumDisplayDevicesA@user32.dll stdcall';

function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
external 'mixerGetDevCapsA@winmm.dll stdcall';

function mixerGetNumDevs: Integer;
external 'mixerGetNumDevs@winmm.dll stdcall';

// Aiiieieou ?enei ai e?aoiiai Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
Result := (Bytes/Multiple + 1)*Multiple
else
Result := Bytes
end;

// Ia?aaia ?enea a cia?aiea Ao/Ea/Ia/Aa/Oa (ai 3o ciaeia iinea caiyoie)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
if not noMB then
Result := FloatToStr(Int(Bytes)) + ' Ia'
else
if Bytes < 1024 then
Result := FloatToStr(Int(Bytes)) + ' Ao'
else
if Bytes/1024 < 1024 then
Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Ea'
else
if Bytes/oneMB < 1024 then
Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Ia'
else
if Bytes/oneMB/1000 < 1024 then
Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Aa'
else
Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Oa'
StringChange(Result, ',', '.')
end;

// Oaaeaiea ia?aeuiuo, eiia?iuo e iiaoi?iuo i?iaaeia
function DelSp(String: String): String;
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1)
Result := Trim(String)
end;

function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2
for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;

function CheckCPU(NeedMHz: Integer): Boolean;
var
String: String;
begin
String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys) // Eiee?anoai yaa?
for n := 0 to GetArrayLength(Keys)-1 do
RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
Exit
else
Result := True
end;

function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
MemoryEx.dwLength := SizeOf(MemoryEx)
if not GlobalMemoryStatusEx(MemoryEx) then
MsgBox('Ioeaea ooieoee:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
else
if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
Exit
else
Result := True
end;

procedure CreateCheckForm();
begin

TopText := TNewStaticText.Create(InfoPage)
with TopText do
begin
Parent := InfoPage.Surface
Left := 0
AutoSize := True
end

BottomText := TNewStaticText.Create(InfoPage)
with BottomText do
begin
Parent := InfoPage.Surface
Caption := 'Eiaaa Au aoaaoa aioiau i?iaie?eou onoaiiaeo, ia?ieoa «Aaeaa».'
Font.Color := clBlack
Left := 0
Top := 200
AutoSize := True
end

SystemPanel := TMemo.Create(InfoPage)
with SystemPanel do
begin
Text := 'Nenoaia'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ScaleY(33)
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

SystemVersionPanel := TMemo.Create(InfoPage)
with SystemVersionPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := SystemPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

ProcessorPanel := TMemo.Create(InfoPage)
with ProcessorPanel do
begin
Text := 'I?ioanni?'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := SystemPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

ProcessorMHzPanel := TMemo.Create(InfoPage)
with ProcessorMHzPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := ProcessorPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

VideoPanel := TMemo.Create(InfoPage)
with VideoPanel do
begin
Text := 'Aeaaiaaaioa?'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ProcessorPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

VideoRAMPanel := TMemo.Create(InfoPage)
with VideoRAMPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := VideoPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

AudioPanel := TMemo.Create(InfoPage)
with AudioPanel do
begin
Text := 'Caoeiaay ea?oa'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := VideoPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

AudioNamePanel := TMemo.Create(InfoPage)
with AudioNamePanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := AudioPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

RAMPanel := TMemo.Create(InfoPage)
with RAMPanel do
begin
Text := 'Iau?i iaiyoe'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := AudioPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end

RAMTotalPanel := TMemo.Create(InfoPage)
with RAMTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := RAMPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

PageFilePanel := TMemo.Create(InfoPage)
with PageFilePanel do
begin
Text := 'Oaee iiaea?ee'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := RAMPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;

PageFileTotalPanel := TMemo.Create(InfoPage)
with PageFileTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := PageFilePanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end

end;

procedure UpdateInfo();
var
DeviceName, DeviceKey: String;
begin
ChangeText := False

GetWindowsVersionEx(Version)

// Iia?aoeiiiay nenoaia:
SystemVersionPanel.Color := $CCFFCC

DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
DeviceName := DeviceName + ' ' + DeviceKey
StringChange(DeviceName, 'Microsoft ', '')
SystemVersionPanel.Text := ' ' + DeviceName + ' nai?ea ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
'.' + IntToStr(Version.Build)

if (Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and // Windows 2000 SP4
(Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and // Windows XP SP2
(Pos('Vista', SystemVersionPanel.Text) = 0) and // Windows Vista (c e?aui SP eee aac iaai)
(Pos('Windows 7', SystemVersionPanel.Text) = 0) then
begin
SystemVersionPanel.Color := $CCCCFF
ChangeText := True
end

// I?ioanni?:
ProcessorMHzPanel.Color := $CCFFCC

if not CheckCPU(NeedMHz) then
begin
ProcessorMHzPanel.Color := $CCCCFF
ChangeText := True
end

ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
if GetArrayLength(Keys) > 1 then
ProcessorPanel.Text := 'I?ioanni?u' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'

// Aeaaiea?oa:
VideoRAMPanel.Color := $CCFFCC

lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
DeviceKey := ''
n := 0
while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
(lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127) // Ee?? a?aeaa?a iieo?aai ec API
StringChange(DeviceKey, '\Registry\Machine\', '')
errCode := 1
DeviceValue := 0
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
for n := 1 to Length(DeviceName) do
begin
DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
errCode := errCode*$100
end
else
if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
else
RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
DeviceName := ''
for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 127)

if DeviceName <> '' then
if DeviceValue > 0 then
VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
else
VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
else
begin
VideoRAMPanel.Text := ' A?aeaa? ono?ienoaa ia iaia?o?ai'
VideoRAMPanel.Color := $CCCCFF
ChangeText := True
end
if (DeviceValue/oneMB < NeedVideoRAM) then
begin
VideoRAMPanel.Color := $CCCCFF
ChangeText := True
end
VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'

// Caoeiaay ea?oa:
AudioNamePanel.Color := $CCFFCC

// for errCode := 0 to 1 do // Auaia iniiaiiai caoeiaiai ono?ienoaa
for errCode := 0 to mixerGetNumDevs do
begin
mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
DeviceName := ' '
for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
Delete(DeviceName, Pos(' [', DeviceName), 31)
StringChange(DeviceName, 'SB ', 'Creative ')
Delete(DeviceName, Pos(' Audio', DeviceName), 31)
SetArrayLength(Keys, errCode)
if errCode > 0 then Keys[errCode-1] := DeviceName
end

if GetArrayLength(Keys) > 1 then
begin
AudioPanel.Text := 'Caoeiaua ea?ou'
// AudioPanel.Text := 'Caoeiaua ea?ou (' + IntToStr(GetArrayLength(Keys)) +')'
AudioNamePanel.Text := ''
for n := 1 to GetArrayLength(Keys) do
AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1] // + '(' + IntToStr(n) + ')'
end
else
if GetArrayLength(Keys) = 0 then
begin
AudioNamePanel.Text := ' A?aeaa? ono?ienoaa ia iaia?o?ai'
AudioNamePanel.Color := $CCCCFF
ChangeText := True
end
else
AudioNamePanel.Text := Keys[0]
if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
AudioNamePanel.Text := AudioNamePanel.Text + ' (?aeiiaiaoaony ' + NeedSoundCard + ')'

// Iau?i iaiyoe:
RAMTotalPanel.Color := $CCFFCC
if not CheckMemorySize(NeedMB) then
begin
RAMTotalPanel.Color := $CCCCFF
ChangeText := True
end
RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' anaai, ' +
ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' eniieucoaony, ' +
ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' naiaiaii'

// Ae?ooaeuiay iaiyou:
PageFileTotalPanel.Color := $CCFFCC
PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' anaai, ' +
ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' caiyoi nenoaiiui eyoai'
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
begin
PageFileTotalPanel.Color := $CCCCFF
ChangeText := True
end

if ChangeText = True then
begin
TopText.Top := 0
TopText.Caption := 'Ia ana eiiiiiaiou oaiaeaoai?y?o ieieiaeuiui o?aaiaaieyi ea?u.' #13
'Ii?aeoenoa, i?iaa?uoa iiceoee, auaaeaiiua e?aniui oaaoii.'
TopText.Font.Color := clRed
// WizardForm.NextButton.Enabled := False
end
else
begin
TopText.Caption := 'Ana eiiiiiaiou niioaaonoao?o ieieiaeuiui o?aaiaaieyi ea?u.'
TopText.Font.Color := clGreen
TopText.Top := 8
// WizardForm.NextButton.Enabled := True
end
end;



procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = InfoPage.ID then UpdateInfo() // Iaiiaeaiea eioi?iaoee i nenoaia
end;

// --- Source: 2.iss ------------------------------------------------------------

var
PercentsTimer: LongWord;
PercentsLabel: TLabel;

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption:= 'Auiieiaii ' + NumToStr((Position*100)/Max) + ' %';
end;
End;


// --- Source: 3.iss ------------------------------------------------------------

var
StartInstall: Integer;
TimeLabel: TLabel;
TimerID: Longword;

function GetTickCount: DWord; external 'GetTickCount@kernel32';

Function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;

Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail then            {hh: mm:ss format}
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000 then    {more than hour}
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000 then    {1..60 minutes}
        Result:= IntToStr(Ticks/60000) +m+' '+ IntToStr(Ticks/1000 - Ticks/1000/60*60) +s
    else Result:= Format('%.1n', [Abs(Ticks/1000)]) +s    {less than one minute}
End;

procedure GetTime(HandleW, Msg, idEvent, TimeSys: LongWord);
var Remaining: Integer;
begin
with WizardForm.ProgressGauge do begin
  if position > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((max - position)/position))
    TimeLabel.Caption:= 'Inoaeinu ' + TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)
    if (Remaining = 0) then TimeLabel.Caption:= 'Caaa?oaiea...'
  end;
end;

procedure InitializeWizard();
begin
PercentsLabel:= TLabel.Create(WizardForm);
with PercentsLabel do
begin
Left:= WizardForm.ProgressGauge.Left;
Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Parent:= WizardForm.InstallingPage;
end;

//procedure InitializeWizard1();
begin
InfoPage := CreateCustomPage(wpLicense, 'Aiia?aoiia e i?ia?aiiiia iaania?aiea',
'I?ia?aiia onoaiiaee iaia?o?eea neaao?uea iaiaoiaeiua eiiiiiaiou.')
CreateCheckForm() // Nicaaiea iauaeoia TMemo, a eioi?uo aoaao auaiaeony eioi?iaoey i nenoaia
UpdateInfo() // Iaiiaeaiea eioi?iaoee i nenoaia
end;

//procedure InitializeWizard3();
begin
TimeLabel:= TLabel.Create(WizardForm)
TimeLabel.SetBounds(ScaleX(0), ScaleY(80), ScaleX(457), ScaleY(20));
TimeLabel.AutoSize:= False
TimeLabel.Transparent:= True;
TimeLabel.Parent:= WizardForm.InstallingPage;
end;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep = ssInstall then
  begin
    StartInstall:= GetTickCount
    TimerID:= SetTimer(0,0, 500, WrapTimerProc(@GetTime, 4))
    PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
  end;
end;


//procedure CurStepChanged2(CurStep: TSetupStep);
//begin
//if CurStep = ssInstall then
//begin
//PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
//end;
//end;



procedure DeinitializeSetup();
begin
KillTimer(0, TimerID)
KillTimer(0, PercentsTimer);
end;

//procedure DeinitializeSetup2();
//begin
//KillTimer(0, PercentsTimer);
//end;


// --- Dispatching code ------------------------------------------------------------

//procedure InitializeWizard();
//begin
//  InitializeWizard1();
//  InitializeWizard2();
//  InitializeWizard3();
//end;

//procedure CurPageChanged(CurPageID: Integer);
//begin
//  CurPageChanged1(CurPageID);
//end;

//procedure DeinitializeSetup();
//begin
//  DeinitializeSetup2();
//  DeinitializeSetup3();
//end;

//procedure CurStepChanged(CurStep: TSetupStep);
//begin
//  CurStepChanged2(CurStep);
//  CurStepChanged3(CurStep);
//end;



В следующий раз для вставки сюда своего кода, открывай свой скрипт в блокноте (например Notepad++) и копипасть от туда сюда, а то ведь не дело видеть иероглифы подобны этим [Ia ana eiiiiiaiou oaiaeaoai?y?o ieieiaeuiui o?aaiaaieyi ea?u.'].

spice 04-09-2012 03:37 1982555

ок!

al1511 04-09-2012 07:46 1982593

А кто-нибудь знает, как решить такую проблему: во время упаковки файлов в архив окно Inno Setup зависает (как-бы ждёт завершения выполнения dll, которая выполняет упаковку) и отвисает только тогда, когда заканчивается добавление файлов в архив... Информация в окне во время добавления файлов не меняется, и окошко даже нельзя двигать...
Помогите, пожалуйста, разобраться!

spice 04-09-2012 10:18 1982670

Вложений: 1
Посмотрите на скрин который прикрепил.
1. Как переместить слова или как цвет шрифта поменять?
напишите код

Mailchik 04-09-2012 11:26 1982705

spice,
Код:

НазваниеЛейбла.Left := ScaleX(10);
НазваниеЛейбла.Font.Color := clLime;


spice 04-09-2012 11:58 1982725

А можно по подробнее я не понимаю че за название Лейбла?
куда их пихать?

kuts85 04-09-2012 13:06 1982765

Подскажите простой вариант распаковки внешнего архива 7z, без его копирования в темп или папку программы, если они находятся в папке Data рядом Setup-ом, а надо разархивировать в {app}\base\.
Пример моего скрипта, где с exe архивом получается, а с архивом 7z ничего не получается.
(В инете все описания для FreeArc хотя пишут что для 7zip реализовано.)
Код:

#define MyAppName "Распаковка внешнего архива"
#define MyAppVersion "1.0"
#define MyAppPublisher "Kompany, Inc."
#define MyAppURL "http://kompa.ru/"
#define MyAppExeName "MyProg.exe"
[Setup]
AppId={{1B1C88E6-3F4F-4FE0-908E-878500D113C8}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=c:\ExtractSoft
DefaultGroupName={#MyAppName}
AllowNoIcons=true
OutputDir=C:\Users\Programs\Desktop\prog
OutputBaseFilename=setup1.0
Compression=lzma
SolidCompression=true
UsePreviousAppDir=false
DirExistsWarning=no
[Languages]
Name: english; MessagesFile: compiler:Default.isl
Name: german; MessagesFile: compiler:Languages\German.isl
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Types]
Name: full; Description: Полная установка
Name: compact; Description: Минимальная установка
Name: custom; Description: Выборочная установка; Flags: iscustom
[Components]
Name: program; Description: Основные файлы программы; Types: full compact custom; Flags: fixed
Name: ver1; Description: Версия 1; Types: full
Name: ver2; Description: Версия 2; Types: compact
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1
[Files]
Source: ..\..\..\..\Program Files\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion; Components: program
Source: soft.docx; DestDir: {app}; Flags: ignoreversion; Components: program
Source: 7za.exe; DestDir: {tmp}; Flags: deleteafterinstall; Components: program
[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: quicklaunchicon
[Run]
Components: ver1; Filename: {src}\data\1.exe; Parameters: -x -y -o{app}\base\; WorkingDir: {tmp}; Flags: shellexec waituntilidle
Components: ver2; Filename: {tmp}\7za.exe; Parameters: "7za e {src}\data\2.7z -y -o{app}\base\"; WorkingDir: {tmp}\2\; Flags: shellexec
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent


Johny777 04-09-2012 13:28 1982782

Цитата:

Цитата kuts85
Подскажите простой вариант распаковки внешнего архива 7z »

у меня есть такой пример
http://sendfile.su/663612

Ivan_009 04-09-2012 13:35 1982787

Подскажите пожалуйста что нужно зделать чтобы текструированный прогрессбар работал на ssPostInstall. Дело в том что на
ssInstall он работает а на ssPostInstall нет... :(

Ivan_009 04-09-2012 14:44 1982829

Как сделать так чтобы кнопка была без надписи....

Snoopak96 04-09-2012 22:11 1983128

al1511,
Есть такая функция в IsDone, называется ISExec, упаковку в архив сделайте через неё, тогда инсталл будет откликаться на вненшии команды.
так же можно сделать упаковку через библиотеку IsExec.dll от Вольта или скрипт ExecAndWait (Вроде Серёга автор, не суть), в общем вашу упаковку надо запустить в консольном режиме.
Рекомендую первый вариант, тк прогрессбар будет более менее плавным (при тестовом прогоне не будет "плавности", а далее плавный).
Цитата:

Цитата Johny777
у меня есть такой пример »

Давно я такого не видел :flag:
Ivan_009,
1. Если юзал тот пример, что тебе скидывал, то только что проверял - пб рубит норм в ssPostInstall
2. Найди процедуру SetStateNewButtons и удали от туда эту строку:
Код:

with WizardForm.NextButton do begin
  BtnSetText(hNextBtn,PAnsiChar(Caption)); <-- Эту
  BtnSetVisibility(hNextBtn,Visible);
end;


SatHan 05-09-2012 05:49 1983279

Цитата:

Цитата spice
А можно по подробнее я не понимаю че за название Лейбла?
куда их пихать? »

Что тебе не понятно то?
Пример
читать дальше »
WizardForm - Форма - Обязательный параметр
Лейблы
WelcomeLabel1 - Первый лейбл - то что начинается с "Вас приветствует мастер"
WelcomeLabel2 - Второй лейбл - то что начинается с "Программа установит"

Добавляешь WelcomeLabel1 либо WelcomeLabel2 после WizardForm через точку, получается

Код:

  WizardForm.WelcomeLabel1.Left := ScaleX(10);
  WizardForm.WelcomeLabel1.Font.Color := clLime;

  WizardForm.WelcomeLabel2.Left := ScaleX(10);
  WizardForm.WelcomeLabel2.Font.Color := clRed;

всё это помещаешь в процедуру, например InitializeWizard

Код:

procedure InitializeWizard();
begin

end;

и между
begin и end; вставляешь получившиеся строки
Код:

  WizardForm.WelcomeLabel1.Left := ScaleX(10);
  WizardForm.WelcomeLabel1.Font.Color := clLime;

  WizardForm.WelcomeLabel2.Left := ScaleX(10);
  WizardForm.WelcomeLabel2.Font.Color := clRed;

Окончательный итог

Код:

procedure InitializeWizard();
begin
  WizardForm.WelcomeLabel1.Left := ScaleX(10);
  WizardForm.WelcomeLabel1.Font.Color := clLime;

  WizardForm.WelcomeLabel2.Left := ScaleX(10);
  WizardForm.WelcomeLabel2.Font.Color := clRed;
end;


spice 05-09-2012 07:16 1983288

он у меня есть у меня ultra версия, в редакторе форм все на английском я не понимаю как с ним работать.

R.i.m.s.k.y. 05-09-2012 07:26 1983289

Цитата:

Цитата SatHan
В следующий раз для вставки сюда своего кода, открывай свой скрипт в блокноте (например Notepad++) и копипасть от туда сюда, а то ведь не дело видеть иероглифы подобны этим [Ia ana eiiiiiaiou oaiaeaoai?y?o ieieiaeuiui o?aaiaaieyi ea?u.']. »

попробуй перед копированием переключись в инно на русский

SatHan 05-09-2012 07:50 1983295

Цитата:

Цитата R.i.m.s.k.y.
попробуй перед копированием переключись в инно на русский »

у меня и так всё на русском. что стандартный, что расширенный (v 5.5.1), копирует одинаково плохо.
может быть "Cкопировать как UBB код"?

Gnom_aka_Lexander 05-09-2012 08:00 1983298

SatHan, нет. перед копированием переключи раскладку клавиатуры на русский.

MogilShik2007 05-09-2012 08:09 1983302

Всем прив, подскажите скрипт, для удаления сохранений игры, чтобы запрос появлялся перед финишным окном, а не после)))

R.i.m.s.k.y. 05-09-2012 09:37 1983328

MogilShik2007
Код:

procedure RD(Dir:string);
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure RF(file:string);
begin
  Exec('cmd.exe', ' /c del /F /Q  ' + '"'+file+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep=usUninstall then begin
    if MsgBox('Удалить сохранения?',mbconfirmation, mb_yesno) = IDYES then RD(папка с сохранениями);
  end;
end;


________________

Цитата:

Цитата spice
он у меня есть у меня ultra версия, в редакторе форм все на английском я не понимаю как с ним работать. »

а) учи собачий
б) ставь InnoUltra от Gnom_aka_Lexander, в нем русифицированный расширенный редактор

spice 05-09-2012 12:20 1983423

он у меня и стоит! все я разобрался че там да как!

Ivan_009 05-09-2012 12:59 1983453

Snoopak96, Не работает прогрессбар хоть убей :( вот код посмотри...

Snoopak96 05-09-2012 16:36 1983591

Ivan_009,
И не будет, т.к. это PostInstall, а после установки что сделал?:
Код:

ISDoneError:=false;
until true;
ISDoneStop;
end;
ImgPBVisibility(ISDoneProgressBar1, False); <-- сам же и скрыл его после основной установки.
#ifdef SecondProgressBar
ImgPBVisibility(ISDoneProgressBar2, False);
#endif
ImgApplyChanges(WizardForm.Handle);
end;
if (CurStep=ssPostInstall) and ISDoneError then begin
WelcomeLabel.Hide;
pr2.Hide;
WizardForm.Caption:= ExpandConstant('{cm:StatusRollback}');
pr1.Caption:= ExpandConstant('{cm:StatusRollback}');
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;

В общем выделенную строку убирай.

SatHan 05-09-2012 16:39 1983595

Цитата:

Цитата Gnom_aka_Lexander
нет. перед копированием переключи раскладку клавиатуры на русский. »

теперь понял. Спасибо. как вариант учту, незнал. к Notepad++ просто привык, на нём работать удобнее. R.i.m.s.k.y., так бы сразу и сказал что находясь в компиляторе нужно раскладку клавиатуры переключить. а так эта инфа была для spice, да и не только к нему и к остальным тоже у меня такая пустяшная проблема не произошла б.
Цитата:

Цитата spice
он у меня есть у меня ultra версия, в редакторе форм все на английском я не понимаю как с ним работать. »

всё равно какая версия хоть ультра хотя макси инно один, а насчёт русского для расширенной версии, та возьми ты со старой версии например 5.4.0 из шапки в соседней теме http://forum.oszone.net/showthread.p...99#post1201499 и всё станет понятно.

Ivan_009 05-09-2012 16:48 1983606

Небольшой вопрос а можно вместо 1 шрифта загрузить например 2 своих шрифта в инсталлятор... :search:

Snoopak96, Не работает все равно... :(

Snoopak96 05-09-2012 19:22 1983697

Ivan_009,
скинь в лс весь проект.

vint56 05-09-2012 20:12 1983724

Привет хотел попросить помощи дописать скрипт что не хватает для проверки места дело в том что у меня после смены языка пропадает данные размер игры и так далее.
вот скрин
вот сам скрипт http://rghost.ru/40204994

Snoopak96 05-09-2012 21:25 1983761

vint56,
читать дальше »
Код:

#define NeedSize 4380
#define NeedInstallSize 47890
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: Russian.isl; DestDir: {tmp}
Source: English.isl; DestDir: {tmp}


[_Code]
var
  SettingButton: TButton;
  Flag, SetParameters: Boolean;
  LangFile: String;
  SizePanel: TPanel;

  TotalSpaceLabel, FreeSpaceLabel,InstallSpaceLabel, NeedSpacelabel,
  TotalSpaceLabel2, FreeSpaceLabel2, NeedSpacelabel2, InstallSpaceLabel2: TLabel;
  FreeMB, TotalMB: Cardinal;

function NumToStr(Float: Extended): String;
begin
  Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
  while ((Result[Length(Result)] = '0')or(Result[Length(Result)] = '.'))and(Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
end;

function MbOrTb(Float: Extended): String;
begin
  if Float < 1024 then Result:= NumToStr(Float)+' '+GetIniString('Messages', 'mb', '', LangFile) else
  if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' '+GetIniString('Messages', 'gb', '', LangFile) else
  Result:= NumToStr(Float/(1024*1024))+' '+GetIniString('Messages', 'tb', '', LangFile);
end;

procedure ObjectFunc(Sender: TObject);
var
  Drive: String;
begin
case Sender of
  WizardForm.DirEdit: begin
  Drive:= ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Drive, True, FreeMB, TotalMB);
 
  TotalSpaceLabel.Caption := GetIniString('Messages', 'TotalMBLabel', '', LangFile)+MbOrTb(TotalMB);
  FreeSpaceLabel.Caption := GetIniString('Messages', 'FreeSpaceLabel', '', LangFile)+MbOrTb(FreeMB);
  InstallSpacelabel.Caption := GetIniString('Messages', 'TotalNeedSpaceLabel', '', LangFile)+MbOrTb({#NeedInstallSize});
  NeedSpaceLabel.Caption := GetIniString('Messages', 'NeedSpaceLabel', '', LangFile)+MbOrTb({#NeedSize});
  WizardForm.NextButton.Enabled:=(FreeMB>{#NeedInstallSize})and(FreeMB>{#NeedSize});
  //if (FreeMB>{#NeedInstallSize})and(FreeMB>{#NeedSize}) then FreeSpaceLabel2.Font.Color:=$FFFFFF else FreeSpaceLabel2.Font.Color:=$0000FF;
end;
end;
end;

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\Russian.isl')) then ExtractTemporaryFile('Russian.isl');
  if not FileExists(ExpandConstant('{tmp}\English.isl')) then ExtractTemporaryFile('English.isl');
  Result:=True;
end;

procedure HideShowOnClick(Sender: TObject);
begin
  if Flag = False then begin
  LangFile:= ExpandConstant('{tmp}\Russian.isl');
  Flag:= True;
  SettingButton.Caption:= 'Ru';
end else begin
  LangFile:= ExpandConstant('{tmp}\English.isl')
  Flag:= False;
  SettingButton.Caption:= 'En';
end;
  WizardForm.NextButton.Caption := GetIniString('Messages', 'ButtonNext', '', LangFile);
  WizardForm.BackButton.Caption := GetIniString('Messages', 'ButtonBack', '', LangFile);
  WizardForm.CancelButton.Caption := GetIniString('Messages', 'ButtonCancel', '', LangFile);
  WizardForm.DirBrowseButton.Caption := GetIniString('Messages', 'ButtonBrowse', '', LangFile);
  WizardForm.GroupBrowseButton.Caption := GetIniString('Messages', 'ButtonBrowse', '', LangFile);
 
  TotalSpaceLabel.Caption := GetIniString('Messages', 'TotalMBLabel', '', LangFile)+MbOrTb(TotalMB);
  FreeSpaceLabel.Caption := GetIniString('Messages', 'FreeSpaceLabel', '', LangFile)+MbOrTb(FreeMB);
  InstallSpacelabel.Caption := GetIniString('Messages', 'TotalNeedSpaceLabel', '', LangFile)+MbOrTb({#NeedInstallSize});
  NeedSpaceLabel.Caption := GetIniString('Messages', 'NeedSpaceLabel', '', LangFile)+MbOrTb({#NeedSize});
end;

procedure InitializeWizard();
begin
  SettingButton:= TButton.Create(WizardForm);
  SettingButton.SetBounds(ScaleX(10),ScaleY(325), ScaleX(30), ScaleY(30))
  SettingButton.Caption:= 'Ru';
  SettingButton.OnClick:= @HideShowOnClick;
  SettingButton.Parent:= WizardForm;
  Flag:=True;

  TotalSpaceLabel:= TLabel.Create(WizardForm);
  with TotalSpaceLabel do begin
  Parent := WizardForm.SelectDirPage;
  AutoSize:=True;
  Transparent := True;
  SetBounds(ScaleX(0), ScaleY(120), ScaleX(0), ScaleY(0));
  Font.Size:= 8;
end;

  FreeSpaceLabel:= TLabel.Create(WizardForm);
  with FreeSpaceLabel do begin
  Parent := WizardForm.SelectDirPage;
  AutoSize:=True;
  Transparent := True;
  SetBounds(ScaleX(0), ScaleY(140), ScaleX(0), ScaleY(0));
  Font.Size:= 8;
end;

  InstallSpacelabel:= TLabel.Create(WizardForm);
  with InstallSpacelabel do begin
  Parent := WizardForm.SelectDirPage;
  AutoSize:=True;
  Transparent := True;
  SetBounds(ScaleX(150), ScaleY(120), ScaleX(0), ScaleY(0));
  Font.Size:= 8;
end;

  NeedSpaceLabel:= TLabel.Create(WizardForm);
  with NeedSpaceLabel do begin
  Parent := WizardForm.SelectDirPage;
  AutoSize:=True;
  Transparent := True;
  SetBounds(ScaleX(150), ScaleY(140), ScaleX(0), ScaleY(0));
  Font.Size:= 8;
end;
  WizardForm.DirEdit.OnChange:=@ObjectFunc;
end;

procedure Showcomp(CurPageID: Integer);
begin
case CurPageID of
  wpSelectDir:
begin
  ObjectFunc(WizardForm.DirEdit);
end;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  ShowComp(CurPageID);
If Flag then begin
  LangFile:= ExpandConstant('{tmp}\Russian.isl');
end else begin
  LangFile:= ExpandConstant('{tmp}\English.isl')
  WizardForm.NextButton.Caption := GetIniString('Messages', 'ButtonNext', '', LangFile);
  WizardForm.BackButton.Caption := GetIniString('Messages', 'ButtonBack', '', LangFile);
  WizardForm.CancelButton.Caption := GetIniString('Messages', 'ButtonCancel', '', LangFile);
  WizardForm.DirBrowseButton.Caption := GetIniString('Messages', 'ButtonBrowse', '', LangFile);
  WizardForm.GroupBrowseButton.Caption := GetIniString('Messages', 'ButtonBrowse', '', LangFile);
case CurPageID of
  wpWelcome:
begin
end;
  wpFinished:
begin
  SettingButton.Hide;
  WizardForm.NextButton.Caption := GetIniString('Messages', 'ButtonFinish', '', LangFile);
end;
end;
end;
end;

Можно упростить - но мне лень :smirk:

Johny777 06-09-2012 10:31 1984015

накатайте мне кто-нибудь пожалуйста пример считывания ини файла в массив строк (Array of String) и последующей загрузкой данных ключей из секций, но уже из переменной

те не каждый раз обращаться к файлу как в коде над моим сообщением

R.i.m.s.k.y. 06-09-2012 12:35 1984102

Johny777, а зачем тебе парсить инишник если есть встроенные функции?

Код:

/// в начале считали, например в InitializeSetup
if FileExists(ExpandConstant('{pf}\MPC-HC\mpc-hc.ini')) then RenderType := StrToInt( GetIniString('Settings', 'DSVidRen', '0', ExpandConstant('{pf}\MPC-HC\mpc-hc.ini')) );
// в конце записали на шаге isDone
if FileExists(ExpandConstant('{pf}\MPC-HC\mpc-hc.ini')) then SetIniString('Settings', 'DSVidRen', IntToStr(RenderType), ExpandConstant('{pf}\MPC-HC\mpc-hc.ini'));
//в промежутке инишник дергать не надо


SatHan 06-09-2012 15:16 1984203

подскажите ответ на такой вопрос
имеются три игры которые расположены в C:\Program Files\Games в папках Game_X таких папок три где X цифра.

код#
Код:

[Setup]
AppName=Extende
AppVersion=1.0
AppVerName=Extende 1.0
DefaultDirName={pf}\Games
DefaultGroupName=Extende
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=ExtSetup
Compression=lzma
SolidCompression=yes

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

[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full

[Files]
Source: Game_1\*; DestDir: {app}\Game_1; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_1
Source: Game_2\*; DestDir: {app}\Game_2; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_2
Source: Game_3\*; DestDir: {app}\Game_3; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_3

каждый компонент на каждую игру.

Что нужно сделать а главное как сделать чтоб если один из ключей в реестре
читать дальше »
Код:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1]
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1]


не найден то и компонент становился скрытым?

R.i.m.s.k.y. 06-09-2012 15:20 1984207

SatHan,
Код:

[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1');
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1');
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full; Check: RegKeyExists(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1');

_____________

Johny777, я в таких случая тупо инициализирую в память на начальном шаге все нужные переменные, благо их немного

SatHan 06-09-2012 16:37 1984238

R.i.m.s.k.y., не работает, пишет "Directive or parameter "Check" expression error: Can only call Function "ExpandConstant" within parameter lists".

Нашёл для себя вот такой вариант

читать дальше »
Код:

[Setup]
AppName=Extende
AppVersion=1.0
AppVerName=Extende 1.0
DefaultDirName={pf}\Games
DefaultGroupName=Extende
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=ExtSetup
Compression=lzma
SolidCompression=yes

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

[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: CheckRegGame1
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: CheckRegGame2
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full; Check: CheckRegGame3

[Files]
Source: Game_1\*; DestDir: {app}\Game_1; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_1
Source: Game_2\*; DestDir: {app}\Game_2; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_2
Source: Game_3\*; DestDir: {app}\Game_3; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_3

[Icons]
Name: {group}\{cm:UninstallProgram,Extende}; Filename: {uninstallexe}

[#code]
Function CheckRegGame1: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') then
Result:= True;
end;

Function CheckRegGame2: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') then
Result:= True;
end;

Function CheckRegGame3: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1') then
Result:= True;
end;



только теперь проблема в следующем
когда не одного компонента нет (не найдены ключи в реестре) то инсталятор всё равно запускается. Гуру подскажите как сделать чтоб если не одного компонента нет (не найдены ключи в реестре) то инсталятор не запускался а выдавал сообщение что "на компьютере не найдено установлено игр"?

R.i.m.s.k.y. 06-09-2012 16:53 1984253

SatHan,
Код:

Function CheckRegGame1: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') then
Result:= True else Result := False;
end;

Function CheckRegGame2: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') then
Result:= True else Result := False;
end;

Function CheckRegGame3: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1') then
Result:= True else Result := False;
end;

Function InitializeSetup: Boolean;
Begin
if ( (not CheckRegGame1) and (not CheckRegGame2) and (not CheckRegGame3) ) then begin
MsgBox('на компьютере не найдено установлено игр', mbInformation, MB_OK);
Result := False;
end;
end;


SatHan 06-09-2012 17:03 1984260

R.i.m.s.k.y., опять проблема. когда в системе ключи присутствуют то инсталятор не запускается. Как решить проблему?

R.i.m.s.k.y. 06-09-2012 17:13 1984269

SatHan,
Код:

Function InitializeSetup: Boolean;
Begin
Result := True;
if ( (not CheckRegGame1) and (not CheckRegGame2) and (not CheckRegGame3) ) then begin
MsgBox('На компьютере не найдено установленых игр', mbInformation, MB_OK);
Result := False else Result := True;
end;


SatHan 06-09-2012 17:25 1984279

R.i.m.s.k.y., на Result-е тот что идёт после MsgBox останавливается и выдаёт ошибку с сообщением identifier expected.

Johny777 06-09-2012 17:42 1984292

Цитата:

Цитата R.i.m.s.k.y.
я в таких случая тупо инициализирую в память на начальном шаге все нужные переменные, благо их немного »

Не совсем понял
они и так инициализируются при запуске или при работе процедуры
вот смотри
ты 10 раз открываешь файл с жёсткого диска чтоб взять из него значение (10 значений)
или открываешь 1 раз, пишешь все 10 значений в переменную массива и потом работаешь уже с переменной тк она в оперативке (в стеке кажись.)
а из оперативы брать быстрее в разы чем раскручивать жд

понимаешь зачем мне массив
до последнего времени я обходился простой GetIniString но это малость неразумно когда нужно считывать не 1 и не 2 знчения, а больше в разы

SatHan,
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[  Code]
Function CheckRegGame(nParam: Integer): Boolean;
begin
 case nParam of
    1: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1');
    2: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1');
    3: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1');
  else
    Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') and
              RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') and
              RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1')
  end;
end;


Function InitializeSetup: Boolean;
Begin
  if not CheckRegGame(0) then
  begin
    MsgBox('На компьютере не найдено установленых игр', mbInformation, MB_OK);
    Result := False;
  end else
  Result := True;
end;


R.i.m.s.k.y. 06-09-2012 17:47 1984296

Johny777, через getIniString я ручками получаю с десяток нужных мне переменных из инишника, заношу только не в аррэй а в десять переменных и с ними дальше работаю. Я вообще не понимаю целесообразности вопроса.

SatHan,
Код:

[ Code]
Function CheckRegGame1: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') then
Result:= True else Result := False;
end;

Function CheckRegGame2: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') then
Result:= True else Result := False;
end;

Function CheckRegGame3: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1') then
Result:= True else Result := False;
end;

Function InitializeSetup: Boolean;
Begin
Result := True;
if ( (CheckRegGame1) and (CheckRegGame2) and (CheckRegGame3) ) then Result := True
else begin
MsgBox('На компьютере не найдено установленых игр', mbInformation, MB_OK);
Result := false;
end;
end;
end.


Snoopak96 06-09-2012 17:58 1984305

SatHan,
Ну скрыть компоненты не получится, тк в инно нет свойства ItemVisible, можно сделать так как вариант:
читать дальше »
Код:

[Setup]
AppName=Extende
AppVersion=1.0
AppVerName=Extende 1.0
DefaultDirName={pf}\Games
DefaultGroupName=Extende
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=ExtSetup
Compression=lzma
SolidCompression=yes

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

[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full

[_Code]
Function CheckRegGame1: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') then Result:= True;
end;

Function CheckRegGame2: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') then Result:= True;
end;

Function CheckRegGame3: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1') then Result:= True;
end;

procedure InitializeWizard;
begin
WizardForm.ComponentsList.Checked[0]:= CheckRegGame1;
WizardForm.ComponentsList.Checked[1]:= CheckRegGame2;
WizardForm.ComponentsList.Checked[2]:= CheckRegGame3;
WizardForm.ComponentsList.ItemEnabled[0]:= CheckRegGame1;
WizardForm.ComponentsList.ItemEnabled[1]:= CheckRegGame2;
WizardForm.ComponentsList.ItemEnabled[2]:= CheckRegGame3;
end;


Johny777 06-09-2012 17:59 1984307

Цитата:

Цитата R.i.m.s.k.y.
заношу только не в аррэй а в десять переменных и с ними дальше работаю »

не использую переменные
вот пример кода Run_Game_CheckBox.Checked := (GetIniString('MySettings', 'Run_Games', '', ExpandConstant('{src}\Selfish.ini')) = '1'); (скоро сам всё увидишь когда докачаешь :) )

Цитата:

Цитата R.i.m.s.k.y.
Я вообще не понимаю целесообразности вопроса. »

повышение скорости работы путём сокращения ненужных действий
ненужное действие у меня выполняется двумя ини - 10 считываний вместо одного

Цитата:

Цитата Snoopak96
Ну скрыть компоненты не получится »

в этом случае их можно прото не добавлять в чеклистбокс таким вот макаром
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(1);
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(3);
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full


[  Code]
Function CheckRegGame(nParam: Integer): Boolean;
begin
 case nParam of
    1: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1');
    2: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1');
    3: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1');
  else
    Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') and
              RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') and
              RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1')
  end;
end;


R.i.m.s.k.y. 06-09-2012 18:02 1984309

Snoopak96, ты в этом ошибаешься, если в моем примере выше подчековая функция вернет фолсе то в списке компонентов соответствующей строчки не будет, проверь сам ;)

Johny777, чуток осталось

Snoopak96 06-09-2012 18:08 1984314

R.i.m.s.k.y., я про свойство ItemVisible, а у тебя строит компонент лист на ходу при старте, путаешь ты =) хотя и так тоже можно сделать.

R.i.m.s.k.y. 06-09-2012 18:13 1984316

Snoopak96, извини, протупил

Ivan_009 06-09-2012 19:43 1984356

Вложений: 1
Snoopak96, Вот глянь пожалуйста....

Snoopak96 06-09-2012 19:59 1984360

Ivan_009, что этот, что тот что прислал в лс у меня всё нормально появляется пб в postinstall, версия инно у меня 5.5.1ee1 (a)

SatHan 06-09-2012 21:00 1984403

R.i.m.s.k.y., опять проблема теперь если один ключ в реестре есть а остальных нет то инсталл выдаёт "На компьютере не найдено установленых игр" а нужно чтоб выдавал это сообщение тогда когда вообще нет ключей в реестре.

Задача такая
Код:

Присутствует в реестре Game_1 инсталл работает но скрыты Game_2 и Game_3

Присутствует в реестре Game_1 инсталл работает
Присутствует в реестре Game_2 инсталл работает но скрыт Game_3

Присутствует в реестре Game_1 инсталл работает
Присутствует в реестре Game_2 инсталл работает
Присутствует в реестре Game_3 инсталл работает

не важно в каком порядке.

Код:

Отсутствует в реестре Game_1,  Game_2 и  Game_3 инсталл не запускается и выдаёт сообщение

Цитата:

Цитата Snoopak96
Ну скрыть компоненты не получится »

не понял. а тада это что

читать дальше »
Код:

[Setup]
AppName=Extende
AppVersion=1.0
AppVerName=Extende 1.0
DefaultDirName={pf}\Games
DefaultGroupName=Extende
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=ExtSetup
Compression=lzma
SolidCompression=yes

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

[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: CheckRegGame1
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: CheckRegGame2
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full; Check: CheckRegGame3

[Files]
Source: Game_1\*; DestDir: {app}\Game_1; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_1
Source: Game_2\*; DestDir: {app}\Game_2; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_2
Source: Game_3\*; DestDir: {app}\Game_3; Flags: ignoreversion recursesubdirs createallsubdirs; Components: game_3

[Icons]
Name: {group}\{cm:UninstallProgram,Extende}; Filename: {uninstallexe}

[#code]
Function CheckRegGame1: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') then
Result:= True;
end;

Function CheckRegGame2: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') then
Result:= True;
end;

Function CheckRegGame3: Boolean;
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1') then
Result:= True;
end;

ведь работает же, только осталось пара нюансов.

Цитата:

Цитата Snoopak96
можно сделать так как вариант: »

интересный вариант, но не то.
Johny777, тоже не то.

Snoopak96 06-09-2012 21:21 1984413

SatHan,
т.е. тоже не то?:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(1);
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(2);
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(3);


[  Code]
Function CheckRegGame(nParam: Integer): Boolean;
begin
 case nParam of
    1: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1');
    2: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1');
    3: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1');
  else
    Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') and
              RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') and
              RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1')
  end;
end;

А по моему это тоже самое, что предлагает R.i.m.s.k.y., только упрощенно + автор Johny777 сделал не большую описку, что простительно.

Snoopak96 06-09-2012 21:56 1984430

SatHan, вот в общем допилил код:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[Components]
Name: game_1; Description: Game_1; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(1);
Name: game_2; Description: Game_2; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(2);
Name: game_3; Description: Game_3; Flags: dontinheritcheck; Types: full; Check: CheckRegGame(3);


[_Code]
Function CheckRegGame(nParam: Integer): Boolean;
begin
 case nParam of
    1: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1');
    2: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1');
    3: Result:= RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1');
  else
    Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') and
              RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') and
              RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1')
  end;
end;

function InitializeSetup:boolean;
begin
if CheckRegGame(1) or CheckRegGame(2) or CheckRegGame(3) then Result:=True else
  if MsgBox('На вашем компьютера не найдено ни одной игры.', mbConfirmation, MB_OK) = IDOK then Result:=False;
end;


SatHan 06-09-2012 22:37 1984454

Цитата:

Цитата Snoopak96
т.е. тоже не то?: »

в том смысле
1. брался за один код а у Johny777 совсем другой (не понятный мне)
2. была та же проблема то есть " если один ключ в реестре есть а остальных нет то инсталл выдаёт "На компьютере не найдено установленых игр" а нужно чтоб выдавал это сообщение тогда когда вообще нет ключей в реестре."
теперь все как нада.

R.i.m.s.k.y., Johny777, Snoopak96, Спасибо вам что выручили.

SatHan 06-09-2012 23:09 1984476

Ещё кое что. Как заставить NewStaticText1 который в TBevel-е вместо {pf}\Application отображать C:\Program Files\Application?

читать дальше »
Код:

[Setup]
AppName=Application
AppVersion=1.0
DefaultDirName={pf}\Application
DefaultGroupName=Application
AllowNoIcons=yes
OutputDir=.

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

[#Code]
var
  ISCustomPage1: TWizardPage;
  Bevel2: TBevel;
  NewStaticText1: TNewStaticText;
  NewStaticText2: TNewStaticText;

procedure RedesignWizardForm;
begin
  ISCustomPage1 := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');

  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

  Bevel2 := TBevel.Create(WizardForm);
  with Bevel2 do
  begin
    Name := 'Bevel2';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(32);
    Top := ScaleY(32);
    Width := ScaleX(346);
    Height := ScaleY(186);
  end;

  NewStaticText1 := TNewStaticText.Create(WizardForm);
  with NewStaticText1 do
  begin
    Name := 'NewStaticText1';
    Parent := ISCustomPage1.Surface;
    Caption := 'Папака установки:';
    Left := ScaleX(56);
    Top := ScaleY(56);
    Width := ScaleX(98);
    Height := ScaleY(14);
  end;

  NewStaticText2 := TNewStaticText.Create(WizardForm);
  with NewStaticText2 do
  begin
    Name := 'NewStaticText2';
    Parent := ISCustomPage1.Surface;
    Caption := '{pf}\Application';
    Left := ScaleX(160);
    Top := ScaleY(56);
    Width := ScaleX(77);
    Height := ScaleY(14);
  end;

  NewStaticText1.TabOrder := 0;
  NewStaticText2.TabOrder := 1;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;


Mailchik 06-09-2012 23:23 1984488

SatHan,
Caption := ExpandConstant('{pf}\Application');

Johny777 07-09-2012 02:31 1984526

Snoopak96,
позволю себе заметить, что функция CheckRegGame рассчитана на отправку из себя булев значений компонентам и функции InitializeSetup
те если мы отправляем ей целое число 1 или 2 или 3 то она возвращает значение соответствующее существованию определённого ключа
если (else) значение не равно 1, 2, 3 то встроенная переменная Result возвращает значение соответствующее существованию всех 3-х ключей
те CheckRegGame(1) or CheckRegGame(2) or CheckRegGame(3) это всё нормуль, но нет смысла гонять функцию 3 раза
достаточно отправить ей например CheckRegGame(777) :)
SatHan,
замени у себя в коде
Код:

function InitializeSetup:boolean;
begin
  if CheckRegGame(любое целое число кроме чисел 1, 2, 3) then Result:=True else
  if MsgBox('На вашем компьютера не найдено ни одной игры.', mbConfirmation, MB_OK) = IDOK then Result:=False;
end;

или, если хочешь оставь как было но удали лишний код:
Код:

  else
    Result := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game1_is1') and
              RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game2_is1') and
              RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Game3_is1')


MogilShik2007 07-09-2012 04:55 1984534

Привет, появилось пару вопросов:

Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usUninstall then
begin
if DirExists(ExpandConstant('{pf}\PCGAME\Игра\Saves')) then
begin
if MsgBox('Удалить сохранения игры?',mbconfirmation, mb_yesno) = IDYES then
begin
DelTree(ExpandConstant('{pf}\PCGAME\Игра\Saves'), True, True, True);
MsgBox('Сохранения игры успешно удалены.', mbinformation, mb_ok);
end;
end;
end;
end;

[UninstallDelete]
Type: dirifempty; Name: "{pf}\PCGAME"
Type: dirifempty; Name: "{pf}\PCGAME\Игра"
Type: files; Name: "{pf}\PCGAME\Игра\log.txt"
Type: files; Name: "{pf}\PCGAME\Игра\multiplayer_log.txt"
Type: files; Name: "{pf}\PCGAME\Игра\stronghold.cfg"

1. Как сделать, чтобы выделенное красным тоже удалялось?
2. Если изменить папку назначения то вся эта фигня бессмысленна, как можно это решить?)))

R.i.m.s.k.y. 07-09-2012 07:25 1984550

MogilShik2007, помоему у тебя кнопка ) западает
2. {app}\PCGAME
1.
Код:

procedure RD(Dir:string);
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure RF(file:string);
begin
  Exec('cmd.exe', ' /c del /F /Q  ' + '"'+file+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then begin
  RD(ExpandConstant('{app}'))
end;
end;


MogilShik2007 07-09-2012 10:16 1984614

Не, неканает {app}, пропускает запрос на удаление сохранений...

Gnom_aka_Lexander 07-09-2012 10:27 1984618

MogilShik2007, смотри. Папка {app}(папка, в которую была установлена программа) это то, что удаляется вообще по всякому. соответственно - проверяем - нету, запрос пропускается - чего не понятно?

MogilShik2007 07-09-2012 10:52 1984631

Разобрался)))

MogilShik2007 07-09-2012 13:08 1984709

Такой вопрос, на странице приветствия когда пишется мол будет установлена такая-то программа или игра, реально как-то название этой проги или игры своим цветом сделать?

Gnom_aka_Lexander 07-09-2012 13:12 1984712

MogilShik2007, Можно.

MogilShik2007 07-09-2012 13:48 1984747

Елки, посмотрел этот ReDrawText, там сам черт ногу сломит(((

MogilShik2007 07-09-2012 16:26 1984819

Усе, победил таки с помощью ReDrawText, оказалась отличная штука)))

Подскажите какие цвета в формате color=$FF0000 поддерживает IS, а то не все хавает.

Ммм, ну и хотелось бы скрипт для полного счастья, чтобы использовать скин при деинсталляции, такой же как и при установке, а то пробовал:

Скрипт
[Setup]
AppName=My prog
AppVerName=My prog
DefaultDirName={pf}\My prog

[Files]
Source: ISSkin.dll; DestDir: {app}; Flags: ignoreversion
Source: Tiger.cjstyles; DestDir: {app}; Flags: ignoreversion

[code]
procedure LoadSkin(lpszPath: string; lpszIniFileName: string );
external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';

procedure LoadSkinUninst(lpszPath: string; lpszIniFileName: string );
external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall delayload setuponly';

procedure UnloadSkinUninst();
external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';

function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Tiger.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result := True;
end;

function InitializeUninstall(): Boolean;
begin
FileCopy(ExpandConstant('{app}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True);
FileCopy(ExpandConstant('{app}\Tiger.cjstyles'), ExpandConstant('{tmp}\Tiger.cjstyles'), True);
LoadSkinUninst(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result := True;
end;

procedure DeinitializeUninstall();
begin
UnloadSkinUninst();
end;


Устанавливаться то со скином устанавливается, а удаляться не хочет выдает ошибку(((

Yury_Prizrak 07-09-2012 17:10 1984833

Всем привет. Такой вопрос - как сделать чекбокс на последней странице с надписью "Запустить сервис?" и, если он нажат выполнить функцию
читать дальше »

Код:

//StartService.
procedure StartService();
var
        ResultCode: Integer;
        ResultString: String;
begin
        //Проверка инстал или апдейт
        if not Installed then
        begin
                ResultString := ExpandConstant('start "' + IdentificationServiceEdit.Text + '"');
        end
        else
        begin
                ResultString := ExpandConstant('start "' + IdentificationService + '"');
        end;

        Exec('net', ResultString, '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;


Yury_Prizrak 07-09-2012 17:30 1984837

Цитата:

Цитата Yury_Prizrak
Всем привет. Такой вопрос - как сделать чекбокс на последней странице с надписью "Запустить сервис?" и, если он нажат выполнить функцию »

Так, это решил, переписал немного функцию и такой RUN:
Filename: net; Parameters: {code:GetStartService}; Description: Запустить сервис; Flags: runhidden nowait postinstall runascurrentuser

Возник следующий вопрос - до этого у меня есть на формак чекбокс установки сервиса. Как теперь спрятать чекбокс на последней странице если файлы сервиса не были установлены

Блин, туплю, извините, 2-ой вопрос тоже решил:
читать дальше »

Код:

[RUN]
Filename: net;  Parameters: {code:GetStartService};  Description: Запустить сервис CVL;  Flags: runhidden nowait postinstall runascurrentuser; Check: ServiceCheck

//Функция проверки чекбокса сервиса
function ServiceCheck: Boolean;
var
        ConfigPathCVLService: String;
begin
    if not Installed then
    begin
      Result := ServiceCheckBox.Checked;
    end
    else
    begin
      ConfigPathCVLService := ExpandConstant('{app}\CVL.CvlService.exe');
      //  проверка наличия севриса
      if FileExists( ConfigPathCVLService ) then
            begin
        Result := True;
      end
      else
      begin
        Result := False;
      end;
    end;
end;


Johny777 07-09-2012 17:45 1984845

Цитата:

Цитата MogilShik2007
Ммм, ну и хотелось бы скрипт для полного счастья, чтобы использовать скин при деинсталляции »

первый пример 2-мя функциями загрузки/выгрузки и решением проблемы выгрузки длл до её инициализации (переменная Install_Runs (спасибо Serega))
читать дальше »
Код:

[Setup]
AppName=My prog
AppVerName=My prog
DefaultDirName={pf}\My prog
UninstallFilesDir={app}\uninstall

[Files]
Source: steam.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}; Flags: ignoreversion nocompression solidbreak sortfilesbyextension; Attribs: hidden system
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}; Flags: ignoreversion nocompression solidbreak sortfilesbyextension; Attribs: hidden system


[  code]
var
  install_Runs: boolean;

procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';

function Load_Skin(Param: String; Skin: String): boolean;
begin
  Result := False;
  case Param of
    'I':
    begin
      ExtractTemporaryFile(Skin);
      LoadSkin(ExpandConstant('{tmp}')+'\steam.cjstyles', '');
      Result := True;
    end;
   
    'U':
    begin
      if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\steam.cjstyles'), ExpandConstant('{tmp}\steam.cjstyles'), True) and
        FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True) then
        LoadSkinU(ExpandConstant('{tmp}\steam.cjstyles'), '');
      Result := True;
    end;
  end;
end;

procedure UnLoad_Skin(Param: String);
begin
  case Param of
    'I':
    begin
      WizardForm.Hide;
      Sleep(227);
      UnloadSkin();
    end;

    'U': UnloadSkinU();
  end;
end;




function InitializeSetup(): Boolean;
begin
  Install_Runs := False;
  Result := Load_Skin('I','steam.cjstyles');
end;

procedure InitializeWizard();
begin
  Install_Runs := True; // в конец процедуры
end;

procedure DeinitializeSetup;
begin
  if install_Runs then UnLoad_Skin('I');
end;

function InitializeUninstall(): Boolean;
begin
  Result := Load_Skin('U','steam.cjstyles');
end;

procedure DeinitializeUninstall();
begin
  UnLoad_Skin('U');
end;


второй простой пример
читать дальше »
Код:

[Setup]
AppName=My prog
AppVerName=My prog
DefaultDirName={pf}\My prog
UninstallFilesDir={app}\uninstall

[Files]
Source: steam.cjstyles; DestDir: {#SetupSetting("UninstallFilesDir")}; Flags: ignoreversion nocompression solidbreak sortfilesbyextension; Attribs: hidden system
Source: isskin.dll; DestDir: {#SetupSetting("UninstallFilesDir")}; Flags: ignoreversion nocompression solidbreak sortfilesbyextension; Attribs: hidden system

[  code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall setuponly';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall setuponly';
procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';
procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';


function InitializeSetup(): Boolean;
begin
    ExtractTemporaryFile('steam.cjstyles');
    LoadSkin(ExpandConstant('{tmp}')+'\steam.cjstyles', '');
    Result := True;
end;

procedure DeinitializeSetup;
begin
    WizardForm.Hide;
    Sleep(227);
    UnloadSkin();
end;

function InitializeUninstall(): Boolean;
begin
    Result := False;

    if FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\steam.cjstyles'), ExpandConstant('{tmp}\steam.cjstyles'), True) and
      FileCopy(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), True) then
      LoadSkinU(ExpandConstant('{tmp}\steam.cjstyles'), '');

    Result := True;
end;

procedure DeinitializeUninstall();
begin
    if FileExists(ExpandConstant('{tmp}\steam.cjstyles')) and FileExists(ExpandConstant('{tmp}\isskin.dll')) then UnloadSkinU();
end;


касательно доп. цветов читай http://forum.oszone.net/showpost.php?p=1885463#

Yury_Prizrak,
зачем тебе лишние логические скобки?
читать дальше »
Код:

      if FileExists( ConfigPathCVLService ) then
            begin
        Result := True;
      end
      else
      begin
        Result := False;
      end;
    end;


можно проще
читать дальше »
Код:

      if FileExists( ConfigPathCVLService ) then Result := True else Result := False;

а если посмотреть на то что функция FileExists возвращает function FileExists(const Name: String): Boolean;
то можно вообще упростить до Result := FileExists( ConfigPathCVLService );
а можно и без функции "ServiceCheck" обратиться напрямую к чекбоксу
if not Installed then ServiceCheckBox.Checked := FileExists(ExpandConstant('{app}\CVL.CvlService.exe')) else ServiceCheckBox.Checked := Installed (или True);

MogilShik2007 08-09-2012 04:47 1985032

Странно, с любым скриптом при использовании деинсталлятора со скином выдает ошибку, вылетает несколько сот окошек, чет ругается, заметил что-то про папку Temp, может из-за того что временная папка в другом месте?

SatHan 08-09-2012 07:17 1985034

MogilShik2007, точнее объясняй что и где. по возможности скрипт в студию. телепаты на каникулах.

MogilShik2007 08-09-2012 17:12 1985184

Скрипты выше, то что Johny777 накидал, да и любой другой скрипт, трабла у всех одна... выбивает с несколькими сотами окон об ошибки, если получиться поймаю скрины...

+ такой вопрос, кто работал с ReDrawText как в скрипте прописать, чтоб работало на разных страницах, а не на одной?
Или на одной, но в разных местах...

SatHan 09-09-2012 00:31 1985367

Вложений: 1
Цитата:

Цитата MogilShik2007
Скрипты выше, то что Johny777 накидал, да и любой другой скрипт, трабла у всех одна... выбивает с несколькими сотами окон об ошибки »

Какие скрипты, то что в данном посте?
Что-то не могу понять, какие ошибки? Вот лично проверил два скрипта оба работают и не какими ошибками при деинсталяции не страдал.

MogilShik2007, Вот прикрепил архив со скриптами что выложил Johny777. У меня всё работает. Проверяй.

MogilShik2007 09-09-2012 09:40 1985443

Удаление работает со скином, но при установке игры, после нажатия на кнопку Готово. вылетают окошки (несколько сотен):


+ такой вопрос, кто работал с ReDrawText как в скрипте прописать, чтоб работало на разных страницах, а не на одной?
Или на одной, но в разных местах...

SatHan 09-09-2012 19:57 1985691

Цитата:

Цитата MogilShik2007
Подскажите какие цвета в формате color=$FF0000 поддерживает IS, а то не все хавает. »

Ещё можно использовать такие значения
читать дальше »
Код:

Color := clRed;
тоесть
Код:

Green - Зелёный
Yellow - Желтый
Red - Красный
Blue - Синий
Lime - Салатовый
Silver - Стальной (Серый)
Olive - Оливковый
Aqua - Аквамарин
Purple - Пурпурный

и вставляешь в
Код:

Color := cl;
то есть
Код:

Color := clСюда;
Только Inno насчёт таких значений слабоват
Например он не знает таких цветов
Цвет Цвет Цвет Цвет Цвет Цвет Цвет Цвет Цвет Цвет Цвет Цвет Цвет


Цитата:

Цитата MogilShik2007
Удаление работает со скином, но при установке игры, после нажатия на кнопку Готово. вылетают окошки (несколько сотен) »

Ты чистый использовал код, из архива? Не куда ли его не добавлял (потому как если ты встраивал в свой скрипт то возможно какие нибудь функции или процедуры конфликтуют).
Переменная Windows %TEMP% стандартная, не изменял?
Так же может быть чего не хватает системе или наоборот чего лишнего.
Я проверял скрипты и на WXP и W7 и ничего подобного не встречал.

SatHan 09-09-2012 22:07 1985775

Ответьте пожалуйста на вопрос.
читать дальше »
Имеется секция [Files] с назначением путей
Код:


[Files]
Source: "File\1\*"; DestDir: "{app}\Section1\"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "File\2\*"; DestDir: "{app}\Section2\"; Flags: ignoreversion recursesubdirs createallsubdirs

ка сделать чтобы каждая секция DestDir
Код:

DestDir: "{app}\Section1\"
DestDir: "{app}\Section2\"

брала пути из реестра?
Код:

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application1_is1]
"Inno Setup: App Path"="C:\\Program Files\\Application1"
и
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application2_is1]
"Inno Setup: App Path"="C:\\Program Files\\Application2"

то есть
Код:

DestDir: "{app}\Section1\"
из
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application1_is1]
"Inno Setup: App Path"="C:\\Program Files\\Application1"
а
DestDir: "{app}\Section2\"
из
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application2_is1]
"Inno Setup: App Path"="C:\\Program Files\\Application2"

если в реестре не находит то ставила в местоположение по умолчанию то есть
Код:

DestDir: "{app}\SectionX\"

Johny777 09-09-2012 23:47 1985859

SatHan,
сделал(ответ на твой вопрос - секция Files, не более) и позволил себе размахнуться(вся секция кода - расширение возможностей (опционально)) ещё дальше :)
(надеюсь не зря!)

пример 1:
читать дальше »
Код:

[Setup]
AppName=Reg_Path_Demo
AppVerName=Reg_Path_Demo
DefaultDirName={pf}\Reg_Path_Demo

// для теста
appid=Application1
//appid=Application2


[Files]
/// первый пример (для наглядности)
/////////////////// путь:........................................через ключ реестра(корневой каталог установленной программы)\Section1 (в эту папку в корневом каталоге)  - это путь только через реестр
Source: "File\1\*"; DestDir: "{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application1_is1,InstallLocation}\Section1"; Flags: ignoreversion recursesubdirs createallsubdirs

/// второй пример (как ты хотел)
/////////////////// путь:.......................................через ключ реестра(корневой каталог установленной программы)|(если ключа нет в {app})\Section2 (в эту папку в корневом каталоге)  - это путь через реестр и в {app}(в {app} если нет ключа)
Source: "File\2\*"; DestDir: "{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application2_is1,InstallLocation|{app}}\Section2"; Flags: ignoreversion recursesubdirs createallsubdirs



[  code]
function Key_Exist: Integer;
var
  Key_1_Exist, Key_2_Exist: boolean;
begin
  Key_1_Exist := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application1_is1');
  Key_2_Exist := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application2_is1');
 
  if Key_1_Exist and Key_2_Exist then Result := 3 else
  if Key_1_Exist then Result := 1 else
  if Key_2_Exist then Result := 2 else
  Result := 0;
end;

procedure Create_Labels(Param: Integer);
begin
  if Param <> 0 then
  begin
    with WizardForm do
    begin
      with TLabel.Create(nil) do
      begin
        Parent := SelectDirPage;
        case Param of
          1:
          begin
            SelectDirBrowseLabel.Caption := 'Путь установки 2:';
            DirEdit.Top := DirEdit.Top + ScaleY(30);
            DirBrowseButton.Top := DirEdit.Top - ScaleY(1);
            Caption := 'Путь установки 1: ' + RemoveBackslash(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application1_is1,InstallLocation}'));
            SetBounds(DirEdit.Left, DirEdit.Top - ScaleX(60), DirEdit.Width, ScaleY(90));
          end;

          2:
          begin
            SelectDirBrowseLabel.Caption := 'Путь установки 1:';
            Caption := 'Путь установки 2: ' + RemoveBackslash(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application2_is1,InstallLocation}'));
            SetBounds( DirEdit.Left, DirEdit.Top + ScaleX(60), DirEdit.Width, ScaleY(90));
          end;

          3:
          begin
            Caption := 'Путь установки 1: ' + RemoveBackslash(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application1_is1,InstallLocation}')) + #13#10 + #13#10 + #13#10 + #13#10 +
                      'Путь установки 2: ' + RemoveBackslash(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application2_is1,InstallLocation}'));
            SetBounds( DirEdit.Left, DirEdit.Top, DirEdit.Width, ScaleY(90));
          end;
        end;
      end;
      SelectDirBrowseLabel.Height := ScaleY(16);
      SelectDirBrowseLabel.Top := DirEdit.Top - SelectDirBrowseLabel.Height;
    end;
  end;
end;

procedure InitializeWizard();
var
  a: Integer;
begin
  a := Key_Exist;
 
  with WizardForm do
  begin
    DirEdit.Visible := a <> 3;
    if not DirEdit.Visible then
    begin
      DirBrowseButton.Visible := DirEdit.Visible;
      SelectDirBrowseLabel.Visible := DirEdit.Visible;
    end;
  end;
 
  Create_Labels(a);
end;



обрати внимание на это символ |

пример 2(сделал как для себя бы хотел). Рекомендую:
читать дальше »
Код:

#define Section_1 "Section1"
#define Section_2 "Section2"

[Setup]
AppName=Reg_Path_Demo
AppVerName=Reg_Path_Demo
DefaultDirName={pf}\Reg_Path_Demo

// для теста
appid=Application1
//appid=Application2               


[Files]
Source: "File\1\*"; DestDir: "{code:Get_Path_0}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "File\2\*"; DestDir: "{code:Get_Path_1}"; Flags: ignoreversion recursesubdirs createallsubdirs


[  code]
var
  Page: TInputDirWizardPage;
 
 
function Get_Path_0(Param: String): String;
begin
  Result := Page.Values[0];
end;


function Get_Path_1(Param: String): String;
begin
  Result := Page.Values[1];
end;


function Key_Exist: Integer;
var
  Key_1_Exist, Key_2_Exist: boolean;
begin
  Key_1_Exist := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application1_is1');
  Key_2_Exist := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application2_is1');
 
  if Key_1_Exist and Key_2_Exist then Result := 3 else
  if Key_1_Exist then Result := 1 else
  if Key_2_Exist then Result := 2 else
  Result := 0;
end;


procedure InitializeWizard();
begin
  Page:=CreateInputDirPage(wpWelcome,'копирование файлов', 'Укажите каталоги','',False,'NewFolder');
  with Page do
  begin
    Add('путь 1:');
    Add('путь 2:');
   
    case  Key_Exist of
      1:
      begin
        Values[0] := RemoveBackslash(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application1_is1,InstallLocation}')) + '\{#Section_1}';
        Values[1] := 'C:\{#Section_2}';
      end;
     
      2:
      begin
        Values[0] := 'C:\{#Section_1}';
        Values[1] := RemoveBackslash(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application2_is1,InstallLocation}')) + '\{#Section_2}';  //
      end;
     
      3:
      begin
        Values[0] := RemoveBackslash(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application1_is1,InstallLocation}')) + '\{#Section_1}';
        Values[1] := RemoveBackslash(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application2_is1,InstallLocation}')) + '\{#Section_2}';  //
      end;
   
      0:
      begin
        Values[0] := 'C:\{#Section_1}';
        Values[1] := 'C:\{#Section_1}';
      end;
    end;
  end;
end;

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
begin
  Result := 'путь 1:' + NewLine + Space + Page.Values[0] + NewLine + NewLine + 'путь 2:' + NewLine + Space + Page.Values[1];
end;


function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := PageID = wpSelectDir;
end;







MogilShik2007,
по ошибке трудно(для меня даже невозможно) определить косяк
покажи лучше код с файлами
может смогу исправить!

MogilShik2007 10-09-2012 03:44 1985914

Вложений: 1
2 SatHan, Johny777:

Системе все хватает, временная папка изменена на C:\Temp, но не думаю, что это должно сильно влиять, так как установка со скинами происходит без проблем. А скрипт конечно объединял со своим.

MogilShik2007 10-09-2012 12:10 1986058

Вложений: 1
2 Johny777, вот со всеми приблудами)))

MogilShik2007 10-09-2012 15:44 1986160

Блин чертовщина какая-то((( А временная папка у тебя по умолчанию?

SatHan 10-09-2012 16:12 1986182

MogilShik2007, всё верно. После установки вываливаются несколько сотен окошек.
только ты не указал конкретно.
Я же тебя русским языком спрашивал
Цитата:

Цитата SatHan
Ты чистый использовал код, из архива? »

пишешь что
Цитата:

Цитата MogilShik2007
Удаление работает со скином, но при установке игры, после нажатия на кнопку Готово. вылетают окошки (несколько сотен): »

либо
Цитата:

Цитата MogilShik2007
так как установка со скинами происходит без проблем. »

.
Там по ходу дело в совместимости скриптов. Что-то где-то не так наковырял в скрипте вот тебе и выдаёт сотни окошек.

MogilShik2007 10-09-2012 16:14 1986183

SatHan, посмотри скрипт если не трудно, пост 907, мож мысля какая появится)))

SatHan 10-09-2012 17:00 1986207

Цитата:

Цитата MogilShik2007
посмотри скрипт если не трудно, пост 907»

я ещё новичёк в скриптах.
Смотри, если это

читать дальше »
Код:

procedure InitializeWizard();
var
//Определяем поле ввода пароля
PasswordEdit: TPasswordEdit;
begin
  Mylbl:= tLabel.Create(WizardForm);
  MyLbl.AutoSize:= False;
  MyLbl.WordWrap:= true;
  MyLbl.SetBounds(0, 0, 301, 73);
  MyLbl.Parent:= WizardForm.WelcomeLabel2;
  WizardForm.DirEdit.OnChange:= @EditOnChange;
  WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text+#0;
  ProgressLabel:=TLabel.Create(WizardForm)
    ProgressLabel.Top:= 4
    ProgressLabel.Left:= 200
    ProgressLabel.Caption:= '0%'
    ProgressLabel.AutoSize:= True
    ProgressLabel.Font.Color:= clBlue
    ProgressLabel.Font.Style:= [fsBold]
    ProgressLabel.Transparent:= True
    ProgressLabel.Parent:= WizardForm.ProgressGauge
  WizardForm.PasswordEdit.Text := '        ';
  ExtractTemporaryFile('MicrosoftClassic15.bmp');
  bmp := TBitmap.create;
  bmp.LoadFromFile(ExpandConstant('{tmp}\MicrosoftClassic15.bmp'));
    enablefire(WizardForm.WelcomePage.Handle, 0, 0, bmp.Handle, 50);
end;

За-комментировать то ошибок не выдаёт, скорее всего чего то не хватает только не знаю чего, мож гуру подскажут.

MogilShik2007 10-09-2012 18:14 1986244

Эм, в смысле закомментировать? А то я тож несилен в скриптах)))

SatHan 10-09-2012 18:23 1986245

MogilShik2007, Закомментировал я для теста.
Цитата:

Цитата MogilShik2007
Эм, в смысле закомментировать? А то я тож несилен в скриптах))) »

Нет, нужно разобрать что к чему.

Найти конфликт и решить его.

Johny777 10-09-2012 19:43 1986276

MogilShik2007,
ошибки не вылавливаю но в коде у тебя ошибка
нет выгрузки библиотеки отвечающей за анимацию огня
читать дальше »
Код:

procedure DeinitializeSetup; /// процедура деинициализации - выполняется при отмене и поле завершения работы(задачи) инсталла
begin
  disablefire(); /// выключаем анимацию огня
  bmp.Free; /// разрушаем картинку на которой был огонь

  WizardForm.Hide;
  Sleep(227);
  UnloadSkin();
end;


будь внимательнее тк пример огня не настолько большой чтоб что-то забыть!
пример:
читать дальше »
Код:

[Setup]
AppName=Inno FireCtrl
AppVerName=Inno FireCtrl
DefaultDirName={pf}\Inno FireCtrl
DefaultGroupName=Inno FireCtrl
OutputDir=.

[Files]
Source: firectrl.dll; Flags: dontcopy
Source: White.bmp; Flags: dontcopy

[  code]
function enablefire(ParentWnd: HWND; Left, Top: integer; Bmp: HBITMAP;FireAlpha: integer): BOOL; external 'enablefire@files:firectrl.dll stdcall';
function disablefire(): BOOL; external 'disablefire@files:firectrl.dll stdcall';

var
  bmp: TBitmap;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('White.bmp');
  bmp := TBitmap.create;
  bmp.LoadFromFile(ExpandConstant('{tmp}\White.bmp'));
  enablefire(WizardForm.WelcomePage.Handle, 0, 0, bmp.Handle, 500);
end;

procedure DeinitializeSetup();
begin
  disablefire();
  bmp.Free;
end;


Цитата:

Цитата MogilShik2007
А временная папка у тебя по умолчанию? »

как винду переставил так и стоит всё
не менял и даже не знаю как :)

====================================================================================

Посоны! :grin:
мой вопрос касательно загрузки всего ini файла в переменную с последующим считыванием из этой самой переменной всё ещё более чем в силе!
http://forum.oszone.net/post-1984015-858.html
прошу дать мне простой пример с которого смогу оттолкнуться

SatHan 10-09-2012 21:18 1986324

Цитата:

Цитата Johny777
даже не знаю как »

Да всё просто (Если интересно конечно)
Для WXP

Сначала создаём папку Temp, например на диске C:\
Мой компьютер - Свойства переходим во вкладку Дополнительно
Внизу щелкаем по кнопке Переменные среды
В окошке Переменные среды пользователя XXX (Где XXX ваше имя пользователя)
находим переменные TEMP и TMP в обоих случаях меняем значение %USERPROFILE%\Local Settings\Temp например на %SYSTEMDRIVE%\Temp.
Проверяем Win+R вводим %TEMP% жмём ок

Для W7 (Аналогично)

Создаём папку Temp, например на диске C:\
Мой компьютер - Свойства - Дополнительные параметры системы
Появится Свойства системы во вкладке Дополнительно находим кнопку Переменные среды
В окошке Переменные среды пользователя XXX (Где XXX ваше имя пользователя)
находим переменные TEMP и TMP в обоих случаях меняем значение %USERPROFILE%\AppData\Local\Temp например на %SYSTEMDRIVE%\Temp.
Проверяем Win+R вводим %TEMP% жмём ок

P.S Лично меня и по умолчанию устраивает :tongue:.

Johny777 11-09-2012 01:22 1986440

SatHan,
апдейт предыдущего кода:
читать дальше »
Код:


#define Section_1 "Section1"
#define Section_2 "Section2"

[Setup]
AppName=Reg_Path_Demo
AppVerName=Reg_Path_Demo
DefaultDirName={pf}\Reg_Path_Demo

// для теста
//appid=Application1
appid=Application2


[Files]
Source: "File\1\*"; DestDir: "{code:Get_Path_0}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "File\2\*"; DestDir: "{code:Get_Path_1}"; Flags: ignoreversion recursesubdirs createallsubdirs


[  code]
var
  Page: TInputDirWizardPage;

function Get_Path_0(Param: String): String;
begin
  Result := Page.Values[0];
end;

function Get_Path_1(Param: String): String;
begin
  Result := Page.Values[1];
end;

procedure InitializeWizard();
begin
  Page:=CreateInputDirPage(wpWelcome,'копирование файлов', 'Укажите каталоги','',False,'NewFolder');
  with Page do
  begin
    Add('путь 1:');
    Values[0] := RemoveBackslash(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application1_is1,InstallLocation|C:}')) + '\{#Section_1}';
    Add('путь 2:');
    Values[1] := RemoveBackslash(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application2_is1,InstallLocation|C:}')) + '\{#Section_2}';  //
  end;
end;

function UpdateReadyMemo(Space, NewLine, MemoUserInfoInfo, MemoDirInfo, MemoTypeInfo, MemoComponentsInfo, MemoGroupInfo, MemoTasksInfo: String): String;
begin
  Result := 'путь 1:' + NewLine + Space + Page.Values[0] + NewLine + NewLine + 'путь 2:' + NewLine + Space + Page.Values[1];
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := PageID = wpSelectDir;
end;



Цитата:

Цитата SatHan
Если интересно конечно »

Спасибо!
взял на заметку
мало ли может пригодится

MogilShik2007 11-09-2012 05:27 1986466

Johny777, спасибо заработало, интересует:

Код:

enablefire(WizardForm.WelcomePage.Handle, 0, 0, bmp.Handle, 50);
у тебя стоит значение 500, эт что такое?

SatHan, там еще 2 переменных меняется
С:\Windows\Temp ))))


И еще, фон окон, можно немного сероватым сделать, скрипт есть какой нибудь простой?

SatHan 11-09-2012 10:39 1986541

Цитата:

Цитата MogilShik2007
там еще 2 переменных меняется
С:\Windows\Temp )))) »

читать дальше »
Об этом в курсе. то находится в окне Системные переменные.
Они относятся к общей группе будь ты Администратор или Пользователь. я про них не стал описывать из соображений (мало ли). Нет смысла их трогать.
А Переменные среды пользователя XXX - это относится к текущей учётной записи в которой можешь добавлять, изменять и удалять (если знаешь что к чему). туда можно например добавить что то своё. скажем какую нибудь папку. к примеру жмём Создать [Переменная - 7Z] [Значение - C:\Program Files\7-Zip\] и при выполнении %7Z% перейдёт в папку C:\Program Files\7-Zip\
Да хоть Inno. Переменная - INNO, Значение - C:\Program Files\Inno Setup 5\ итог %INNO%

MogilShik2007 11-09-2012 11:10 1986550

Я знаю, эт так к слову написал)))

SatHan, ты кстати с ReDrawText не сталкивался? А то не пойму как разноцветный текст на разных страницах делать)))

El Sanchez 11-09-2012 13:56 1986641

Цитата:

Цитата Johny777
мой вопрос касательно загрузки всего ini файла в переменную с последующим считыванием из этой самой переменной всё ещё более чем в силе! »

Johny777, я б забил на это дело, но если очень хочется:
читать дальше »

Код:

type
    TIniFile = array of record
        Section: String;    //секция
        Entries: array of record    //массив записей Name - Value, относящихся к секции
            Name: String;    //параметр
            Value: String;    //значение
        end;
    end;

function ParseIniFile(const Filename: String): TIniFile;
var
    iFile: TArrayOfString;
    i: Integer;
begin
    if not FileExists(Filename) then Exit;
    SetArrayLength(Result, 0);
    LoadStringsFromFile(Filename, iFile);
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        //для всех непустых строк, исключая комментарии
        if (iFile[i] <> '') and (Copy(iFile[i], 1, 1) <> ';') then
        begin
            //если строка является секцией...
            if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
            begin
                //...пишем в результат имя секции...
                SetArrayLength(Result, GetArrayLength(Result)+1);
                Result[GetArrayLength(Result)-1].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
            end
                else
            begin
                //...иначе пишем пару параметр/значение
                SetArrayLength(Result[GetArrayLength(Result)-1].Entries, GetArrayLength(Result[GetArrayLength(Result)-1].Entries)+1);
                Result[GetArrayLength(Result)-1].Entries[GetArrayLength(Result[GetArrayLength(Result)-1].Entries)-1].Name := Trim(Copy(iFile[i], 1, Pos('=', iFile[i])-1));
                Result[GetArrayLength(Result)-1].Entries[GetArrayLength(Result[GetArrayLength(Result)-1].Entries)-1].Value := Trim(Copy(iFile[i], Pos('=', iFile[i])+1, Length(iFile[i])));
            end;
        end;
    end;
end;

procedure InitializeWizard();
var
    iFile: TIniFile;
    i, j: Integer;
    res: String;
begin
    iFile := ParseIniFile('c:\boot.ini');
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        res := res + '[' + iFile[i].Section + ']' + #13#10;
        for j := 0 to GetArrayLength(iFile[i].Entries)-1 do
            res := res + iFile[i].Entries[j].Name + '=' + iFile[i].Entries[j].Value + #13#10;
    end;
    MsgBox(res, mbInformation, MB_OK);
end;


Johny777 11-09-2012 14:26 1986664

El Sanchez,
Спасибо тебе большое за труды! :)

Но неужели "загрузка всего ини в переменную..." не даст почувствовать особую разницу скорости обработки между считыванием строк из переменной и многократным обращением к файлу?

и извиняюсь за тупой вопрос
как теперь считывать значения?

так не работает

iFile := ParseIniFile('C:\setup\Selfish.ini');
...
No_Quit_Dialog := (GetIniString('Constructor', 'Quit_Dialog_Off', '', res) = '1');

неужели он перестал быть ини и теперь нужно искать строку Quit_Dialog_Off=1 целиком

R.i.m.s.k.y. 11-09-2012 14:43 1986679

Цитата:

Цитата Johny777
Но неужели "загрузка всего ини в переменную..." не даст почувствовать особую разницу скорости обработки между считыванием строк из переменной и многократным обращением к файлу? »

Дисковый кэш нивелирует разницу
ИМХО

El Sanchez 11-09-2012 14:43 1986680

Цитата:

Цитата Johny777
Но неужели "загрузка всего ини в переменную..." не даст почувствовать особую разницу скорости обработки между считыванием строк из переменной и многократным обращением к файлу? »

Johny777, тесты покажут. Например, миллион раз прочитать какое либо значение из ini-файла стандартными средствами и пропарсить файл и миллион раз обратиться к какому-либо члену структуры, засечь время, сравнить.

R.i.m.s.k.y. 11-09-2012 14:45 1986682

SatHan, можно еще прописать все эти пути в переменную %PATH%
Но темпы желательно переносить в папки 8.3, без пробелов и русских букв. Как системные темпы, так и пользовательские.
Во избежание.

El Sanchez 11-09-2012 15:34 1986715

Цитата:

Цитата Johny777
как теперь считывать значения? »

Цитата:

Цитата Johny777
неужели он перестал быть ини и теперь нужно искать строку Quit_Dialog_Off=1 целиком »

Johny777, раз это теперь массив записей, то обращение по индексу. Смотри мой пример внимательней, в конце после отработки ParseIniFile идет обращение к элементам массива. Каждый i-ый элемент iFile содержит запись, состоящей из поля Section и поля Entries - массива записей, содержащих 2 поля - Name и Value. Обращение к i-ой секции - iFile[i].Section, к j-ому параметру i-ой секции - iFile[i].Entries[j].Name, к значению j-ого параметра i-ой секции - iFile[i].Entries[j].Value.

Цитата:

Цитата El Sanchez
тесты покажут. Например, миллион раз »

Потестил, на моей машине обращение к элементам массива примерно в 120 раз быстрее.

Aleksoid1978 11-09-2012 15:51 1986727

Всем привет. На днях нашел тут код как Закрепить значок на панели задач в Win7. Все получилось, кроме одного - при наличии на панели уже такого ярлыка - создается ярлык типа MPC-BE(2).lnk;

Вот сам код
Код:

const
  installer_mutex = 'mpcbe_setup_mutex';
  LOAD_LIBRARY_AS_DATAFILE = $2;

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryExW@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadStringW@user32.dll stdcall';

// thank for code to "El Sanchez" from forum.oszone.net
procedure PinToTaskbar(Filename: String; IsPin: Boolean);
var
        hInst: THandle;
  buf: array [0..255] of char;
  i, Res: Integer;
  strVerb: String;
  objShell, colVerbs: Variant;
begin
  if not FileExists(Filename) then Exit;
  if IsPin then Res := 5386 else Res := 5387;
  begin
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
      for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
      try
        objShell := CreateOleObject('Shell.Application');
      except
        ShowExceptionMessage;
        Exit;
      end;
      colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
      for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then
      begin
        colVerbs.Item[i].DoIt;
        Break;
      end;
    finally
      FreeDLL(hInst);
    end;
  end;
end;

вот вызов
Код:

if IsTaskSelected('pintotaskbar') then begin
    PinToTaskbar(ExpandConstant('{app}\{#mpcbe_exe}'), True);
end;

Получается что задать вручную имя ярлыка в этом случае я немогу. Подскажите гуру Inno :)

SatHan 11-09-2012 16:01 1986733

Цитата:

Цитата R.i.m.s.k.y.
пути в переменную %PATH% »

Спасибо что напомнили. Как раз интересовал вопрос по этому поводу.

Системные переменные
Переменная - Path, значение - %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem
появилась необходимость к значению %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem добавить C:\Program Files\Progs
В идеале при установке должно получится так
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Progs
как это сделать через инно?
в секции [setup] нашёл ChangesEnvironment=true только мне это мало о чём говорит.

El Sanchez 11-09-2012 17:42 1986815

Цитата:

Цитата SatHan
появилась необходимость к значению %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem добавить C:\Program Files\Progs
В идеале при установке должно получится так
%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\Program Files\Progs
как это сделать через инно? »

SatHan, можно, конечно, и в секции Registry это сделать:
Код:

Root: HKLM; Subkey: SYSTEM\CurrentControlSet\Control\Session Manager\Environment; ValueType: expandsz; ValueName: Path; ValueData: {olddata};{app}; Flags: noerror
Но нужно еще проверять наличие вносимого значения, чтобы второй (и больше) раз не вносить одно и тоже, а также удалить значение при деинсталляции. Поэтому лучше свою процедуру накидать. Например:
читать дальше »

Код:

procedure ManagePathVariable(Variable: String; IsAddVariable: Boolean); //Variable - добавляемое значение; IsAddVariable - флаг добавить/удалить значение
var
    Path: String;
begin
    if RegQueryStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', Path) then
    begin
        if IsAddVariable then
            if Pos(Lowercase(Variable), Lowercase(Path)) = 0 then
                RegWriteExpandStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', Path + ';' + Variable);
        if not IsAddVariable then
            if Pos(Lowercase(Variable), Lowercase(Path)) > 0 then
            begin
                StringChangeEx(Path, ';' + Variable, '', True);
                RegWriteExpandStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 'Path', Path);
            end;
    end;
end;

//пример вызова
procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then ManagePathVariable('%ORACLE_HOME%', True);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
    if CurUninstallStep = usPostUninstall then ManagePathVariable('%ORACLE_HOME%', False);
end;



Цитата:

Цитата SatHan
в секции [setup] нашёл ChangesEnvironment=true только мне это мало о чём говорит. »

SatHan, разумеется, нужна эта директива

MogilShik2007 11-09-2012 18:01 1986829

Господа, может просветите)))
При работе с ReDrawText как в скрипте прописать, чтоб работало на разных страницах, а не на одной?
Или на одной, но в разных местах...

Или как по другому цвет нужных слов на разных страницах менять?

Johny777 11-09-2012 18:43 1986846

El Sanchez,
блин
чуть мозг себе не спалил нафиг :)
но допер таки как использовать

Код:

procedure InitializeWizard();
var
    iFile: TIniFile;
    i, j: Integer;
    res: String;
begin
    iFile := ParseIniFile('C:\setup\Selfish.ini');
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        res := res + '[' + iFile[i].Section + ']' + #13#10;
        for j := 0 to GetArrayLength(iFile[i].Entries)-1 do
            res := res + iFile[i].Entries[j].Name + '=' + iFile[i].Entries[j].Value + #13#10;
    end;
    MsgBox(res, mbInformation, MB_OK);
   

    //// первая 2-ка - номер секции (отсчёт от нуля) вторая 2-ка - номер ключа секциии(отсчёт от нуля)
    Variable := iFile[2].Entries[2].Value  = '1'      /// отсчёт от нуля
    if Variable = True then MsgBox('ок', mbInformation, MB_OK);
end;

скажи только пожалуйста как получить индекс ключа и секции по имени оных?

Цитата:

Цитата El Sanchez
на моей машине обращение к элементам массива примерно в 120 раз быстрее. »

Здраво!
конечно смысла считывать из одной секции значение одного ключа - слишком, но для длинных ini этот код себя 120 раз оправдает

=============================================================

Цитата:

Цитата Aleksoid1978
Получается что задать вручную имя ярлыка в этом случае я немогу. »

что ты имеешь в виду под именем?
на панели задач ярлыки - только иконки
если ты имеешь в виду имя файла, то файл(вместе с путём к нему) к которому ты хочешь протянуть ярлык указывается в первом входном параметре функции PinToTaskbar

R.i.m.s.k.y. 11-09-2012 18:48 1986849

El Sanchez, SatHan, я тоже поначалу так пробовал, полная фигня получается
Теперь делаю через стороннюю утилитку pathman
Код:

[Run]
Filename: {app}\PATHMAN.EXE; Parameters: " /as ""{app}"""; Flags: runhidden waituntilterminated

[UninstallRun]
Filename: {app}\PATHMAN.EXE; Parameters: " /rs ""{app}\"""; Flags: runhidden waituntilterminated


El Sanchez 11-09-2012 23:14 1987039

Цитата:

Цитата Johny777
скажи только пожалуйста как получить индекс ключа и секции по имени оных? »

Johny777, перебором элементов массив(ов)а. Ты, пока не исправил свой пост, использовал функцию IndexOf класса TStrings. С его использованием код можно упростить, ведь в арсенале TStrings есть все необходимое для обработки строк типа name=value:
читать дальше »

Код:

type
    TIniFile = array of record
        Section: String;
        Entries: TStringList;
    end;

function ParseIniFile(const Filename: String): TIniFile;
var
    iFile: TArrayOfString;
    i: Integer;
begin
    if not FileExists(Filename) then Exit;
    SetArrayLength(Result, 0);
    LoadStringsFromFile(Filename, iFile);
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        //для всех непустых строк, исключая комментарии
        if (iFile[i] <> '') and (Copy(iFile[i], 1, 1) <> ';') then
        begin
            //если строка является секцией...
            if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
            begin
                //...пишем в результат имя секции...
                SetArrayLength(Result, GetArrayLength(Result)+1);
                Result[GetArrayLength(Result)-1].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
            end
                else
            begin
                //...иначе пишем пару параметр/значение
                if TObject(Result[GetArrayLength(Result)-1].Entries) = nil then
                    Result[GetArrayLength(Result)-1].Entries := TStringList.Create;
                Result[GetArrayLength(Result)-1].Entries.Append(iFile[i]);
            end;
        end;
    end;
end;

//своя функция для чтения значений параметров из секций
function GetIniValue(const Section, Key, Default: String; iFile: TIniFile): String;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key];
            Break;
        end;
        Break;
    end;
end;

procedure InitializeWizard();
var
    iFile: TIniFile;
    i: Integer;
    res: String;
begin
    //парсим ini-файл
    iFile := ParseIniFile('d:\Program Files (x86)\Inno Setup 5\projects\johny777\test.ini');

    //пример 1 - выводим на экран содержимое ini-файла, используя созданную переменную iFile
    for i := 0 to GetArrayLength(iFile)-1 do
        res := res + '[' + iFile[i].Section + ']' + #13#10 + iFile[i].Entries.Text;
    MsgBox(res, mbInformation, MB_OK);
   
    //пример 2 - выводим на экран значение параметра name34 секции section2, используя созданную переменную iFile и свою функцию GetIniValue
    MsgBox(GetIniValue('section2', 'name34', '', iFile), mbInformation, MB_OK);
end;



Цитата:

Цитата R.i.m.s.k.y.
я тоже поначалу так пробовал, полная фигня получается
Теперь делаю через стороннюю утилитку pathman »

R.i.m.s.k.y., например? Это вполне нормальный способ, вышеназванная утилита делает то же самое.

Johny777 12-09-2012 01:22 1987086

Цитата:

Цитата El Sanchez
Ты, пока не исправил свой пост, использовал функцию IndexOf класса TStrings »

да
пока не подумал, что не подходит тк у тебя свой тип - TIniFile и что нужна самописная функция поиска индекса
Оказалось в правильном направлении подумал (радует :) )

Цитата:

Цитата MogilShik2007
ReDrawText не сталкивался? А то не пойму как разноцветный текст на разных страницах делать »

а в чём собственно говоря проблема?
ты же судя по коду уже сделал разноцветный текст на первой странице
вот держи
у меня есть другой пример отрисовки текста http://sendfile.su/668402
попробуй с ним
используй функцию
function WriteText(s: string; Left, Top, Right: integer; Parent: TWinControl): TLabelString;
.............название(твой текст; слева, сверху, ширина; родитель(например WizardForm.WelcomePage):

Цитата:

Цитата MogilShik2007
у тебя стоит значение 500, эт что такое? »

кажись интенсивность огня
поиграйся с настройкой - узнаешь

вот держи набор китайских библиотек с примерами http://sendfile.su/668398

Aleksoid1978 12-09-2012 01:58 1987088

Johny777,
Цитата:

Цитата Johny777
что ты имеешь в виду под именем?
на панели задач ярлыки - только иконки
если ты имеешь в виду имя файла, то файл(вместе с путём к нему) к которому ты хочешь протянуть ярлык указывается в первом входном параметре функции PinToTaskbar »

Я говорил про имя создаваемого ярлыка.

Johny777 12-09-2012 02:14 1987090

Цитата:

Цитата Aleksoid1978
Я говорил про имя создаваемого ярлыка. »

я не совсем догоняю
смотри скрин



у значков в панели задач (куда функция El Sanchez-а их закрепляет) нет имени

SatHan 12-09-2012 02:18 1987092

Цитата:

Цитата Johny777
у значков в панели задач (куда функция El Sanchez-а их закрепляет нет имени) »

это наверно то когда наводишь и показывается имя ярлыка? Так это наверно комментарий (подсказка) а не название ярлыка. а у панели не замечал чтоб ещё название было.

Aleksoid1978 12-09-2012 02:26 1987093

Johny777
Да это обычный ярлык на самом деле, только "закрепленный" на панели задач.
вот все мои "значки" с панели

видим имя ярлыка для Оперы(она сама его так сделала при установке)
и вот как показывается на панели задач.

Johny777 12-09-2012 02:28 1987094

SatHan,
только что прикрепил
PinToTaskbarWin7('C:\hl2.exe') - просто положил экзешник в C
всплыла подсказка "Half-Life 2"


хех
даже винда знает об этой игре! :)

Цитата:

Цитата Aleksoid1978
и вот как показывается на панели задач. »

аналогично


SatHan 12-09-2012 02:31 1987096

Цитата:

Цитата Johny777
даже винда знает об этой игре! »

у игр и приложений обычно должно так быть, ещё кроме "производитель", "дата" - в свойства эксешника посмотри, есть?

Johny777 12-09-2012 02:37 1987098

Цитата:

Цитата SatHan
"производитель", "дата" - в свойства эксешника посмотри, есть? »

есть цифровая подпись продлённая до конца этого года
дата есть
вот
изучай

MogilShik2007 12-09-2012 06:32 1987117

Johny777, спасибо, а не подскажешь как прикрутить огонь на последнюю страницу?

Aleksoid1978 12-09-2012 08:30 1987141

Нашел косяк в скрипте Закрепления на панели задач - если в х64 битной системе и файл расположен по пути "C:\Program Files\..." - то значок программы закреплаяется, но если запустить программу - создается еще один значок, уже запущенной задачи на панели задач, если закрепить из пути "C:\Program Files (x86)\..." - то все ок. Разрядность программы при этом не имеет значения.

P.S. - как верно закрепить нашел, вот кусок
Код:

                          if IsWin64 and (Pos (ExpandConstant ('{pf64}\'), Filename) = 1) then begin
                                  sVBSFile := GenerateUniqueName (GetTempDir, 'mpc_be.vbs');

                                  SaveStringToFile (sVBSFile, \
                                          'Set oShell=CreateObject("Shell.Application")'  + #13 + \
                                          'Set oVerbs=oShell.NameSpace("' + ExtractFileDir (Filename) + '").ParseName("' + ExtractFileName (Filename) + '").Verbs' + #13 + \
                                          'For Each oVerb In oVerbs'                                                                                        + #13 + \
                                          '  If (oVerb="' + strVerb + '") Then'                                                + #13 + \
                                          '    oVerb.DoIt'                                                                                                                    + #13 + \
                                          '    Exit For'                                                                                                                            + #13 + \
                                          '  End If'                                                                                                                                + #13 + \
                                          'Next'                                                                                                                                , False);
 
                                  ExecAsOriginalUser (ExpandConstant ('{win}\Sysnative\cscript.exe'), '"' + sVBSFile + '" /B', '', SW_HIDE, ewWaitUntilTerminated, i);
                                  DeleteFile (sVBSFile);
                          end

Закрепляется нормально, но вот открепиться нормально не может.

P.S. - все разобрался.

Ivan_009 12-09-2012 09:02 1987153

Как наложить кнопки свернуть и закрыть через ботву...Подскажите кто знает...

Johny777 12-09-2012 16:42 1987445

изменил код из шапки "поиск по маске" под свои нужды
кому пригодится забирайте:
читать дальше »
Код:

[Setup]
AppName=Reg_Path_Demo
AppVerName=Reg_Path_Demo
DefaultDirName={pf}\Reg_Path_Demo


[  code]
function FindFileByMask(Path, Mask: string): Boolean;
var
  FSR: TFindRec;
  FindResult: Boolean;
begin
  Result:= False;
  if Path[Length(Path)] <> '\' then Path:= Path + '\';
  FindResult:= FindFirst(Path + Mask, FSR);
  try
    while FindResult do
    begin
      if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
      begin
        Result:= True;
        Exit;
      end;
      FindResult:= FindNext(FSR);
    end;
  finally
    FindClose(FSR);
  end;
end;


procedure InitializeWizard();
begin
  /// использование
  ///FindFileByMask(...........путь к папке...........,маска(расширение))
  if FindFileByMask(ExpandConstant('{pf}\Inno Setup 5'), '*.dll') = True then MsgBox('ok', mbInformation, MB_OK);
end;



Ivan_009,
извиняй
ботву не знаю :(

vint56 12-09-2012 17:26 1987467

Как наложить кнопки свернуть и закрыть через ботву...Подскажите кто знает...
http://rghost.ru/40324331

nik1967 12-09-2012 20:27 1987562

Ivan_009, vint56,
а так можно без InnoCallback.dll (на расширенной версии)
Код:

#include "botva2.iss"

#define CloseBtnPic "closebtn.png"
#define MinimizeBtnPic "minimizebtn.png"

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
SolidCompression=yes
Compression=lzma2/ultra64

[Files]
Source: Files\*; DestDir: "{tmp}"; Flags: dontcopy sortfilesbyextension

[ Code]
var
  hMinimizeBtn,
  hCloseBtn: HWND;
   

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
  Result:=True;
end;

procedure CloseBtnClick(hBtn:HWND);
begin
  WizardForm.Close;
end;

procedure MinimizeBtnClick(hBtn:HWND);
begin
  SendMessage(WizardForm.Handle,$0112,61472,0);
end;

procedure InitializeWizard;
begin
  ExtractTemporaryFile('{#CloseBtnPic}');
  ExtractTemporaryFile('{#MinimizeBtnPic}');
  with WizardForm do begin
    BorderStyle:=bsNone;
    Bevel.Hide;
    InnerNotebook.Hide;
    OuterNotebook.Hide;
    Width:=640;
    Height:=240;
    Position:=poScreenCenter;
    Color := cl3DDkShadow;
  end;

  hCloseBtn:=BtnCreate(WizardForm.Handle,556,5,22,22,ExpandConstant('{tmp}')+'\{#CloseBtnPic}',3,False);
  BtnSetEvent(hCloseBtn,BtnClickEventID,CallbackAddr('CloseBtnClick'));

  hMinimizeBtn:=BtnCreate(WizardForm.Handle,529,5,22,22,ExpandConstant('{tmp}')+'\{#MinimizeBtnPic}',3,False);
  BtnSetEvent(hMinimizeBtn,BtnClickEventID,CallbackAddr('MinimizeBtnClick'));
end;

procedure DeinitializeSetup;
begin
  gdipShutdown;
end;


HElmo 12-09-2012 20:43 1987575

Всем привет, что-то не получается с компонентами.
читать дальше »
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Mods"
#define MyAppVersion "1.0"
#define MyAppPublisher "Mods"
#define MyAppURL "Mods"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{5ACDEBF9-5182-444F-B068-0B3C07C67F44}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\Games\World of tanks\World_of_tanks\res_mods\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=C:\Users\Admin\Desktop
OutputBaseFilename=ModsHelmo
Compression=lzma
SolidCompression=yes

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

[Types]
Name: "Full"; Description: "Полная установвка"
Name: "Custom"; Description: "Выборочная установка"

[Components]
Name: "Pricels"; Description: "Все прицелы"; Types: Custom Full
Name: "DamagePanel"; Description: "Панель урона"; Types: Custom Full
Name: "Clock"; Description: "Часы+калькулятор в ангаре"; Types: Custom Full

[Files]
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\gui\flash\crosshair_panel_arcade.swf"; DestDir: "{app}"; DestName: "Аркадный"; Flags: ignoreversion; Components: Pricels
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\gui\flash\crosshair_panel_postmortem.swf"; DestDir: "{app}"; DestName: "Дополнения"; Flags: ignoreversion; Components: Pricels
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\gui\flash\crosshair_panel_sniper.swf"; DestDir: "{app}"; DestName: "Снайперский(стратегический)"; Flags: ignoreversion; Components: Pricels
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\gui\flash\crosshair_panel_strategic.swf"; DestDir: "{app}"; DestName: "Артилерийский(стратегический)"; Flags: ignoreversion; Components: Pricels
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\gui\flash\crosshair_sniper.swf"; DestDir: "{app}"; DestName: "Снайперский"; Flags: ignoreversion; Components: Pricels
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\gui\flash\crosshair_strategic.swf"; DestDir: "{app}"; DestName: "Артилерийский"; Flags: ignoreversion; Components: Pricels
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\gui\flash\DamagePanel.swf"; DestDir: "{app}"; DestName: "Damage Panel"; Flags: ignoreversion; Components: DamagePanel
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\gui\flash\logos.swf"; DestDir: "{app}"; DestName: "Часы"; Flags: ignoreversion; Components: Clock


Но при запуске инсталлятора, просто выбор: полная или выборочная, но нету где что отмечать галочками. Справку читал, вроде все как там делаю...Помогите..

Gnom_aka_Lexander 12-09-2012 20:45 1987578

HElmo, а так?

Код:

[Types]
Name: "Full"; Description: "Полная установвка"; Flags : iscustom;


HElmo 12-09-2012 20:56 1987582

Gnom_aka_Lexander, Точно, совсем забыл!! Спасибо. А можно где-нибудь прописать, что бы не создавался деинсталлятор? Заранее спасибо.

R.i.m.s.k.y. 12-09-2012 21:01 1987587

HElmo,
Вот держи рабочий код сразу на два твоих вопроса, и даже больше чтобы несколько раз дверью не скрипеть
Код:

//универсальная переменная названия дистрибутива
# define SmoothVideoProject "SmoothVideoProject v.3.1"

[Setup]
// не создавать деинсталятор
Uninstallable=false

[Types]
// типы установки
Name: full; Description: Рекомендуемая (полная) установка
Name: compact; Description: Минимальная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
// для каждого типа установки - свой набор компонентов
Name: SmoothVideoProject; Description: {#SmoothVideoProject}; Types: full
Name: SVPtube; Description: {cm:SVPtube}; Types: compact;
Name: LAV; Description: {cm:mpclavreg}; Types: custom;

[Languages]
// языки инсталлера
Name: russian; MessagesFile: compiler:Languages\Russian.isl;
Name: english; MessagesFile: compiler:Languages\English.isl;

[CustomMessages]
// сообщения в списке компонентов в зависимости от выбранного языка
english.SVPtube=SVPTube v.1.0 (Play YouTube clips in you favorite player)
russian.SVPtube=SVPTube v.1.0 (Воспроизведение роликов YouTube в любимом плеере)
english.mpclavreg=Install and register LAV
russian.mpclavreg=Установить и зарегистрировать LAV

__________

Сообщение помогло? Жми "полезное сообщение" внизу поста

HElmo 12-09-2012 21:27 1987596

R.i.m.s.k.y., спасибо, очень помог!!! Все получилось, рад, что есть такие люди.

Ivan_009 12-09-2012 21:44 1987609

Как можно решить проблему с текструированной кнопкой отмена через ботву... Дело в том, что когда я переключаю на ssPostInstall
невозможно отменить установку... Вернее можно но только один раз :o
Вот код наложения кнопок...

R.i.m.s.k.y. 12-09-2012 22:38 1987647

HElmo, да не за что, это я тут поднаторел, вот должок возвращаю ;)

SatHan 13-09-2012 14:34 1987952

Johny777, Ну да ошибочка вышла.
Вот он скрин

если создать ярлык на рабочем столе и обозвать любым именем после закрепить на панели то при наведении такое же имя будет и на панели.
насколько понял нужно что-то вроде {#выделил красным}
Код:

Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
этого.
Если код каким то образом находит имя и приписывает его к ярлыку - это конечно не понятно от куда берёт. А вот как его задать на своё (Например я хочу чтоб hl.exe назывался не Half-Life а Half-Life-Моя Игра). Как это сделать? В коде ничего знакомого не нашёл.

MogilShik2007 13-09-2012 17:39 1988070

Johny777 как через TextModule на последней странице текст возле чекбокса разрисовать, мол запустить игру такую-то, а название игры своим текстом?

HElmo 13-09-2012 18:33 1988108

Ещё одна небольшая проблема:
Нужно включить все вложенные папки, сделал вот так вот..
Код:

Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\vehicles\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Tankmodels
Но, при установке, инсталлятор распаковывает только подпапки, а саму папку нет.. что делать и как быть?

Johny777 13-09-2012 19:42 1988148

Добрые люди!
вот намутил код
при нажатии на айтем всплывающего контекстного меню его название копируется в соответствующий эдит
но иногда нужно приписать соответствующее число (как с текстом +fps_max <число>)
для этого выполняется функция Param_Num

не знаю как не допускать ввод в этот самый эдит букв например через в OnKeyPress). Там могут быть только целые числа (иногда любое чисто кроме нуля а иногда именно что 0 или 1 или 2 или 3)
в общем возможности функции пока что хромают :(

вот код:

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application



[  code]
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord; external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: LongWord; uPosition, uFlags: UINT): BOOL; external 'DeleteMenu@user32.dll stdcall';
function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLongA@user32.dll stdcall';
function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLongA@user32.dll stdcall';

var
  Param_Edit: TEdit;
  Param_Button, OK_Button: TButton;
  Param_PopMenu: TPopupMenu;
   
   
procedure Num_Edit_OnChange(Sender:TObject);
begin
  OK_Button.Enabled := TEdit(Sender).Text <> '';
end;
   
   
function Param_Num(Param, Info_Text: String): String;
var
  NumForm: TForm;
  Num_Edit: TEdit;
begin
  Result := '';

  NumForm := TForm.Create(nil);
  with NumForm do
  begin
    ClientWidth := ScaleX(200);
    ClientHeight := ScaleY(90);
    Position := poScreenCenter;
    DeleteMenu(GetSystemMenu(NumForm.Handle,False), $F060,0); /// сделать кнопку "закрыть" неактивной
    SetClassLong(NumForm.Handle, -26, GetClassLong(NumForm.Handle, -26) or $200); /// блокировка комбинации alt + f4
   
    with TLabel.Create(nil) do
    begin
      SetBounds(ScaleX(10), ScaleY(5), ScaleX(207), ScaleY(16));
      Caption := Info_Text;
      Parent := NumForm;
      Font.Size := 8;
    end;
   
    Num_Edit := TNewEdit.Create(nil);
    with Num_Edit do
    begin
      Parent := NumForm;
      SetBounds(ScaleX(10), ScaleY(30), ScaleX(145), ScaleY(21));
      Text := '';
      OnChange := @Num_Edit_OnChange;
    end;

    OK_Button := TButton.Create(nil)
    with OK_Button do    // ok
    begin
      SetBounds(NumForm.ClientWidth - ScaleX(80), ScaleY(60), ScaleX(70), ScaleX(23));
      Parent := NumForm;
      Caption := ExpandConstant(SetupMessage(msgButtonOK));
      ModalResult := mrOk;
      Enabled := False;
    end;

    if ShowModal = mrOk then
    begin
      Delete(Param,Pos('<число>',Param),Length(Param));
      Result := Param + ' ' + Num_Edit.Text;
    end;

    Free;
  end;
end;

procedure Paste(Sender:TObject);
begin
  case TMenuItem(Sender).Caption of
    '-console':          if Param_Edit.Text = '' then Param_Edit.Text := TMenuItem(Sender).Caption else Param_Edit.Text := Param_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '+fps_max <число>':  if Param_Edit.Text = '' then Param_Edit.Text := + Param_Num(TMenuItem(Sender).Caption, 'сколько кадров в секунду?') else Param_Edit.Text := Param_Edit.Text + ' ' + Param_Num(TMenuItem(Sender).Caption, 'сколько кадров в секунду?');
    '-dev':              if Param_Edit.Text = '' then Param_Edit.Text := TMenuItem(Sender).Caption else Param_Edit.Text := Param_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '-gl':                if Param_Edit.Text = '' then Param_Edit.Text := TMenuItem(Sender).Caption else Param_Edit.Text := Param_Edit.Text + ' ' + TMenuItem(Sender).Caption;
  end;
end;

procedure Param_Button_OnClick(Sender:TObject);
var
  pt: TPoint;
begin
  pt := Param_Button.ClientToScreen(pt);
  Param_PopMenu.Popup(pt.x, pt.y);
end;


procedure InitializeWizard();
begin
  WizardForm.OuterNotebook.Hide;

  Param_Edit := TNewEdit.Create(nil);
  with Param_Edit do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(100), ScaleY(100), ScaleX(145), ScaleY(21));
    Text := '';
  end;
 
  Param_Button := TButton.Create(nil);
  with Param_Button do
  begin
    Parent := WizardForm;
    SetBounds(Param_Edit.Left + Param_Edit.Width + ScaleX(5), Param_Edit.Top, ScaleX(15), Param_Edit.Height);
    Caption := '!';
    Cursor := crHand;
    OnClick := @Param_Button_OnClick;
  end;
 
  Param_PopMenu := NewPopupMenu(WizardForm, 'MyPopupMenu', paLeft, True, [
    NewItem('-console', 0, False, True, @Paste, 11, ''),
    NewLine,
    NewItem('+fps_max <число>', 0, False, True, @Paste, 12, ''),
    NewItem('-dev', 0, False, True, @Paste, 13, ''),
    NewItem('-gl', 0, False, True, @Paste, 14, '')
  ]);
end;




==================================================================================================== =======================================

HElmo,
может так? (подчеркнул правку)
Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\vehicles\*"; DestDir: "{app}\vehicles"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Tankmodels

==================================================================================================== =======================================

MogilShik2007,
путём создания кастомнго чекбокса
(тк с чеклистбоксами я ещё, образно говоря, не бухал :) )

читать дальше »
Код:

#define MyAppExeName "Stronghold.exe"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[  Code]
#include "TextModule.iss"

var
  Run_CheckBox: TNewCheckBox;
  Run_Label: TLabelString;
 
procedure Color_Label_OnClick(Sender:TObject);
begin
  if not Run_CheckBox.Checked then
  begin
    Run_CheckBox.Checked := True;
    Exit;
  end else
  begin
    Run_CheckBox.Checked := False;
    Exit;
  end
end;

procedure InitializeWizard();
var
  w, s, h: Integer;
begin
  Run_CheckBox := TNewCheckBox.Create(nil);
  with Run_CheckBox do
  begin
    Parent := WizardForm.FinishedPage;
    SetBounds(ScaleX(224),ScaleY(248),ScaleX(17),ScaleY(17))
  end;

  w := ScaleX(100); /// ширина
  s := Run_CheckBox.Top + ScaleY(2); /// сверху
  h := Run_CheckBox.Left + ScaleX(17); /// слева
 
  Run_Label := WriteText('[color=$0000ff]Запустить[/color] [b][u][color=$00ff00]Игру[/color][/u][/b]',h,s,w,WizardForm.FinishedPage);

  with TLabel.Create(nil) do
  begin
    SetBounds(h, s, w, ScaleY(17));
    AutoSize := False;
    OnClick := @Color_Label_OnClick;
    Parent := WizardForm.FinishedPage;
    Transparent := True;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
  if (CurStep = ssDone) and (Run_CheckBox.Checked = True) then Exec(ExpandConstant('{app}\{#MyAppExeName}'), '', ExpandConstant('{app}'), SW_HIDE, ewNoWait, ErrorCode);
end;



==================================================================================================== ======================================

SatHan,
не думаю что функция рассчитана на протягивание ярлыка от ярлыка (как бы бредово это не звучало)
те в экзешнике может и есть инфа благодаря которой мы имеем правильное назвния а в ярлыке нет

Tco 03 13-09-2012 23:04 1988293

Цитата:

Цитата SatHan
Если код каким то образом находит имя и приписывает его к ярлыку - это конечно не понятно от куда берёт. А вот как его задать на своё (Например я хочу чтоб hl.exe назывался не Half-Life а Half-Life-Моя Игра). Как это сделать? »

Ты в этом коде итак задал имя ярлыка:
Код:

Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon
Напиши вместо: {#MyAppName} что хочешь и будет тебе счастье.
Код:

Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Half-Life - Моя Игра"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon

SatHan 14-09-2012 02:26 1988366

Цитата:

Цитата Johny777
не думаю что функция рассчитана на протягивание ярлыка от ярлыка (как бы бредово это не звучало)
те в экзешнике может и есть инфа благодаря которой мы имеем правильное назвния а в ярлыке нет »

чем и как он её берёт, какой функцией или процедурой и можно ли задать в ней в качестве имени ярлыка препроцессор?

Цитата:

Цитата Tco 03
Ты в этом коде итак задал имя ярлык »

причём здесь Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon? её я здесь написал для примера. интересует для windows 7. как в качестве имя ярлыка на панели задач указать в коде препроцессор {#MyAppName}?

Цитата:

Цитата Tco 03
Напиши вместо: {#MyAppName} что хочешь и будет тебе счастье. »

с препроцессором как раз проблем нет - там можно любое название написать. даже "Half-Life - Моя Игра". его удобно использовать во многих случаях а не только для названий.

Tco 03 14-09-2012 11:37 1988512

Я её тебе тоже для примера написал...
#define NameQuickLaunch "Half-Life - Моя Игра"
...Microsoft\Internet Explorer\Quick Launch\{#NameQuickLaunch}...

El Sanchez 14-09-2012 13:13 1988566

Цитата:

Цитата Aleksoid1978
Нашел косяк в скрипте Закрепления на панели задач »

Aleksoid1978, в чем именно? Скрипт закрепления ярлыка на панели задач - это порт vbs-сценария, представленного вами (кстати, у вас в примере не используется самое главное - переменная strVerb) и гуляющего в интернете.
Цитата:

Цитата Aleksoid1978
если в х64 битной системе и файл расположен по пути "C:\Program Files\..." - то значок программы закреплаяется, но если запустить программу - создается еще один значок, уже запущенной задачи на панели задач, если закрепить из пути "C:\Program Files (x86)\..." - то все ок. Разрядность программы при этом не имеет значения. »

Aleksoid1978, это верно. Гугл выдает, что эта проблема у многих программ возникает. Думаю, что система при вызове кода закрепления ярлыка программы из Program Files, system32 (т.е. для директорий, предназначенных для 64-битных файлов) из 32-битной программы, коей является Inno, тихо редиректит 64-битные директории на 32-битные. Да, созданный ярлык ссылается куда надо, но похоже имеет разные AppID с иконкой запущенного того же самого приложения, поэтому система и не может их сгруппировать. Как-то так, я могу и ошибаться, точнее программисты скажут, которые вплотную работают с API таскбара.
Цитата:

Цитата Aleksoid1978
Все получилось, кроме одного - при наличии на панели уже такого ярлыка - создается ярлык типа MPC-BE(2).lnk; »

Aleksoid1978, кстати да, я не учел наличие ярлыка. Исправление:
читать дальше »

Код:

const
    LOAD_LIBRARY_AS_DATAFILE = $2;

#define A = (Defined UNICODE) ? "W" : "A"

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';
function SHGetNewLinkInfo(pszLinkTo, pszDir: String; var pszName: Char; var pfMustCopy: Longint; uFlags: UINT): BOOL; external 'SHGetNewLinkInfo{#A}@shell32.dll stdcall';

/////////////////////////////////////////////////////////////////////////
function PinToTaskbar(const szFilename: String; IsPin: Boolean): Boolean;
//szFilename: full path to executable file
//IsPin: False - unpin to TaskBar, True - pin from TaskBar
var
    hInst: THandle;
    buf: array [0..255] of Char;
    i, res: Integer;
    strLnk, strVerb: String;
    objShell, colVerbs: Variant;
begin
    Result := False;
    if (GetWindowsVersion < $06010000) or not FileExists(szFilename) then Exit;
    if IsPin then
    begin
        if SHGetNewLinkInfo(szFilename, ExpandConstant('{tmp}'), buf[0], res, 0) then
        begin
            while buf[Length(strLnk)] <> #0 do Insert(buf[Length(strLnk)], strLnk, Length(strLnk)+1);
            if FileExists(ExpandConstant('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName(strLnk)) then Exit;
        end;
        res := 5386;
    end else res := 5387;
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
        for i := 0 to LoadString(hInst, res, buf[0], 255)-1 do Insert(buf[i], strVerb, i+1);
        try
            objShell := CreateOleObject('Shell.Application');
            colVerbs := objShell.Namespace(ExtractFileDir(szFilename)).ParseName(ExtractFileName(szFilename)).Verbs;
            for i := 1 to colVerbs.Count do if CompareText(colVerbs.Item[i].Name, strVerb) = 0 then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        except
            Exit;
        end;
    finally
        FreeDLL(hInst);
    end;
end;



Цитата:

Цитата Johny777
не знаю как не допускать ввод в этот самый эдит букв например через в OnKeyPress »

Johny777, напиши в обработчике OnKeyPress:
Код:

if Pos(Key, '0123456789'#8) = 0 then Key := #0;
P.S. Но копипастой все равно можно будет вставить что угодно. :(

Gnom_aka_Lexander 14-09-2012 13:28 1988583

Цитата:

Цитата El Sanchez
если в х64 битной системе и файл расположен по пути "C:\Program Files\..." - то значок программы закреплаяется, но если запустить программу - создается еще один значок, »

Это нормально. Даже х64 приложения работают с эмуляцией х86. До сих пор. И это не более, чем косяк разработчиков. Обратите внимание, что далеко не все приложения так себя ведут. Поэтому способ добавления значка тут совершенно ни при чем, и работает он вполне корректно. а второй значек - при запуске приложения х64 - создается параллельный поток, в котором запускается тоже самое приложение, но в среде эмуляции х32 ( то, как я это вижу ), отсюда и появление второго значка - процесс-то уже другой.
Поправьте меня, если я не прав.

Ivan_009 14-09-2012 21:47 1988843

Как сделать так чтобы если папка не пустая в которую устанавливается игра то выводилось сообщение типа:
Папка установки не пустая пожалуйста выберите другую!

R.i.m.s.k.y. 14-09-2012 22:09 1988858

Ivan_009,
Код:

[Setup]
DirExistsWarning=yes


MogilShik2007 15-09-2012 10:20 1988996

Вложений: 1
Помогите со скриптом, чет с чекбоксом не получается:
не отображается текст рядом с чекбоксом и не видит .ехе

Ivan_009 15-09-2012 10:42 1989001

Вложений: 1
Как сделать такие края через ботву...Если можно пример...Заранее спасибо...

nik1967 15-09-2012 11:13 1989010

Цитата:

Цитата Ivan_009
Как сделать такие края в инсталляторе без ботвы..... »

Цитата:

Цитата Ivan_009
Как сделать такие края через ботву.. »

Чё, издеваешься? http://forum.oszone.net/post-1972601.html#post1972601 Какая фиг разница - с ботвой, без ботвы...

Ivan_009 15-09-2012 12:19 1989036

nik1967, мне нужно чтобы с прозрачностью... :yes:

Ivan_009 15-09-2012 12:47 1989045

Вложений: 1
Как текструировать кнопку при нажатии на которую появлялся логотип png... :search:

vint56 15-09-2012 14:03 1989077

помогите дописать пожалуйста действие к нопкам Ok и Back
читать дальше »
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[code]
var
BrowseDialogTitle,BrowseDialogTitle1,BrowseDialogLabel:Tlabel;
DirBrowseSetting: TButton;
DirBrowseSettingPage, SetParameters: Boolean;
Edit: TNewEdit;
DirTreeView : TFolderTreeView;
Browse, OK, NO, back, new : TButton;

MainPanelBig1,MainPanelBig2: TPanel;
MainPanelBigBevel,BevelForm,BevelForm1,BevelForm2: TBevel;


procedure Okclick(Sender: TObject);
begin
//WizardForm.Enabled:=True;
WizardForm.DirEdit.Text:=AddBackslash(Edit.Text);
end;

procedure BackClick(Sender: TObject);
begin
Edit.Text:=AddBackslash(ExpandConstant('{pf}\')+'My Application');
DirTreeView.ChangeDirectory(AddBackslash(ExpandConstant('{pf}\')), True);
end;

procedure NOclick(Sender: TObject);
begin
WizardForm.Enabled:=true;
end;


procedure DirFolderChange(Sender: TObject);
Begin
Edit.Text:=AddBackslash(DirTreeView.Directory) + 'My Application';
end;

procedure FormClose(Sender: TObject; var Action: TCloseAction);
begin
WizardForm.Enabled:=true;
end;

procedure DirBrowseSettingOnClick(Sender: TObject);
begin
if DirBrowseSettingPage = False then begin
DirBrowseSetting.Hide;
WizardForm.NextButton.Hide;

BrowseDialogTitle := TLabel.Create(WizardForm);
BrowseDialogTitle.SetBounds(ScaleX(19),ScaleY(5),ScaleX(135),ScaleY(16));
BrowseDialogTitle.Font.Style:=[fsBold];
BrowseDialogTitle.Font.Size:= 10;
BrowseDialogTitle.Transparent := True;
BrowseDialogTitle.Parent := WizardForm;
BrowseDialogTitle.Caption := 'Обзор папок';
BrowseDialogTitle.Font.Name := 'Tahoma';
BrowseDialogTitle.Font.Height := -13;

BrowseDialogTitle1 := TLabel.Create(WizardForm);
BrowseDialogTitle1.SetBounds(ScaleX(30),ScaleY(25),ScaleX(365),ScaleY(13));
BrowseDialogTitle1.Transparent := True;
BrowseDialogTitle1.Parent := WizardForm;
BrowseDialogTitle1.Caption := 'В какую папку Вы хотите установить игру?';

MainPanelBig1 := TPanel.Create(WizardForm);
MainPanelBig1.Parent := WizardForm;
MainPanelBig1.SetBounds(ScaleX(20),ScaleY(69),ScaleX(541),ScaleY(261));
MainPanelBig1.Caption := '';

MainPanelBig2 := TPanel.Create(WizardForm);
MainPanelBig2.Parent := MainPanelBig1;
MainPanelBig2.SetBounds(ScaleX(10),ScaleY(11),ScaleX(520),ScaleY(239));
MainPanelBig2.BevelOuter := bvLowered;
MainPanelBig2.Caption := '';

MainPanelBigBevel := TBevel.Create(WizardForm);
MainPanelBigBevel.Style := bsRaised;
MainPanelBigBevel.Parent := MainPanelBig2;
MainPanelBigBevel.SetBounds(ScaleX(9),ScaleY(10),ScaleX(500),ScaleY(220));

Edit:= TNewEdit.Create(WizardForm);
Edit.SetBounds(ScaleX(20),ScaleY(20),ScaleX(480),ScaleY(21));
Edit.Text:=WizardForm.DirEdit.text;
Edit.Parent:= MainPanelBig2;
Edit.Font.Color:=clBlack;

DirTreeView:= TFolderTreeView.Create(WizardForm);
DirTreeView.SetBounds(ScaleX(20),ScaleY(50),ScaleX(480),ScaleY(170));
DirTreeView.OnChange:=@DirFolderChange;
DirTreeView.Parent:=MainPanelBig2;

DirTreeView.ChangeDirectory(AddBackslash(WizardForm.dirEdit.Text), true);
Edit.Text:=(DirTreeView.Directory);

BrowseDialogLabel := TLabel.Create(WizardForm);
BrowseDialogLabel.SetBounds(ScaleX(130),ScaleY(335),ScaleX(365),ScaleY(13));
BrowseDialogLabel.Transparent := True;
BrowseDialogLabel.Parent := WizardForm;
BrowseDialogLabel.Caption := 'Выберите папку из списка и нажмите «OK».';

Back:=tbutton.create(WizardForm)
with back do begin
SetBounds(ScaleX(16),ScaleY(351),ScaleX(100),ScaleY(30));
parent:=WizardForm;
Caption:='Сброс';
onclick:=@BackClick;
end;

Ok:=tbutton.create(WizardForm)
with ok do begin
SetBounds(ScaleX(126),ScaleY(351),ScaleX(100),ScaleY(30));
parent:=WizardForm;
Caption:='OK';
onclick:=@OKclick;
end;

No:=tbutton.create(WizardForm)
with no do begin
SetBounds(ScaleX(236),ScaleY(351),ScaleX(100),ScaleY(30));
parent:=WizardForm;
Caption:='Отмена';
onclick:=@NOclick;
end;


DirBrowseSettingPage:= True;
end else begin
BrowseDialogTitle.Hide;
BrowseDialogTitle1.Hide;
BrowseDialogLabel.Hide;

MainPanelBig1.Hide;
MainPanelBig2.Hide;
MainPanelBigBevel.Hide;

DirBrowseSettingPage:= False;
SetParameters:= True;
DirBrowseSetting.Caption:= 'Обзор...';
end;
end;



procedure InitializeWizard();
begin
WizardForm.ClientWidth:=ScaleX(580);
WizardForm.ClientHeight:=ScaleY(410);
WizardForm.Center;
WizardForm.OuterNotebook.Hide;
WizardForm.InnerNotebook.Hide;
WizardForm.Color := clMenu;

WizardForm.NextButton.SetBounds(ScaleX(460),ScaleY(374),ScaleX(110),ScaleY(30));
WizardForm.CancelButton.SetBounds(ScaleX(487),ScaleY(500),ScaleX(110),ScaleY(30));
WizardForm.BackButton.SetBounds(ScaleX(344),ScaleY(374),ScaleX(110),ScaleY(30));
WizardForm.Bevel.SetBounds(ScaleX(0),ScaleY(365),ScaleX(580),ScaleY(2));
WizardForm.Bevel.Parent := WizardForm;
WizardForm.Bevel.BringToFront;
WizardForm.Bevel1.SetBounds(ScaleX(0),ScaleY(47),ScaleX(580),ScaleY(2));
WizardForm.Bevel1.Parent := WizardForm;
WizardForm.Bevel1.BringToFront;

DirBrowseSetting := TNewButton.Create(WizardForm);
with DirBrowseSetting do
begin
Name := 'DirBrowseSetting';
Parent := WizardForm;
SetBounds(ScaleX(100),ScaleY(375),ScaleX(110),ScaleY(30));
Caption := 'Настройки';
OnClick:= @DirBrowseSettingOnClick;
end;
end;

nik1967 15-09-2012 15:30 1989112

vint56, зачем усложнять? Проще сделать через дополнительную страницу.
P.S. Закос решил сделать под наш инсталл?

HElmo 15-09-2012 18:44 1989195

Почему при запуске инсталятора он создает две папки Mods, как мне надо и Modsscrips, в которую распаковывает эту папку. Почему так?
Код:

Source: "D:\GAMES\World of tanks\World_of_Tanks\res_mods\0.7.5\system\*"; DestDir: "{app}\system"; Flags: ignoreversion recursesubdirs createallsubdirs; Components: Skybox

MogilShik2007 15-09-2012 18:50 1989199

Johny777, твой предыдущий скрипт выдает ошибку вместе с моим(((

SatHan 15-09-2012 19:05 1989210

Подскажите пожалуйста. как поменять скорость выкатки/закатки окна побыстрее? код от сюда
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[#code]
var
  SettingPanel  : TPanel;
  Flag          : boolean;
  Timer          : LongWord;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer1;
begin
  if SettingPanel.Top < 0 then SettingPanel.Top := SettingPanel.Top + ScaleY(3);
  if SettingPanel.Top = 0 then KillTimer(WizardForm.Handle, Timer);
end;

procedure Timer2;
begin
  if SettingPanel.Top > -315 then SettingPanel.Top := SettingPanel.Top - ScaleY(3);
  if SettingPanel.Top = -315 then KillTimer(WizardForm.Handle, Timer);
end;


procedure HideShow(Sender: TObject);
begin
  KillTimer(WizardForm.Handle, Timer);
  case Flag of
  True :
    begin
      Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('Timer2'));
      TButton(Sender).Caption:='Show';
    end;
  False :
    begin
      Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('Timer1'));
      TButton(Sender).Caption:='Hide';
    end;
  end;
  Flag:= not Flag;
end;


procedure InitializeWizard();
 begin
  Flag:= False;

  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  with TButton.Create(WizardForm) do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;



Цитата:

Цитата Johny777
теперь ни копипастой »

проверил. копипастой вставляется и мышью и через клаву ctrl+v.

Johny777 16-09-2012 16:12 1989678

SatHan,
Цитата:

Цитата SatHan
как поменять скорость выкатки/закатки окна побыстрее? »

Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('Timer1'));
в таймере выполняется процедура Timer1
5 - частота обновления таймера (в миллисекундах (в 1 секунде 1000)). Иначе говоря выполнения указанной процедуры
в самой процедуре стоит

....панель.сверху := панель.свеху + 3 пикселя
SettingPanel.Top := SettingPanel.Top + ScaleY(3);

те мы каждые пять миллисекунд двигаем панель на 3 пикселя

MogilShik2007,
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
begin
  если (этап установки = после нажатия на кнопку завершить) и (такой_чекбокс.отмечен) то Запустить(расшифровать константу(расположение экзешника)). парамеьров нет, рабочая папка, спрятать консольное окно, не ждать, Переменная в которую пишется код ошибки))
  if (CurStep = ssDone) and (Run_CheckBox.Checked = True) then Exec(ExpandConstant('{app}\{#MyAppExeName}'), '', ExpandConstant('{app}'), SW_HIDE, ewNoWait, ErrorCode);
end;


Snoopak96 17-09-2012 16:53 1990357

vint56,
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[__code]
var
BrowseDialogTitle,BrowseDialogTitle1,BrowseDialogLabel:Tlabel;
Edit: TNewEdit;
i:Integer;
DirTreeView : TFolderTreeView;
Browse, OK, NO, back, new,DirBrowseSetting: TButton;
MainPanelBigBevel: TBevel;
DirPanel,MainPanelBig1,MainPanelBig2: TPanel;

procedure Okclick(Sender: TObject);
begin
WizardForm.DirEdit.Text:=AddBackslash(Edit.Text);
if DirPanel.Visible then DirPanel.hide;
end;

procedure BackClick(Sender: TObject);
begin
Edit.Text:=AddBackslash(ExpandConstant('{pf}\')+'My Application');
DirTreeView.ChangeDirectory(AddBackslash(ExpandConstant('{pf}\')), True);
end;

procedure NOclick(Sender: TObject);
begin
DirTreeView.ChangeDirectory(AddBackslash(WizardForm.dirEdit.Text), true);
Edit.Text:=(DirTreeView.Directory);
if DirPanel.Visible then DirPanel.hide;
end;

procedure DirFolderChange(Sender: TObject);
Begin
Edit.Text:=AddBackslash(DirTreeView.Directory) + 'My Application';
end;

procedure DirBrowseSettingOnClick(Sender: TObject);
begin
if not DirPanel.Visible then DirPanel.show;
end;

procedure InitializeWizard();
begin
WizardForm.ClientWidth:=ScaleX(580);
WizardForm.ClientHeight:=ScaleY(410);
WizardForm.Center;
WizardForm.OuterNotebook.Hide;
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel.hide;
WizardForm.Bevel1.hide;
WizardForm.Color := clMenu;

WizardForm.NextButton.SetBounds(ScaleX(460),ScaleY(374),ScaleX(110),ScaleY(30));
WizardForm.CancelButton.SetBounds(ScaleX(487),ScaleY(500),ScaleX(110),ScaleY(30));
WizardForm.BackButton.SetBounds(ScaleX(340),ScaleY(374),ScaleX(110),ScaleY(30));
WizardForm.DirEdit.Parent:=WizardForm;
WizardForm.DirEdit.SetBounds(ScaleX(20),ScaleY(200),ScaleX(350),ScaleY(30));

 DirBrowseSetting := TButton.Create(WizardForm);
with DirBrowseSetting do begin
 Parent := WizardForm;
 SetBounds(ScaleX(340),ScaleY(374),ScaleX(110),ScaleY(30));
 Caption := 'Настройки';
 OnClick:= @DirBrowseSettingOnClick;
end;

  DirPanel:= Tpanel.Create(WizardForm);
with DirPanel do begin
  Parent:=WizardForm;
  BevelOuter:= bvNone;
  Align:=alClient;
  hide;
end;

  for i:=0 to 3 do
    begin
      with TBevel.Create(WizardForm) do
        begin
          BringToFront;
          Shape:=bsTopLine;
            Case i of
              0:
                begin
                  Parent:=WizardForm;
                  SetBounds(ScaleX(0),ScaleY(365),ScaleX(580),ScaleY(2));
                end;
              1:
                begin
                  Parent:=DirPanel;
                  SetBounds(ScaleX(0),ScaleY(365),ScaleX(580),ScaleY(2));
                end;
              2:
                begin
                  Parent:=WizardForm;
                  SetBounds(ScaleX(0),ScaleY(47),ScaleX(580),ScaleY(2));
                end;
              3:
                begin
                  Parent:=DirPanel;
                  SetBounds(ScaleX(0),ScaleY(47),ScaleX(580),ScaleY(2));
                end;
            end;
        end;
    end;
   
 Back:=tbutton.create(DirPanel)
with back do begin
 SetBounds(ScaleX(250),ScaleY(375),ScaleX(100),ScaleY(30));
 parent:=DirPanel;
 Caption:='Сброс';
 onclick:=@BackClick;
end;

 Ok:=tbutton.create(DirPanel)
with ok do begin
 SetBounds(ScaleX(360),ScaleY(375),ScaleX(100),ScaleY(30));
 parent:=DirPanel;
 Caption:='OK';
 onclick:=@OKclick;
end;

 No:=tbutton.create(DirPanel)
with no do begin
 SetBounds(ScaleX(470),ScaleY(375),ScaleX(100),ScaleY(30));
 parent:=DirPanel;
 Caption:='Отмена';
 onclick:=@NOclick;
end;

BrowseDialogTitle := TLabel.Create(DirPanel);
BrowseDialogTitle.SetBounds(ScaleX(19),ScaleY(5),ScaleX(135),ScaleY(16));
BrowseDialogTitle.Font.Style:=[fsBold];
BrowseDialogTitle.Font.Size:= 10;
BrowseDialogTitle.Transparent := True;
BrowseDialogTitle.Parent := DirPanel;
BrowseDialogTitle.Caption := 'Обзор папок';
BrowseDialogTitle.Font.Name := 'Tahoma';
BrowseDialogTitle.Font.Height := -13;

BrowseDialogTitle1 := TLabel.Create(DirPanel);
BrowseDialogTitle1.SetBounds(ScaleX(30),ScaleY(25),ScaleX(365),ScaleY(13));
BrowseDialogTitle1.Transparent := True;
BrowseDialogTitle1.Parent := DirPanel;
BrowseDialogTitle1.Caption := 'В какую папку Вы хотите установить игру?';

MainPanelBig1 := TPanel.Create(DirPanel);
MainPanelBig1.Parent := DirPanel;
MainPanelBig1.SetBounds(ScaleX(20),ScaleY(69),ScaleX(541),ScaleY(261));
MainPanelBig1.Caption := '';

MainPanelBig2 := TPanel.Create(DirPanel);
MainPanelBig2.Parent := MainPanelBig1;
MainPanelBig2.SetBounds(ScaleX(10),ScaleY(11),ScaleX(520),ScaleY(239));
MainPanelBig2.BevelOuter := bvLowered;
MainPanelBig2.Caption := '';

MainPanelBigBevel := TBevel.Create(DirPanel);
MainPanelBigBevel.Style := bsRaised;
MainPanelBigBevel.Parent := MainPanelBig2;
MainPanelBigBevel.SetBounds(ScaleX(9),ScaleY(10),ScaleX(500),ScaleY(220));

Edit:= TNewEdit.Create(DirPanel);
Edit.SetBounds(ScaleX(20),ScaleY(20),ScaleX(480),ScaleY(21));
Edit.Text:=WizardForm.DirEdit.text;
Edit.Parent:= MainPanelBig2;
Edit.Font.Color:=clBlack;

DirTreeView:= TFolderTreeView.Create(DirPanel);
DirTreeView.SetBounds(ScaleX(20),ScaleY(50),ScaleX(480),ScaleY(170));
DirTreeView.OnChange:=@DirFolderChange;
DirTreeView.Parent:=MainPanelBig2;

DirTreeView.ChangeDirectory(AddBackslash(WizardForm.dirEdit.Text), true);
Edit.Text:=(DirTreeView.Directory);

BrowseDialogLabel := TLabel.Create(DirPanel);
BrowseDialogLabel.SetBounds(ScaleX(30),ScaleY(340),ScaleX(365),ScaleY(13));
BrowseDialogLabel.Transparent := True;
BrowseDialogLabel.Parent := DirPanel;
BrowseDialogLabel.Caption := 'Выберите папку из списка и нажмите «OK».';
end;


Serega 17-09-2012 17:48 1990375

Цитата:

Цитата Johny777
помогите пожалуйста упростить код »

Не буду утверждать, что самый лучший вариант, т.к. совершенству нет предела...
читать дальше »

Код:

function OnlyInt(const Value: string): string; /// оставлять только цифры
var
  i, len: Integer;
begin
  Result := '';
  len := Length(Value);
  if len > 0 then
    for i := 1 to len do
      case Value[i] of
        0..9: Result := Result + Value[i];
      end;
end;

function IsInt(const Value: string): Boolean;  /// цифры ли
var
  i: Integer;
begin
  Result := False;
  if Length(Value) > 0 then
    for i := 0 to 9 do
      begin
        Result := Pos(IntToStr(i), Value) > 0;
        if Result then
          Break;
      end;
end;


Функция GetText1 вернёт пустую строку, при таком варианте GetText1('<tag>', '</tag><tag>Test</tag>', '</tag>'), я бы написал её так:
читать дальше »

Код:

function GetText1(const OpenTag, aText, CloseTag: string): string;
var
  pos_tag: Integer;
  s: string;
begin
  Result := '';
  pos_tag := Pos(OpenTag, aText);
  if pos_tag > 0 then
    try
      s := Copy(aText, pos_tag + Length(OpenTag), Length(aText) - pos_tag);
      pos_tag := Pos(CloseTag, s);
      if pos_tag > 0 then
        Result := Copy(s, 1, pos_tag - 1);
    finally
      SetLength(s, 0);
    end;
end;


Johny777 17-09-2012 18:39 1990403

Serega,
вот спасибо!
правда Inno ругалась на отсутствие двоеточия
поменял 0..9:
на '0','1','2','3','4','5','6','7','8','9':

Цитата:

Цитата Serega
Функция GetText1 вернёт пустую строку »

тут проблема
дело в том что не совсем известно каким будет закрывающий тег
это может быть - (для например -dev) или + (для +cl_chowfps)
при использовании с предыдущим кодом возвращает 0 :(

может можно по другому ?
лучший вариант :) :
заюзать Trim
и искать после заданного слова всё что там находится вплоть до + или - тк все параметры с них и начинаются
+fps_max60-console - возвращать 60 из между +fps_max и -
-dev-console возвращать пустую строку (у параметра dev может не быть значения а может быть 1 или 2)
весь этот поиск значений нужен мне тк у меня реализовано следующее
если во время работающего инсталла вводить значения
например +fps_max 60 то 60 пишется в переменную а вся строка в эдит
если ввести +fps_max 50 то слово и значение удалится и заменится на новые
но когда текст в эдите при запуске уже есть я не могу(в отличии от слов) удалять значения пока они не будут найдены
а с поиском между параметром целиком и минусом или плюсом следующего параметра можно будет даже выловить название карты
+map MyMapName -console
вот ранняя версия целевого кода для наглядности
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application



[  code]
const
  gwl_style = (-16);
  ES_NUMBER = $2000;

function GetSystemMenu(hWnd: HWND; bRevert: BOOL): LongWord; external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: LongWord; uPosition, uFlags: UINT): BOOL; external 'DeleteMenu@user32.dll stdcall';
function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLongA@user32.dll stdcall';
function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLongA@user32.dll stdcall';

function GetDC(HWND: DWord): DWord; external 'GetDC@user32.dll stdcall';
function GetDeviceCaps(DC: DWord; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function ReleaseDC(HWND: DWord;DC: DWord): Integer; external 'ReleaseDC@user32.dll stdcall';

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



var
  Param_Edit, Add_Param_Edit, wEdit, hEdit, Empty_Edit: TEdit;
  OK_Button: TButton;
  Param_PopMenu: TPopupMenu;
  h, w, hi, wi, RefrehRate: Integer;
 
  User_FPS, Dev_Value, DX_Value: Integer;
  User_Map: String;
   

procedure Edits_OnKeyPress(Sender: TObject; var Key: Char);    ///добавть переход на кнопку Ok для всех эдитов
begin
  case TEdit(Sender) of
    wEdit:
    begin
    // if Pos(Key, '0123456789'#8) = 0 then Key := #0;
    /// if Pos(Key, '0123456789'#13) = 0 then hEdit.SetFocus; как правильно нажать на ентер
    end else
    begin
    //  if Pos(Key, '0123456789'#8) = 0 then Key := #0;
      ///if Pos(Key, #13) = 0 then OK_Button.SetFocus;
    end;
  end;
end;


// Удаление начальных, конечных и повторных пробелов
function DelSp(const st: String): String;
var
  c, i: integer;
  stt, st1: string;
begin
  c := 0;

  for i := 1 to Length(st) do
  begin
    stt := copy(st, i, 1);
    if (stt = ' ') and (c >= 1) then
    begin
      st1 := st1;
      c := c + 1;
    end
    else if (stt = ' ') and (c = 0) then
    begin
      c := c + 1;
      st1 := st1 + stt;
    end
    else if (stt <> ' ') then
    begin
      c := 0;
      st1 := st1 + stt;
    end
  end;

  Result := st1;
end;


function OnlyInt(const Value: string): string; /// оставлять только цифры
var
  i, len: Integer;
begin
  Result := '';
  len := Length(Value);
  if len > 0 then
    for i := 1 to len do
      case Value[i] of
        '0','1','2','3','4','5','6','7','8','9': Result := Result + Value[i];
      end;
end;

function IsInt(const Value: string): Boolean;  /// цифры ли
var
  i: Integer;
begin
  Result := False;
  if Length(Value) > 0 then
    for i := 0 to 9 do
      begin
        Result := Pos(IntToStr(i), Value) > 0;
        if Result then
          Break;
      end;
end;



procedure Num_Edit_OnChange(Sender:TObject);
begin
  case TEdit(Sender).Tag of
    0: if RefrehRate > 0 then OK_Button.Enabled := (TEdit(Sender).Text <> '') and (StrToInt(TEdit(Sender).Text) > 0) and (StrToInt(TEdit(Sender).Text) <= RefrehRate) else OK_Button.Enabled := (TEdit(Sender).Text <> '') and (StrToInt(TEdit(Sender).Text) > 0) and (StrToInt(TEdit(Sender).Text) <= 250);
    1: OK_Button.Enabled := (TEdit(Sender).Text <> '')  and (StrToInt(TEdit(Sender).Text) = 0) and (StrToInt(TEdit(Sender).Text) = 1);
    2: OK_Button.Enabled := (TEdit(Sender).Text <> '') and (StrToInt(TEdit(Sender).Text) = 1) and (StrToInt(TEdit(Sender).Text) = 2) and (StrToInt(TEdit(Sender).Text) = 3);
    4: OK_Button.Enabled := (TEdit(Sender).Text <> '') and ((StrToInt(TEdit(Sender).Text) = 70) or (StrToInt(TEdit(Sender).Text) = 80) or (StrToInt(TEdit(Sender).Text) = 90));
    5: OK_Button.Enabled := (TEdit(Sender).Text <> '') and (StrToInt(TEdit(Sender).Text) <= w) and (StrToInt(TEdit(Sender).Text) >= 640);
    6: OK_Button.Enabled := (TEdit(Sender).Text <> '') and (StrToInt(TEdit(Sender).Text) <= h) and (StrToInt(TEdit(Sender).Text) >= 480);
    7: OK_Button.Enabled := (TEdit(Sender).Text <> '') and (StrToInt(TEdit(Sender).Text) >= 0) and (StrToInt(TEdit(Sender).Text) <= w-wi);
    8: OK_Button.Enabled := (TEdit(Sender).Text <> '') and (StrToInt(TEdit(Sender).Text) >= 0) and (StrToInt(TEdit(Sender).Text) <= h-hi);
    10: OK_Button.Enabled := (TEdit(Sender).Text = '') or (TEdit(Sender).Text = '1') or (TEdit(Sender).Text = '2');
    11: OK_Button.Enabled := (TEdit(Sender).Text <> '');///  not IsStringCyrillic(TEdit(Sender).Text);
  end;                                                                                                                                                             
end;


function GetMonitorResolutionInfo(MetricType:Boolean): Integer; /// True для высоты, false для ширины  /// соединить с нижней
var
  dc: DWord;
begin
  Result := 0;
  if MetricType = True then
  begin                                                                                 
    dc := GetDC(MainForm.Handle);
    Result := GetDeviceCaps(dc,10);
    ReleaseDC(MainForm.Handle,dc);
  end else
  begin
    dc := GetDC(MainForm.Handle);
    Result := GetDeviceCaps(dc,8);
    ReleaseDC(MainForm.Handle,dc);
  end;
end;


function GetRefreshRate:Integer;
var
  dc: DWord;
begin
  Result := 0;
  dc := GetDC(MainForm.Handle);
  Result := GetDeviceCaps(dc,116);
  ReleaseDC(MainForm.Handle,dc);
end;


function Param_Num(Param, Info_Text: String; Edit_Tag: Byte; Input_Text_Length: Longint): String;
var
  NumForm: TForm;
  Num_Edit: TEdit;
begin
  Result := '';

// Input_Value
// 0 - fps
// 1 - значения 0,1
// 2 - значения 1,2,3
// 4 - значения директа 80, 90, 70
// 5 - расширение по горизонтали
// 6 - расширение по вертикали

// 7 - расположение по ширине
// 8 - расположение по высоте

// 9 - частота обновления экрана
// 10 - dev параметр
// 11 - карта пользователя (НЕ фоновая)

  NumForm := TForm.Create(nil);
  with NumForm do
  begin
    ClientWidth := ScaleX(260);
    ClientHeight := ScaleY(80);
    Position := poScreenCenter;
    DeleteMenu(GetSystemMenu(NumForm.Handle,False), $F060,0); /// сделать кнопку "закрыть" неактивной
    SetClassLong(NumForm.Handle, -26, GetClassLong(NumForm.Handle, -26) or $200); /// блокировка комбинации alt + f4
    BorderIcons := [];

    with TLabel.Create(nil) do
    begin
      WordWrap := True;
      AutoSize := False;
      SetBounds(ScaleX(10), ScaleY(0), ScaleX(240), ScaleY(45));
      Caption := Info_Text;
      Parent := NumForm;
      Font.Size := 7;
    end;

    Num_Edit := TNewEdit.Create(nil);
    with Num_Edit do
    begin
      Parent := NumForm;
      SetBounds(ScaleX(10), ScaleY(50), ScaleX(160), ScaleY(21));
      Text := '';
      OnChange := @Num_Edit_OnChange;
      OnKeyPress := @Edits_OnKeyPress;
      Tag := Edit_Tag;
      MaxLength := Input_Text_Length;
    end;
   
    if Edit_Tag <> 11 then SetWindowLong( Num_Edit.Handle, GWL_STYLE, GetWindowLong( Num_Edit.Handle, GWL_STYLE ) or ES_NUMBER );

    OK_Button := TButton.Create(nil)
    with OK_Button do    // ok
    begin
      SetBounds(NumForm.ClientWidth - ScaleX(80), ScaleY(49), ScaleX(70), ScaleX(23));
      Parent := NumForm;
      Caption := ExpandConstant(SetupMessage(msgButtonOK));
      ModalResult := mrOk;
      Enabled := Edit_Tag = 10; // те параметр dev где может не быть значения
    end;

    if ShowModal = mrOk then
    begin
      case Param of
        '-dxlevel <значение>', '+fps_max <значение>': Delete(Param,Pos('<значение>',Param),Length(Param));
        '-w <широта>': Delete(Param,Pos('<широта>',Param),Length(Param));
        '-h <высота>': Delete(Param,Pos('<высота>',Param),Length(Param));
        '-x <позиция>', '-y <позиция>': Delete(Param,Pos('<позиция>',Param),Length(Param));
        '-refresh <значение>', '+cl_showfps <значение>', '+sv_cheats <значение>', '+skill <значение>', '+mat_dxlevel <значение>': Delete(Param,Pos('<значение>',Param),Length(Param));
        '+map <имя карты>', '+map_background <имя карты>': Delete(Param,Pos('<имя карты>',Param),Length(Param));
        '+exec <название конфига.cfg>': Delete(Param,Pos('<название конфига.cfg>',Param),Length(Param));
        '+playdemo <название>': Delete(Param,Pos('<название>',Param),Length(Param));
      end;
     
      case Edit_Tag of
        0: User_FPS := StrToInt(Num_Edit.Text);
        4: DX_Value := StrToInt(Num_Edit.Text);
        11: User_Map := Trim(Num_Edit.Text);
      end;

      Result := TrimRight(Param) + ' ' + Num_Edit.Text;
     
    /// зсдеь в завсимости от тега писать значения в переменные (например скорость фпс) чтоб потом их удалять
    end;

    Free;
  end;
end;


procedure wh_Edits_OnChange(Sender:TObject);
begin
  OK_Button.Enabled := (wEdit.Text <> '') and (StrToInt(wEdit.Text) <= w) and (StrToInt(wEdit.Text) >= 640) and
  (hEdit.Text <> '') and (StrToInt(hEdit.Text) <= h) and (StrToInt(hEdit.Text) >= 480);
end;

procedure Set_Window_Width_Hight(wLength,hLength:Byte);
var
  SizeForm: TForm;
begin
  SizeForm := TForm.Create(nil);
  with SizeForm do
  begin
    ClientWidth := ScaleX(260);
    ClientHeight := ScaleY(80);
    Position := poScreenCenter;
    DeleteMenu(GetSystemMenu(SizeForm.Handle,False), $F060,0); /// сделать кнопку "закрыть" неактивной
    SetClassLong(SizeForm.Handle, -26, GetClassLong(SizeForm.Handle, -26) or $200); /// блокировка комбинации alt + f4
    BorderIcons := [];

    with TLabel.Create(nil) do
    begin
      WordWrap := True;
      AutoSize := False;
      SetBounds(ScaleX(10), ScaleY(0), ScaleX(240), ScaleY(45));
      Caption := 'Введите сначала ширину и высоту';
      Parent := SizeForm;
      Font.Size := 7;
    end;

    wEdit := TNewEdit.Create(nil);
    with wEdit do
    begin
      Parent := SizeForm;
      SetBounds(ScaleX(10), ScaleY(50), ScaleX(50), ScaleY(21));
      Text := '';
      OnChange := @wh_Edits_OnChange;
      OnKeyPress := @Edits_OnKeyPress;
      MaxLength := wLength;
    end;

    hEdit := TNewEdit.Create(nil);
    with hEdit do
    begin
      Parent := SizeForm;
      SetBounds(wEdit.Left + wEdit.Width + ScaleX(10), ScaleY(50), ScaleX(50), ScaleY(21));
      Text := '';
      OnChange := @wh_Edits_OnChange;
      OnKeyPress := @Edits_OnKeyPress;
      MaxLength := hLength;
    end;
   
    SetWindowLong(wEdit.Handle, GWL_STYLE, GetWindowLong(wEdit.Handle, GWL_STYLE) or ES_NUMBER);
    SetWindowLong(hEdit.Handle, GWL_STYLE, GetWindowLong(hEdit.Handle, GWL_STYLE) or ES_NUMBER);

    OK_Button := TButton.Create(nil)
    with OK_Button do    // ok
    begin
      SetBounds(SizeForm.ClientWidth - ScaleX(80), ScaleY(49), ScaleX(70), ScaleX(23));
      Parent := SizeForm;
      Caption := ExpandConstant(SetupMessage(msgButtonOK));
      ModalResult := mrOk;
      Enabled := False;
    end;

    if ShowModal = mrOk then
    begin
      hi := StrToInt(hEdit.Text);
      wi := StrToInt(wEdit.Text);
    end;

    Free;
  end;
end;

/// добавть элемент меню "показать описание параметров" выкатывающий панель



function DeleteWord(AllText,Word_1,Word_2,Param,Value: String): String;    /// заменить на замену слова
var
  SpDeletedAllText: String;
begin
  SpDeletedAllText := DelSp(AllText);
 
  if Word_1  <> '' then while pos(Word_1,SpDeletedAllText)>0 do delete (SpDeletedAllText,pos(Word_1,SpDeletedAllText),length(Word_1));
  if Word_1  <> '' then while pos(Word_2,SpDeletedAllText)>0 do delete (SpDeletedAllText,pos(Word_2,SpDeletedAllText),length(Word_2));
  if Param  <> '' then while pos(Param,SpDeletedAllText)>0 do delete (SpDeletedAllText,pos(Param,SpDeletedAllText),length(Param)+Length(Value)+1);
 
  Result := SpDeletedAllText;
end;


function Replace(Str, X, Y: string): string; //// замена слова
{Str - строка, в которой будет производиться замена.
 X - подстрока, которая должна быть заменена.
 Y - подстрока, на которую будет произведена заменена}
var
  buf1, buf2, buffer: string;
begin
  buf1 := '';
  buf2 := Str;
  Buffer := Str;
  while Pos(X, buf2) > 0 do
  begin
    buf2 := Copy(buf2, Pos(X, buf2), (Length(buf2) - Pos(X, buf2)) + 1);
    buf1 := Copy(Buffer, 1, Length(Buffer) - Length(buf2)) + Y;
    Delete(buf2, Pos(X, buf2), Length(X));
    Buffer := buf1 + buf2;
  end;
  Result := Buffer;
end;


//procedure InitializeWizard();
//begin
//  MsgBox(Replace('-dev -console +fps_max 60','-console','-gl'), mbConfirmation, MB_OK);
//end;


procedure Paste(Sender:TObject);
var
  StrRefrehRate: String;
  StrRefrehRateLength: Integer;
begin
  case TMenuItem(Sender).Caption of
                                                                                             
    '-console':            if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'-console','','','') + ' ' + TMenuItem(Sender).Caption); // готово
    '-hideconsole':        if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'-hideconsole','','','') + ' ' + TMenuItem(Sender).Caption); // готово
    '-safe':              if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'-safe','','','') + ' ' + TMenuItem(Sender).Caption);  // готово
    '-dev':                if Empty_Edit.Text = '' then Empty_Edit.Text := Param_Num(TMenuItem(Sender).Caption, 'Возможные значения: 1, 2, нет значения', 10, 1) else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'','','-dev',IntToStr(Dev_Value)) + ' ' + Param_Num(TMenuItem(Sender).Caption, 'Возможные значения: 1, 2, нет значения', 10, 1));  // готово
    '-condebug':          if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'-condebug','','','') + ' ' + TMenuItem(Sender).Caption);  // готово
    '-autoconfig':        if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'-autoconfig','','','') + ' ' + TMenuItem(Sender).Caption);  // готово
    '-dxlevel <значение>': if Empty_Edit.Text = '' then Empty_Edit.Text := Param_Num(TMenuItem(Sender).Caption, 'Задайте версию DirectX. Например для DirectX 8.0 - значение 80 (возможные значения: 70, 80, 90)', 4, 2) else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'','','-dxlevel',IntToStr(DX_Value)) + ' ' + Param_Num(TMenuItem(Sender).Caption, 'Задайте версию DirectX. Например для DirectX 8.0 - значение 80 (возможные значения: 70, 80, 90)', 4, 2));  // готово
    '-32bit':              if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'-32bit','','','') + ' ' + TMenuItem(Sender).Caption); // готово
    '-fullscreen':        if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'-fullscreen','-windowed','','') + ' ' + TMenuItem(Sender).Caption); // готово /// образец качества
    '-windowed':          if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'-fullscreen','-windowed','','') + ' ' + TMenuItem(Sender).Caption); // готово

   
    '-w <широта>':
    begin
      if (w = 0) then w := GetMonitorResolutionInfo(False);
      if Empty_Edit.Text = '' then Empty_Edit.Text := Param_Num(TMenuItem(Sender).Caption, 'Укажите разрешение по горизонтали. Максимальное значение - ' + IntToStr(w) + '. Минимальное - 640', 5, Length(IntToStr(w))) else
      Empty_Edit.Text := Empty_Edit.Text + ' ' + Param_Num(TMenuItem(Sender).Caption, 'Укажите разрешение по горизонтали. Максимальное значение - ' + IntToStr(w) + '. Минимальное - 640', 5, Length(IntToStr(w)));
    end;
   
    '-h <высота>':
    begin
      if (h = 0) then h := GetMonitorResolutionInfo(True);
      if Empty_Edit.Text = '' then Empty_Edit.Text := Param_Num(TMenuItem(Sender).Caption, 'Укажите разрешение по вертикали. Максимальное значение - ' + IntToStr(h) + '. Минимальное - 480', 6, Length(IntToStr(h))) else
      Empty_Edit.Text := Empty_Edit.Text + ' ' + Param_Num(TMenuItem(Sender).Caption, 'Укажите разрешение по горизонтали. Максимальное значение - ' + IntToStr(h) + '. Минимальное - 480', 6, Length(IntToStr(h)));
    end;
   
    '-x <позиция>':
    begin
      if (w = 0) then w := GetMonitorResolutionInfo(False);
      if (h = 0) then h := GetMonitorResolutionInfo(True);
     
      Set_Window_Width_Hight(Length(IntToStr(w)),Length(IntToStr(h)));
     
      /// ограничить ввод разрешения до стандартныз (сделать комбобоксы?)
     
      if not (hi = h) and not (wi = w) then
     
      if Empty_Edit.Text = '' then Empty_Edit.Text :='-w' + ' ' + IntToStr(wi) + ' ' + '-h' + ' ' + IntToStr(hi) + ' ' + Param_Num(TMenuItem(Sender).Caption, 'Укажите расположение окна от левого края. Максимальное значение - ' + IntToStr(w-wi) + '. Минимальное - 0', 7, Length(IntToStr(w))) else
      Empty_Edit.Text := Empty_Edit.Text + ' ' + '-w' + ' ' + IntToStr(wi) + ' ' + '-h' + ' ' + IntToStr(hi) + ' ' + Param_Num(TMenuItem(Sender).Caption, 'Укажите расположение окна от левого края. Максимальное значение - ' + IntToStr(w-wi) + '. Минимальное - 0', 7, Length(IntToStr(w)));
    end;

    '-y <позиция>': 
    begin
      if (w = 0) then w := GetMonitorResolutionInfo(False);
      if (h = 0) then h := GetMonitorResolutionInfo(True);

      Set_Window_Width_Hight(Length(IntToStr(w)),Length(IntToStr(h)));
     
      if not (hi = h) and not (wi = w) then /// если значение сдвига 0 (введённое разрешение совпадаетс с реальным) то не добавлять параметр и е создавать форму

      if Empty_Edit.Text = '' then Empty_Edit.Text := Param_Num(TMenuItem(Sender).Caption, 'Укажите расположение окна от верхнего края. Максимальное значение - ' + IntToStr(h-hi) + '. Минимальное - 0', 8, Length(IntToStr(h))) else
      Empty_Edit.Text := Empty_Edit.Text + ' ' + Param_Num(TMenuItem(Sender).Caption, 'Укажите расположение окна от верхнего края. Максимальное значение - ' + IntToStr(h-hi) + '. Минимальное - 0', 8, Length(IntToStr(h)));
    end;
   
    '-nocrashdialog':                if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := Empty_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '-novid':                        if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := Empty_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '-noborder':                      if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := Empty_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '-nojoy':                        if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := Empty_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '-noforcemspd':                  if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := Empty_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '-noforcemparms':                if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := Empty_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '-noforcemaccel':                if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := Empty_Edit.Text + ' ' + TMenuItem(Sender).Caption;
   
//    '-refresh <значение>':


    '-d3d':                          if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := Empty_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '-gl':                            if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := Empty_Edit.Text + ' ' + TMenuItem(Sender).Caption;
    '-wavonly':                      if Empty_Edit.Text = '' then Empty_Edit.Text := TMenuItem(Sender).Caption else Empty_Edit.Text := Empty_Edit.Text + ' ' + TMenuItem(Sender).Caption;
//
    '+cl_showfps <значение>':
//    '+map <имя карты>':    if Empty_Edit.Text = '' then Empty_Edit.Text := Param_Num(TMenuItem(Sender).Caption, 'Введите имя карты. Расширение .bsp добавлять не нужно', 11, 60) else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'','','+map',User_Map) + ' ' + Param_Num(TMenuItem(Sender).Caption, 'Введите имя карты. Расширение .bsp добавлять не нужно', 11, 60));  // готово
//    '+map_background <имя карты>':
//    '+sv_cheats <значение>':
//    '+exec <название конфига.cfg>':
//    '+fps_max <значение>':
    begin
      if RefrehRate = 0 then
      begin
        RefrehRate := GetRefreshRate;
        if RefrehRate > 0 then
        begin
          StrRefrehRate := IntToStr(RefrehRate);
          StrRefrehRateLength := Length(StrRefrehRate);
        end else
        begin
          StrRefrehRate := '250';
          StrRefrehRateLength := 3;
        end;
      end;
      if Empty_Edit.Text = '' then Empty_Edit.Text := Param_Num(TMenuItem(Sender).Caption, 'сколько кадров в секунду?Максимальное значение - ' + StrRefrehRate, 0, StrRefrehRateLength) else Empty_Edit.Text := DelSp(DeleteWord(Empty_Edit.Text,'','','+fps_max',IntToStr(User_FPS)) + ' ' + Param_Num(TMenuItem(Sender).Caption, 'сколько кадров в секунду?Максимальное значение - ' + StrRefrehRate, 0, StrRefrehRateLength));  /// образец качества
    end;
//    '+skill <значение>':
//    '+playdemo <название>':
//    '+mat_dxlevel <значение>':

    'описание параметров': /// выкатить панель
    begin
//      RollControl(SettingPanel, 1000, $0);
//      with ConsoleSpeedButton do
//      begin
//        Enabled := False;
//        ShowHint := False;
//      end;
    end;
  end;
end;                                                                                                                           

procedure Param_Button_OnClick(Sender:TObject);
var
  pt: TPoint;
begin
  case TButton(Sender).Tag of
    71: Empty_Edit := Param_Edit;
    90: Empty_Edit := Add_Param_Edit;
  end;
 
  pt := TButton(Sender).ClientToScreen(pt);
  Param_PopMenu.Popup(pt.x, pt.y);
end;



//берет из текста участок текста, который заключен между первым словом (OpenTag) и любым другим (CloseTag). Работает блестяще.
function GetText1(OpenTag,aText,CloseTag:string):string;
begin
  Result:=Copy(aText,Pos(OpenTag,aText)+Length(OpenTag),Pos(CloseTag,aText)-Length(CloseTag)-1);
end;


procedure InitializeWizard();
var
  Temp_Value_String, Params:String;
begin
  WizardForm.OuterNotebook.Hide;
 
  /// добавть менб как в авторане те если  Pos('параметр', текст эдита) больше нуля то не добавлять ацтем меню
  Param_PopMenu := NewPopupMenu(WizardForm, 'MyPopupMenu', paLeft, True, [
    NewItem('-console', 0, False, True, @Paste, 11, ''),
    NewItem('-hideconsole', 0, False, True, @Paste, 11, ''),
    NewItem('-safe', 0, False, True, @Paste, 11, ''),
    NewItem('-dev', 0, False, True, @Paste, 11, ''), // Включает режим разработки. Для отключения загрузки стандартных фоновых карт и сообщения с подтверждением выхода из игры по причине быстродействия, используйте параметр командной строки -dev. Используйте  команды 'dev 1' и 'dev 2' для вывода служебных сообщений в консоль.
    NewItem('-condebug', 0, False, True, @Paste, 11, ''),
    NewItem('-autoconfig', 0, False, True, @Paste, 11, ''),
    NewItem('-dxlevel <значение>', 0, False, True, @Paste, 11, ''),  //  - Задает версию DirectX, используемую игровым движком. Например, для DirectX 8.0 необходимо использовать -dxlevel 80.
    NewItem('-32bit', 0, False, True, @Paste, 11, ''),
    NewItem('-fullscreen', 0, False, True, @Paste, 11, ''),
    NewItem('-windowed', 0, False, True, @Paste, 11, ''),
    NewItem('-w <широта>', 0, False, True, @Paste, 11, ''),  // <широта> или -width <ширина> - Принудительно запускает движок с установленной <шириной>. Пример: -w 1024
    NewItem('-h <высота>', 0, False, True, @Paste, 11, ''),  // <высота> или -height <высота> - Принудительно запускает движок с установленной <высотой>. Пример: -h 768
    NewItem('-x <позиция>', 0, False, True, @Paste, 11, ''), //  <позиция> - Устанавливает расположение окна по горизонтали в оконном режиме . Пример: -x 0
    NewItem('-y <позиция>', 0, False, True, @Paste, 11, ''), // <позиция> - Устанавливает расположение окна по вертикали в оконном режиме . Пример: -y 0
    NewItem('-nocrashdialog', 0, False, True, @Paste, 11, ''),
    NewItem('-novid', 0, False, True, @Paste, 11, ''),
    NewItem('-noborder', 0, False, True, @Paste, 11, ''),
    NewItem('-nojoy', 0, False, True, @Paste, 11, ''),
    NewItem('-noforcemspd', 0, False, True, @Paste, 11, ''), /// Работает только с -useforcedmparms
    NewItem('-noforcemparms', 0, False, True, @Paste, 11, ''), /// Работает только с -useforcedmparms
    NewItem('-noforcemaccel', 0, False, True, @Paste, 11, ''), /// Работает только с -useforcedmparms
    NewItem('-refresh <значение>', 0, False, True, @Paste, 11, ''), /// <периодичность> - Устанавливает особую периодичность обновления экрана. Пример: -refresh 60.
    NewItem('-d3d', 0, False, True, @Paste, 11, ''),
    NewItem('-gl', 0, False, True, @Paste, 11, ''),
    NewItem('-wavonly', 0, False, True, @Paste, 11, ''),
    NewLine,
    NewItem('+cl_showfps <значение>', 0, False, True, @Paste, 11, ''), //    отображать количество кадров в секунду
    NewItem('+map <имя карты>', 0, False, True, @Paste, 11, ''), //    -  Загружает заданную карту сразу после запуска движка. Примечание: расширение .BSP не требуется.
    NewItem('+map_background <имя карты>', 0, False, True, @Paste, 11, ''), //    - Задает необходимую фоновую карту. Полезно для тестирования собственных фоновых карт.
    NewItem('+sv_cheats <значение>', 0, False, True, @Paste, 11, ''),  //    - Когда установлено в 1, запускает игру с возможностью использования консольных читов.
    NewItem('+exec <название конфига.cfg>', 0, False, True, @Paste, 11, ''),  //    - Автоматически исполняет конфигурационный файл при запуске. Например, можно выполнить ваш специальный конфиг с настройками.
    NewItem('+fps_max <значение>', 0, False, True, @Paste, 12, ''),
    NewItem('+skill <значение>', 0, False, True, @Paste, 11, ''), //    - Устанавливает уровень сложности; 1=лёгкий, 2=средний, 3=сложный. Например +skill 3.
    NewItem('+playdemo <название>', 0, False, True, @Paste, 11, ''),

    NewItem('+mat_dxlevel <значение>', 0, False, True, @Paste, 11, ''),
    //    – установливает версию шейдера
    //    Пример:
    //    mat_dxlevel 90 - DX9 with Shader Model 2
    //    mat_dxlevel 95 - DX9 with Shader Model 3
    //    mat_dxlevel 98 - DX9 on DX10 hardware (SM 4)
   
    NewLine,
    NewItem('описание параметров', 0, False, True, @Paste, 11, '')
  ]);

  Param_Edit := TNewEdit.Create(nil);
  with Param_Edit do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(40), ScaleY(100), ScaleX(300), ScaleY(21));
    Text := '+fps_max 60 -console';
  end;
 
  Params := Param_Edit.Text;
 
  if Params <> '' then
  begin
    if Pos('+fps_max',Param_Edit.text) >0 then
    begin
      Temp_Value_String := GetText1('+fps_max',Param_Edit.Text,' ');
      if IsInt(Temp_Value_String) = True then User_FPS := StrToInt(OnlyInt(Temp_Value_String));
      MsgBox(IntToStr(User_FPS), mbConfirmation, MB_OK);
    end;
  end;

  //



  // if pos('+fps_max',Param_Edit.Text)>0 then искать слово

  Add_Param_Edit := TNewEdit.Create(nil);
  with Add_Param_Edit do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(40), ScaleY(160), ScaleX(300), ScaleY(21));
    Text := '';
  end;
 
  with TButton.Create(nil) do
  begin
    Parent := WizardForm;
    SetBounds(Param_Edit.Left + Param_Edit.Width + ScaleX(5), Param_Edit.Top, ScaleX(75), Param_Edit.Height);
    Caption := 'Push Me';
    Cursor := crHand;
    OnClick := @Param_Button_OnClick;
    Tag := 71;
  end;
 
  with TButton.Create(nil) do
  begin
    Parent := WizardForm;
    SetBounds(Add_Param_Edit.Left + Add_Param_Edit.Width + ScaleX(5), Add_Param_Edit.Top, ScaleX(75), Add_Param_Edit.Height);
    Caption := 'Push Me 2';
    Cursor := crHand;
    OnClick := @Param_Button_OnClick;
    Tag := 90;
  end;
 
   

end;


procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.NextButton.Hide;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;


LinkOFF 18-09-2012 00:02 1990596

Доброй ночи. У кого есть скрипт для растягивания картинки на первую и последнюю страницы. и если можно скрипт для вставки скина.

Johny777 18-09-2012 02:00 1990628

LinkOFF,
простое растягивание картинки
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[  code]
procedure InitializeWizard();
begin
  with WizardForm do
  begin
    WizardBitmapImage.Align := alClient;
    WizardBitmapImage2.Align := WizardBitmapImage.Align;
  end;
end;


версия с прозрачными лейблами в шапке под названием "Картинка на страницах инсталлятора"

скин для инсталлятора и деинсталлятора был не так давно в моём сообщении в этой ветке
листай назад и найдёшь!

SatHan 18-09-2012 16:40 1990903

LinkOFF, здесь было.
Цитата:

Цитата wertulll
как убрать эту белую точку »

так, ничего лишнего не заметил а по скрипту этих точек там тьма тьмущая. смотри у себя в скриптах фриарка или де там ещё. картинки за тебя делать не охото, дополнительные компоненты искать тоже, без того чего не хватает даже разбираться лень.

Serega 18-09-2012 20:40 1991050

Цитата:

Цитата Johny777
правда Inno ругалась на отсутствие двоеточия »

Извиняюсь, в анси версии компилятора забыл проверить, на юникоде ошибок нет.
Цитата:

Цитата Johny777
может можно по другому ? »

Если я правильно понял, то вам нужен такой вариант:
читать дальше »

Код:

function GetParam(const StartStr, Value: string): string;
var
  pos_start, pos_end, len: Integer;
begin
  Result := '';
  len := Length(Value);
  pos_start := Pos(StartStr, Value);
  // проверяем, что строка не пустая и начальное значение есть в исходной строке
  if (len > 0) and (pos_start > 0) then
    begin
      pos_start := pos_start + Length(StartStr);
      pos_end := pos_start;
      // перебираем посимвольно до тех пор пака не встретим '+' или '-', или же не будет достигнут конец строки
      while (pos_end < len) and (Value[pos_end] <> '+') and (Value[pos_end] <> '-') do
        pos_end := pos_end + 1;
      case pos_end = len of
        True : Result := Trim(Copy(Value, pos_start, pos_end - pos_start + 1));
        False: Result := Trim(Copy(Value, pos_start, pos_end - pos_start));
      end;
    end;
end;


Serega 18-09-2012 21:10 1991071

Цитата:

Цитата Johny777
вот ранняя версия »

Аналог вашей функции Replace, только работает раза в 1,5 быстрее:
читать дальше »

Код:

function ReplaceStr(const S, OldStr, NewStr: string): string;
var
  pos_simbol: Integer;
begin
  Result := S;
  pos_simbol := Pos(OldStr, Result);
  while pos_simbol > 0 do
    begin
      Delete(Result, pos_simbol, Length(OldStr));
      Insert(NewStr, Result, pos_simbol);
      pos_simbol := Pos(OldStr, Result);
    end;
end;



P.S.
При проведении тестов на скорость работы функции, обратил внимание на интересную вещь. В анси версии компилятора, работа со строками происходит приблизительно раз в 10 быстрей юникодовой версии...

Johny777 19-09-2012 12:16 1991386

Цитата:

Цитата Serega
Если я правильно понял, то вам нужен такой вариант: »

Спасибо! Работает отлично но вот если поместить +fps_max 60 в конец строки функция возвращает 6 (ноль куда-то слетает)
но извратившись(удалил все пробелы) сделал так:

читать дальше »

Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[  code]
function DeleteAllSp(const st: String): String;
begin
  while pos(' ',st)>0 do delete(st,pos(' ',st),1);
  Result := st;
end;


function GetParam(const StartStr, Value: string): string;
var
  pos_start, pos_end, len: Integer;
begin
  Result := '';
  len := Length(Value);
  pos_start := Pos(StartStr, Value);
  // проверяем, что строка не пустая и начальное значение есть в исходной строке
  if (len > 0) and (pos_start > 0) then
    begin
      pos_start := pos_start + Length(StartStr);
      pos_end := pos_start;
      // перебираем посимвольно до тех пор пака не встретим '+' или '-', или же не будет достигнут конец строки
      while (pos_end < len) and (Value[pos_end] <> '+') and (Value[pos_end] <> '-') do
        pos_end := pos_end + 2;
      Result := Trim(Copy(Value, pos_start, pos_end - pos_start));
    end;
end;


procedure InitializeWizard();
var
  Temp_Value_String, Params:String;
  Param_Edit: TEdit;
begin
  WizardForm.OuterNotebook.Hide;

  Param_Edit := TNewEdit.Create(nil);
  with Param_Edit do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(40), ScaleY(100), ScaleX(300), ScaleY(21));
    Text := '-console +fps_max 60';
  end;

  Params := DeleteAllSp('-console +fps_max 60');
 
  if Params <> '' then
  if Pos('+fps_max',Param_Edit.text) >0 then
  MsgBox(GetParam('+fps_max',Params), mbConfirmation, MB_OK);
end;


возвращает нужное число
Цитата:

Цитата Serega
Аналог вашей функции Replace, только работает раза в 1,5 быстрее: »

спасибо! :)
Цитата:

Цитата Serega
В анси версии компилятора, работа со строками происходит приблизительно раз в 10 быстрей юникодовой версии... »

может потому что юникодная инно может вмещать сложные символ типа иероглифов
те обработка текста сложнее и выделение оперативки больше?

Ivan_009 19-09-2012 13:51 1991448

Как сделать деинсталятор в стиле инсталлятора на ботве.. На примере скрипта L.A. Noire.
Подскажите пожалуйста, пробовал не получается. :(

LinkOFF 19-09-2012 15:11 1991495

народ подскажите как убрать вот это

vint56 19-09-2012 16:43 1991547

LinkOFF если я тебя правельно понял ты показываеш на Bevel1
WizardForm.Bevel1.Hide;

LinkOFF 19-09-2012 16:47 1991549

vint56, о спасибо. а не знаешь как из верхнего левого угла иконку убрать?

wertulll 19-09-2012 17:46 1991587

Ребят вот собрал скрипт из нескольких примеров можете посмотреть может мусора полно
чегото длиный зараза вышел http://rghost.ru/40458802

LinkOFF 19-09-2012 18:00 1991592

wertulll, длинный из-за isdone. а так все норм

wertulll 19-09-2012 18:06 1991596

в этом скрипте почемуто не затекстурировалось окно ( состояние деинстоляции) можно его какнибуть отключить?

El Sanchez 19-09-2012 18:19 1991600

Цитата:

Цитата Johny777
Работает отлично но вот если поместить +fps_max 60 в конец строки функция возвращает 6 (ноль куда-то слетает) »

Johny777, держи еще вариант:
Код:

function GetValue(const szText, szParam: String): String;
begin
    if Pos(szParam + #32, szText) = 0 then Exit;
    Result := Trim(Copy(szText, Pos(szParam + #32, szText)+Length(szParam), Length(szText)));
    if Pos(Result[1], '-+') > 0 then Result := '';
    if Pos(#32, Result) > 0 then SetLength(Result, Pos(#32, Result)-1);
end;

procedure InitializeWizard();
begin
    MsgBox(GetValue('+fps_max 60 -console', '+fps_max'), mbInformation, MB_OK);
    MsgBox(GetValue('-hideconsole +fps_max 60 -console -h 1280', '-h'), mbInformation, MB_OK);
    MsgBox(GetValue('-console +fps_max 60', '+fps_max'), mbInformation, MB_OK);
    MsgBox(GetValue('+fps_max      60          -console', '+fps_max'), mbInformation, MB_OK);
    MsgBox(GetValue('+fps_max 60 -dev -console', '-dev'), mbInformation, MB_OK);
    MsgBox(GetValue('+fps_max 60 -dev 2 -console', '-dev'), mbInformation, MB_OK);
end;

Цитата:

Цитата Serega
Аналог вашей функции Replace, только работает раза в 1,5 быстрее: »

Johny777, StringChangeEx не подходит? :wink:

Serega 19-09-2012 20:38 1991679

Цитата:

Цитата Johny777
но вот если поместить +fps_max 60 в конец строки функция возвращает 6 (ноль куда-то слетает) »

Извиняюсь, поторопился... исправил предыдущее сообщение.

Цитата:

Цитата El Sanchez
еще вариант: »

El Sanchez, есть не учтённый момент, допустим так:
Код:

    MsgBox(GetValue('+fps_max60-console', '+fps_max'), mbInformation, MB_OK);

El Sanchez 19-09-2012 21:33 1991710

Цитата:

Цитата Serega
есть не учтённый момент, допустим так: »

Serega, у Johny777 разбор комстроки идет, параметры и значения пробелом разделяются, так что это не неучтенный момент, а неправильный изначально. Но ошибку я и у себя нашел, исправил.

Serega 19-09-2012 21:58 1991732

El Sanchez, спорить не буду, взял пример от сюда:
Цитата:

Цитата Johny777
и искать после заданного слова всё что там находится вплоть до + или - тк все параметры с них и начинаются
+fps_max60-console - возвращать 60 из между +fps_max и - »


Johny777 20-09-2012 01:19 1991834

Цитата:

Цитата Serega
спорить не буду, взял пример от сюда: »

Цитата:

Цитата Johny777
+fps_max60-console »

пардон
мой косяк
пробелы быть должны
между параметрами ком строки и значениями. Везде!
в противном случае они будут являться тарабарщиной которую двиг игры не сможет прочитать при этом жутко ругаясь
поэтому сделал вот такую вот функцию (вроде работает но как-то медленно) но почему-то в параметр - hideconsole записывается как -h ideconsole
вот код:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[  code]
var
  Param_Edit: TEdit;
 
function DelSp(const st: String): String;  /// укоротить до одинарных пробелов
begin
  while pos('  ',st)>0 do delete(st,pos('  ',st),1);
  Result := st;
end;

function InsertSp(AllText:String):String; //// добавить пробелы
var
  pos_simbol: Integer;
  Param: String;
  i: Integer;
begin
  i := 1;

  repeat
    begin
      case i of
        1: Param := '-console';
        2: Param := '-hideconsole';
        3: Param := '-safe';
        4: Param := '-dev';
        5: Param := '-condebug';
        6: Param := '-autoconfig';
        7: Param := '-dxlevel';
        8: Param := '-32bit';
        9: Param := '-fullscreen';
        10: Param := '-windowed';
        11: Param := '-w';
        12: Param := '-h';
        13: Param := '-x';
        14: Param := '-y';
        15: Param := '-nocrashdialog';
        16: Param := '-novid';
        17: Param := '-noborder';
        18: Param := '-nojoy';
        19: Param := '-noforcemspd';
        20: Param := '-noforcemparms';
        21: Param := '-noforcemaccel';
        22: Param := '-refresh';
        23: Param := '-d3d';
        24: Param := '-gl';
        25: Param := '-wavonly';
        26: Param := '+cl_showfps';
        27: Param := '+map';
        28: Param := '+map_background';
        29: Param := '+sv_cheats';
        30: Param := '+exec';
        31: Param := '+fps_max';
        32: Param := '+skill';
        33: Param := '+playdemo';
        34: Param := '+mat_dxlevel';
      end;

      if pos(Param,AllText) > 0 then
      begin
        pos_simbol := Pos(Param, AllText);
        Insert(' ',AllText, pos_simbol);
        Insert(' ',AllText, pos_simbol+Length(Param)+1);
      end;

      i := i + 1;
    end;
  until i = 35;

  Result := Trim(DelSp(AllText));
end;


function DeleteAllSp(const st: String): String;  /// убрать все пробелы
begin
  while pos(' ',st)>0 do delete(st,pos(' ',st),1);
  Result := st;
end;


procedure Buttons_OnClick(Sender:TObject);
begin
  case TButton(Sender).Caption of
    'Insert': Param_Edit.Text := InsertSp(Param_Edit.Text);
    'Delete': Param_Edit.Text := DeleteAllSp(Param_Edit.Text);
  end;
end;


procedure InitializeWizard();
begin
  WizardForm.OuterNotebook.Hide;
  WizardForm.Width := 900;
  WizardForm.Position := poScreenCenter;

  Param_Edit := TNewEdit.Create(nil);
  with Param_Edit do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(40), ScaleY(100), ScaleX(700), ScaleY(21));
    Text := InsertSp('+fps_max80-dxlevel80-hideconsole-32bit-gl-novid+cl_showfps1-dev1+sv_cheats1+playdemoTheBestDemo-condebug+skill2');
  end;
 
  with TButton.Create(nil) do
  begin
    Parent := WizardForm;
    SetBounds(Param_Edit.Left + Param_Edit.Width + ScaleX(5), Param_Edit.Top, ScaleX(65), Param_Edit.Height);
    Caption := 'Insert';
    Cursor := crHand;
    OnClick := @Buttons_OnClick;
  end;
 
  with TButton.Create(nil) do
  begin
    Parent := WizardForm;
    SetBounds(Param_Edit.Left + Param_Edit.Width + ScaleX(5) + ScaleX(70), Param_Edit.Top, ScaleX(65), Param_Edit.Height);
    Caption := 'Delete';
    Cursor := crHand;
    OnClick := @Buttons_OnClick;
  end;
end;



кажись проблема в том что есть параметр -h
и есть параметр -hideconsole который в начале тоже имеет -h
подскажите пожалуйста как это поправить и можно ли как-то ускорить работу функции InserSp?

также порывшись на форумах по дельфи улучшил функцию проверки строки на целое число
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[  code]
function IsInt(const Value: string): Boolean; 
begin
  Result := StrToIntDef(Value,0) <> 0;
end;

procedure InitializeWizard();
begin
  if IsInt('10') then MsgBox('yes', mbInformation, MB_OK);
  if not IsInt('hfhfrh') then MsgBox('no', mbInformation, MB_OK);
end;



и кому надо функция получения разрешения монитора (верт., гор.) и частоты обновления (мне нужна для +fps_max и для -refresh и других параметров)
читать дальше »
Код:

AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[  code]
function GetDC(HWND: DWord): DWord; external 'GetDC@user32.dll stdcall';
function GetDeviceCaps(DC: DWord; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function ReleaseDC(HWND: DWord;DC: DWord): Integer; external 'ReleaseDC@user32.dll stdcall';


function GetMonitorInfo(MetricType:Byte;Descriptor:THandle): Word;
var
  dc: DWord;
begin
  Result := 0;

  case MetricType of
    1:  /// разрешение по ширине
    begin
      dc := GetDC(Descriptor);
      Result := GetDeviceCaps(dc,8);
    end;

    2: /// разрешение по высоте
    begin
      dc := GetDC(Descriptor);
      Result := GetDeviceCaps(dc,10);
    end;

    3: /// частота обновления экрана
    begin
      dc := GetDC(Descriptor);
      Result := GetDeviceCaps(dc,116);
    end;
  end;
  ReleaseDC(Descriptor,dc);
end;


procedure InitializeWizard();
begin
  MsgBox(
  'разрешение по горизонтали - ' + IntToStr(GetMonitorInfo(1,MainForm.Handle)) + #13#10 +
  'разрешение по вертикали - ' + IntToStr(GetMonitorInfo(2,MainForm.Handle)) + #13#10 +
  'частота обновления - ' + IntToStr(GetMonitorInfo(3,MainForm.Handle)),
  mbConfirmation, MB_OK);
end;



Цитата:

Цитата Serega
Извиняюсь, поторопился... исправил предыдущее сообщение. »

Цитата:

Цитата El Sanchez
держи еще вариант: »

Спасибо добрые люди! :)
предстоит много работы но теперь у меня есть всё для того чтоб завершить код

El Sanchez 20-09-2012 11:33 1991942

Цитата:

Цитата Johny777
но почему-то в параметр - hideconsole записывается как -h ideconsole »

Johny777, в своем сообщении поправил.

Цитата:

Цитата Johny777
можно ли как-то ускорить работу функции InserSp? »

Johny777, защиту от дурака делаешь? Все случаи неправильного написания не предусмотришь. У тебя в Param_Edit комстроку будут продвинутые пользователи заполнять, а они уж знают где пробелы расставлять, так что не вижу смысла в DelSp, InsertSp, DeleteAllSp. Сделай проще:
1). CheckListBox со всеми параметрами.
2). Если у параметров предусмотрены значения, напротив соответствующий Edit. При создании чекбокса последним параметром AObject функции AddCheckBox укажи этот Edit. Позже, когда будешь считывать состояния чекбоксов (читай - параметров для результирующей комстроки), наличие объекта будет говорить о том, что у параметра есть значение, которое нужно тоже считать.

Цитата:

Цитата Johny777
также порывшись на форумах по дельфи улучшил функцию проверки строки на целое число »

Johny777, в самый раз.

Цитата:

Цитата wertulll
подскажите пожалуйста что это за ошибка »

wertulll, в самом начале дублирование #ifdef records, а закрытие только один раз.

Respin 21-09-2012 02:11 1992370

Здравствуйте. Использую этот пример, чтобы докачать необходимые файлы из интернет. Всё работает нормально, но есть одно но. Если во время скачивания файла пропадает соединение с интернет, то выскакивает куча ошибок. Установщик начинает сильно ругаться на функцию DownloadProgress, так как связь оборвалась, а он продолжает пытаться считывать информацию. Подскажите как это исправить, а то после этого установщик возможно закрыть только принудительно.

El Sanchez 21-09-2012 10:22 1992445

Цитата:

Цитата Respin
Если во время скачивания файла пропадает соединение с интернет, то выскакивает куча ошибок. Установщик начинает сильно ругаться на функцию DownloadProgress »

Respin, в процедуре DownloadFile найдите такие строки:
Код:

finally
    FStream.Free;
    ProgressPage.Hide;
end;

и допишите:
Код:

finally
    Timer.Enabled := False;
    FStream.Free;
    ProgressPage.Hide;
end;

P.S. В будущем попробую реализовать асинхронную закачку в несколько потоков.

wertulll 21-09-2012 16:22 1992615

подскажите пожалуйста как исправить этот баг на окнах

Respin 21-09-2012 16:51 1992634

Цитата:

Цитата wertulll
подскажите пожалуйста как исправить этот баг на окнах »

Это не баг, а стиль такой. Codejock Skin Builder тебе в помощь.

wertulll 21-09-2012 19:23 1992709

Цитата:

Цитата Johny777
никак
виста и 7-ка так вырисовывают месседж боксы
меняй на формы »

подбрось пример пожалуйста если не трудно. А вобще можно скин убрать с этого окна ???


чтобы было так

Respin 22-09-2012 04:37 1992876

El Sanchez, Благодарю вас, на этом этапе ошибки больше нет.
Прикрутил к скрепту Cancel Button, а то получается как-то... хочешь не хочешь - качай!
На кустомной кнопки отмены прописываю: FStream.Free; WizardForm.Close;
Если во всей установки: Confirm:= False; то всё просто замечательно! Но если: Confirm:= True; ругается на эту строчку: FStream.WriteBuffer(fBuf, lpdwNumberOfBytesRead); Возможно ли как-то откатить установку без ошибок, но с живым Confirm?

SatHan 23-09-2012 02:46 1993367

привет всем.
есть у меня ключ
Код:

[Registry]
;Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application_is1; ValueType: string; ValueName: QuietUninstallString; ValueData: """C:\Program Files\Application\unins000.exe"" /SILENT"; Flags: uninsdeletevalue uninsdeletekeyifempty

и есть у меня кнопачка
Код:

[#Code]
var
  NewButton1: TNewButton;
procedure NewButton1Click(Sender: TObject); forward;
procedure NewButton1Click(Sender: TObject);
begin

end;

procedure InitializeWizard();
begin
  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
    Name := 'NewButton1';
    Parent := WizardForm;
    Left := ScaleX(32);
    Top := ScaleY(327);
    Width := ScaleX(75);
    Height := ScaleY(25);
    OnClick := @NewButton1Click;
  end;

ответьте пожалуйста на вопрос. как мне сделать чтоб я на кнопочку нажал и ключ добавился?

AlexLAN 23-09-2012 10:53 1993412

Доброго времени суток.
Недавно загорелся идеей создать репак игры, все шло хорошо до того момента когда понадобилось в ini файле игры прописать путь до нее самой, но при этом чтобы не была указана буква диска.

Нужно чтобы значение ключа принимало примерно такой вид:
Код:

IDPath=\Game\Нэнси Дрю. Секреты могут убивать
Пробовал писать функцию с командой delete, но так как познания паскаля давно забыты, ничего не вышло. Писал примерно следующее:
Код:

[INI]
Filename: "{app}\Game.ini"; Section: "Nancy Data"; Key: "IDPath"; String: {code:CutString|{app}};

Function CutString(CutStr: string): String;

Begin
  delete (CutStr,1,2);
end;

Прошу людей с прямыми руками (не такими как у меня :wink:) помочь довести до ума.

Mailchik 23-09-2012 12:21 1993434

AlexLAN, попробуйте:
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[INI]
Filename: "{app}\Game.ini"; Section: "Nancy Data"; Key: "IDPath"; String: {code:Test};

[Code]
function Test(s : string):string;
 begin
  Result := copy(ExpandConstant('{app}'), 3, 100);
end;


El Sanchez 23-09-2012 12:35 1993438

Цитата:

Цитата Respin
На кустомной кнопки отмены прописываю: FStream.Free; WizardForm.Close;
Если во всей установки: Confirm:= False; то всё просто замечательно! Но если: Confirm:= True; ругается на эту строчку: FStream.WriteBuffer(fBuf, lpdwNumberOfBytesRead); Возможно ли как-то откатить установку без ошибок, но с живым Confirm? »

Respin, имхо, форму не нужно закрывать. В процедуре DownloadFile находите строчки и дописываете (допустим, что кастомная кнопка это CancelButton):
Код:

while (InternetQueryDataAvailable(hFile, lpdwNumberOfBytesAvailable, 0, 0) and (lpdwNumberOfBytesAvailable > 0)) do
begin
  if CancelButton.Cancel then Exit;
  SetArrayLength(lpBuffer, RoundDword(lpdwNumberOfBytesAvailable));

...

finally
  Timer.Enabled := False;
  FStream.Free;
  ProgressPage.Hide;
  CancelButton.Cancel := False;
end;

Обработчик OnClick кнопки:
Код:

procedure CancelButtonOnClick(Sender: TObject);
begin
    TButton(Sender).Cancel := True;
end;

Цитата:

Цитата SatHan
ответьте пожалуйста на вопрос. как мне сделать чтоб я на кнопочку нажал и ключ добавился? »

SatHan,
Код:

procedure NewButton1Click(Sender: TObject);
begin
  RegWriteStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Application_is1', 'QuietUninstallString', ExpandConstant('"{uninstallexe}" /SILENT'));
end;

Цитата:

Цитата AlexLAN
Прошу людей с прямыми руками (не такими как у меня ) помочь довести до ума »

AlexLAN, функция должна возвращать результат, поэтому добавьте:
Код:

function CutString(CutStr: String): String;
begin
  Delete(CutStr, 1, 2);
  Result := CutStr;
end;


AlexLAN 23-09-2012 12:50 1993446

El Sanchez
Спасибо, строка создалась верно.

Mailchik
Ваш способ не пробовал, но думаю что он тоже будет рабочим.

Спасибо за уделенное время =)

SatHan 23-09-2012 23:19 1993713

El Sanchez, Спасибо. то что нужно.

подскажите пожалуйста.
как заставить
Код:

[Run]
Filename: app.exe

чтоб запускалась только при нажатии горячей клавиши CTRL+ F2?

Johny777 24-09-2012 03:17 1993758

Можно мне пожалуйста пример заполнение массива записей именами файлов найденными по маске с последующим поиском имён но уже из массива (не статичный массив, тк файлов неизвестно сколько)
если по маске ничего не найдено то не заполнять массив (вообще никаких действий)

короче говоря записать в массив все файлы(их имена), которые удовлетворяют маске поиска

Цитата:

Цитата Johny777
улучшил функцию проверки строки на целое число »

Важно!
должен заметить что криво работает с нулём :(
откатился к этой:
Код:

function IsInt(const sTestStr: string): Boolean; 
var
  i: Integer;
begin
  Result := False;
  if Length(sTestStr) > 0 then
    for i := 0 to 9 do
      begin
        Result := Pos(IntToStr(i), sTestStr) > 0;
        if Result then
          Break;
      end;
end;

===============================================================================

Цитата:

Цитата wertulll
подбрось пример пожалуйста если не трудно. »

http://forum.oszone.net/post-1968497-631.html

Цитата:

Цитата wertulll
А вобще можно скин убрать с этого окна ??? »

если устроит такой вариант:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: steam.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: ISSkin.dll; DestDir: {tmp}; Flags: dontcopy

[  Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('steam.cjstyles');
LoadSkin(ExpandConstant('{tmp}\steam.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
  UnloadSkin();
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
  WizardForm.Hide;
  Sleep(200);
  UnloadSkin();
  if ExitSetupMsgBox = False then
  begin
    Cancel := False;
    LoadSkin(ExpandConstant('{tmp}\steam.cjstyles'), '');
    WizardForm.Show;
  end else Cancel := True;
end;



=============================================================

SatHan,
Чтоб мне не спороть чушь: вроде для этого используются хуки. Могут быть слышны маты антивиря
поставь инно ультру и в \Inno Setup 5\Scripts\WindowsHook есть пример

Ivan_009 25-09-2012 15:59 1994555

Вложений: 1
Как сделать чтобы при нажатии на кнопку появлялась форма png...Заранее спасибо...

Johny777 25-09-2012 16:52 1994579

Цитата:

Цитата Ivan_009
форма png »

мои скудные знания и логика говорят что это словосочетание не возможно

Цитата:

Цитата Ivan_009
чтобы при нажатии на кнопку появлялась ... png »

читать дальше »
Код:

#define ShowPic "Pic.png"

[Setup]
AppName=Reg_Path_Demo
AppVerName=Reg_Path_Demo
DefaultDirName={pf}\Reg_Path_Demo

[Files]
Source: isgsg.dll; Flags: ignoreversion dontcopy nocompression solidbreak sortfilesbyextension
Source: Pic.png; Flags: ignoreversion dontcopy nocompression solidbreak sortfilesbyextension

[  code]
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

procedure Show(Sender: TObject);
begin
  if not FileExists(ExpandConstant('{tmp}\{#ShowPic}')) then ExtractTemporaryFile('{#ShowPic}');
  ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\{#ShowPic}',300,3000,300,0,255,False,$FFFFFF,10);
end;


procedure InitializeWizard();
begin
  with TButton.Create(nil) do
  begin
    Parent := WizardForm;
    Caption := 'Push';
    Top := ScaleY(320);
    Left := ScaleX(20);
    OnClick := @Show;
  end;
end;



положить рядом со скриптом:
isgsg.dll (библиотека от South)
Pic.png

форма - другой разговор

Ivan_009 25-09-2012 17:56 1994606

Johny777, Спасибо... А как сделать чтобы эта картинка была строго по инсталлятору...

Gnom_aka_Lexander 25-09-2012 19:32 1994646

Johny777, маладца! Я тоже знаю, что совсем не это человеку нужно, ну да ладно, сам хотел приколоться :)Ivan_009, в обработчик кнопки вешаешь не сплешь а функцию ImgLoad из botva2.dll. в ней-же и укажешь нужные тебе размеры относительно инсталлятора.

Ivan_009 25-09-2012 19:47 1994652

Gnom_aka_Lexander, а как сделать чтобы картинка закрывалась при нажатии на кнопку...

Gnom_aka_Lexander 25-09-2012 19:55 1994654

Johny777, есть. он идет вместе с библиотекой.Ivan_009, ImgLoad делаешь сразу, а в обработчике используешь ImgGetVisible, для проверки и ImgSetVisible для управления примерно так:
Код:

if ImgGetVisible(img) then ImgSetVisible(img, false) else  ImgSetVisible(img, true);
а лучше так:
Код:

case ImgGetVisible(img) of
  true : ImgSetVisible(img, false);
  false: ImgSetVisible(img, true);
end;

Хотя, как управлять условием - не более, чем дело вкуса, но по моему субъективному мнению, case... of работает быстрее.
P.S. и да, пишу по памяти, возможны грамматические ошибки.

Ivan_009 25-09-2012 20:09 1994661

Gnom_aka_Lexander, У меня почемуто ошибка....

nik1967 25-09-2012 20:21 1994669

Ivan_009,
ImgGetVisibility
ImgSetVisibility
А открыть botva2.iss и посмотреть процедуры - не вариант?

Gnom_aka_Lexander 25-09-2012 20:29 1994672

Цитата:

Цитата Ivan_009
У меня почемуто ошибка.... »

Цитата:

Цитата Gnom_aka_Lexander
P.S. и да, пишу по памяти, возможны грамматические ошибки. »

посему
Цитата:

Цитата nik1967
А открыть botva2.iss и посмотреть процедуры - не вариант? »


Ivan_009 25-09-2012 20:36 1994681

nik1967, чет нехочет закрыватся картинка открыватся открывается а закрытся не хочет... :(
код
procedure RepackButton(hBtn:HWND);
begin
case ImgGetVisibility(Logo) of
true : ImgSetVisibility(Logo, false);
false: ImgSetVisibility(Logo, true);
end;
ImgApplyChanges(WizardForm.Handle);
end;


Logo:= ImgLoad(WizardForm.handle, ExpandConstant('logo.png'), ScaleX(0), ScaleY(0), ScaleX(700), ScaleY(365), True, True);
ImgSetVisibility(Logo, false);
hRepackBtn:=BtnCreate(WizardForm.Handle, ScaleX(9), ScaleY(363), ScaleX(29), ScaleY(35), ExpandConstant('about.png'), 5, false);
BtnSetEvent(hRepackBtn,BtnClickEventID,WrapBtnCallback(@RepackButton,1));
BtnSetCursor(hRepackBtn,GetSysCursorHandle(32649));

Gnom_aka_Lexander, Спасибо все заработало... :yes:

Gnom_aka_Lexander 25-09-2012 20:46 1994686

Ivan_009, я это для кого писал?
Цитата:

Цитата Gnom_aka_Lexander
ImgLoad делаешь сразу, а в обработчике используешь ImgGetVisible, для проверки и ImgSetVisible для управления »

Код:

Logo:= ImgLoad(WizardForm.handle, ExpandConstant('logo.png'), ScaleX(0), ScaleY(0), ScaleX(700), ScaleY(365), True, True);
это переносишь туда, где создаешь кнопку. там-же следом - ImgSetVisibility(Logo, false);

Tco 03 26-09-2012 10:05 1994953

Подскажите, пожалуйста. Как привязать кустомные Check Box к одному из компонентов. То есть, если кустомный Check Box выбран, то становится выбранным и компонент?

Gnom_aka_Lexander 26-09-2012 10:14 1994956

в обработчике чекбокса пишешь:
Код:

cese твой Чекбокс.Checked of
  true : WizardForm.ComponentsList.CheckItem(0, cocheck);
  false: WizardForm.ComponentsList.CheckItem(0, coUncheck);
end;

там, где нолик - порядковый номер твоего компонента. и учитывай, что нумерация начинается с нуля.

SatHan 26-09-2012 10:25 1994965

Цитата:

Цитата Johny777
и в \Inno Setup 5\Scripts\WindowsHook есть пример »

ошибку выдаёт
Цитата:

Файл: C:\Program Files\Inno Setup 5\Scripts\WindowsHook\WindowsHook.iss

Строка: 10:
Column 3:
Duplicate identifier 'TMSG'
только я не нашёл где дубль.

ещё примерчик слишком большой и многого не понятно. может есть рабочий по меньше примерчик?

подскажите как сделать чтоб вместа галочки 'создать ярлык на рабочий стол' при переходе на страницу готовности всплыло сообщение 'создать ярлык на рабочем столе?' и кнопки 'Да' 'Нет'?

Gnom_aka_Lexander 26-09-2012 10:26 1994969

Цитата:

Цитата SatHan
только я не нашёл где дубль. »

просто удали эту структуру, когда писался этот скрипт, инно еще не содержала TMSG
Цитата:

Цитата SatHan
подскажите как сделать чтоб вместа галочки 'создать ярлык на рабочий стол' »

покажи секцию ярлыков.

SatHan 26-09-2012 10:31 1994973

Цитата:

Цитата Gnom_aka_Lexander
просто удали эту структуру, когда писался этот скрипт, инно еще не содержала TMSG »

спасибо. убрал
Код:

  TMSG = record
    hwnd:    HWND;
    msg:    LongWord;
    wParam:  Word;
    lParam:  LongWord;
    MsgTime: LongWord;
    pt:      TPOINT;
  end;

похоже работает. тока мне всё равно не понятен код.
нужно http://forum.oszone.net/post-1993713-1015.html

Цитата:

Цитата Gnom_aka_Lexander
покажи секцию ярлыков. »

Код:

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

[Icons]
Name: "{commondesktop}\Application"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon

нужно чтоб заместо [Tasks] всплывало.

Gnom_aka_Lexander 26-09-2012 10:42 1994980

SatHan,
Вариант номер один, мне не нравится, но соответствует поставленому тобой условию:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Icons]
Name: "{commondesktop}\Application"; Filename: "{app}\MyProg.exe"; Check: desktopicon

[*code]
var
  Desctop : Boolean; // опорный флаг, исходя из которого будем создавать или не создавать ярлык
 
function desktopicon: Boolean;
begin
  Result := Desctop;
end;

function InitializeSetup(): Boolean;
begin
  Desctop := False; // Изначально говорим, что не нужно создавать ярлык.
  Result := True;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpReady then // Спрашиваем на странице готовности
    Desctop := MsgBox(ExpandConstant('{cm:CreateDesktopIcon}'), mbConfirmation, MB_YESNO)= IDYES;
end;



Второй вариант - я считаю его более правильным.
Запрос будет во время установки, непосредственно в момент создания ярлыков.
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Icons]
Name: "{commondesktop}\Application"; Filename: "{app}\MyProg.exe"; Check: desktopicon

[*code]
function desktopicon: Boolean;
begin
  Result := MsgBox(ExpandConstant('{cm:CreateDesktopIcon}'), mbConfirmation, MB_YESNO)= IDYES;
end;



естественно, задачу на создания ярлыка нужно удалить.

R.i.m.s.k.y. 26-09-2012 11:06 1995002

Цитата:

Цитата Gnom_aka_Lexander
там, где нолик - порядковый номер твоего компонента. и учитывай, что нумерация начинается с нуля. »

Ога, а потом в дистрах постоянно выскакивает "out of bounce"

_____________

Tco 03,
вот так можно узнать номер компонента по его имени или наоборот - по номеру узнать название
Код:

...
# define SVP "SmoothVideo Project 3.1"
...
SVPname := WizardForm.ComponentsList.Items.IndexOf(ExpandConstant('{#SVP}')); // номер по названию
SVPappname := WizardForm.ComponentsList.ItemCaption[SVPname]; //название по номеру
if SVPname >= 0 then begin
 твои действия
end;


apozlevich 26-09-2012 12:32 1995039

А как сделать так, что бы на 32-битной системе установился один файл, а на 64-битной другой?

Gnom_aka_Lexander 26-09-2012 12:37 1995041

apozlevich, встроенная функция IsWin64 на файле, который под 64 стравишь Check : IsWin64 , который под 32 - Check : not IsWin64

apozlevich 26-09-2012 12:43 1995046

Gnom_aka_Lexander, спасибо! Многого же нет в официальном FAQ о_О

А как сделать так, что бы если выбран компонент, менялась директива Setup (например Uninstallable) и запрещались иконки и записи в реестр?

Еще вопрос: как сделать так, что в зависимости от разрядности процессора (32-bit или 64-бит) меняется путь к файлу для ярлыков? Можно ли поступить так же, как и с файлами?

R.i.m.s.k.y. 26-09-2012 12:56 1995058

Цитата:

Цитата apozlevich
А как сделать так, что бы если выбран компонент, менялась директива Setup (например Uninstallable) и запрещались иконки и записи в реестр? »

Не все директивы Setup можно менять
Цитата:

Цитата apozlevich
Еще вопрос: как сделать так, что в зависимости от разрядности процессора (32-bit или 64-бит) меняется путь к файлу для ярлыков? »

Точно так же как и выше Check: IsWin64 один путь, Check: not IsWin64 другой путь
_______
У каждой секции, кроме кода, есть свойство Components
Можно комбинировать, к примеру Components: not a; или Components: a and (not b);

Ты бы код выложил так проще будет хелпать чем сферические примеры рисовать

Gnom_aka_Lexander 26-09-2012 12:57 1995060

Цитата:

Цитата apozlevich
менялась директива Setup »

Встроенная функция IsComponentSelected тут поможет. но не везде - некоторые свойства секции Setup не могут управляться внешними функциями.
Цитата:

Цитата apozlevich
и запрещались иконки и записи в реестр? »

в каждой секции есть свойство Components : имя компонента.
Цитата:

Цитата apozlevich
Странно, этого нет в официальном FAQ о_О »

в справке есть вообще все. и где ты нашел официальный фак? Я тоже хочу поглядеть - вдруг там чего полезное есть?
Цитата:

Цитата apozlevich
в зависимости от разрядности процессора (32-bit или 64-бит) »

Процессора или ОС ? Это разные вещи.

t16bz 26-09-2012 13:33 1995079

Здравствуйте. Нужно сделать чтобы перед появлением WizardForm появлялась, например Forma1, и только после ее закрытия появлялась WizardForm

apozlevich 26-09-2012 14:03 1995099

Цитата:

Цитата Gnom_aka_Lexander
официальный фак »

Вот FAQ, Knowledge Base и референс от автора. До этого момента я смотрел только в референс, теперь буду смотреть все :) И втроенный хелп гляну.

Цитата:

Цитата Gnom_aka_Lexander
Процессора или ОС ? Это разные вещи. »

Торможу, конечно ОС

Цитата:

Цитата R.i.m.s.k.y.
Ты бы код выложил так проще будет хелпать чем сферические примеры рисовать »

Вот напишу по вашим примерам - выложу :)

Gnom_aka_Lexander 26-09-2012 14:10 1995104

Цитата:

Цитата apozlevich
Вот FAQ, Knowledge Base и референс от автора. »

А, ну да. там настолько мало полезного, что я и забыл совсем про них. А база знаний создавалась настолько давно, что половина примеров уже просто неактуальна. Родная встроенная справка - наше все. хотя, да, на примерах работать проще. именно для этого с инно идет немаленькая пачка примеров в папке Examples

Ivan_009 26-09-2012 14:49 1995119

Возможно ли сделать так чтобы при запуске инсталлятора появлялось сообщение о выборе оформления одного или второго вида.... PS У меня инсталл в двух разных оформлениях нужно сделать так чтобы пользователь сам выбрал какое оформление ему использовать...Подскажите если кто знает как это реализовать...Заранее спасибо за любую помощь... :dont-know

R.i.m.s.k.y. 26-09-2012 14:52 1995121

Ivan_009, складывается ощущение будто инсталл важнее инсталлириуемой проги
Что есть глюпость.

Цитата:

Цитата apozlevich
Вот напишу по вашим примерам - выложу »

а) Все примеры в шапке.
б) Скрипт ты пишешь для себя сам.

Tco 03 26-09-2012 15:21 1995136

Цитата:

Цитата Gnom_aka_Lexander
в обработчике чекбокса пишешь:
Код:
case твой Чекбокс.Checked of
true : WizardForm.ComponentsList.CheckItem(0, cocheck);
false: WizardForm.ComponentsList.CheckItem(0, coUncheck);
end;
там, где нолик - порядковый номер твоего компонента. и учитывай, что нумерация начинается с нуля. »

Что-то не работает такая функция. Или Чекбокс обязательно должен находиться на SelectComponentsPage?

Gnom_aka_Lexander 26-09-2012 15:31 1995139

Цитата:

Цитата Tco 03
Или Чекбокс обязательно должен находиться на SelectComponentsPage? »

Не обязательно. после нее тоже можно. а вот раньше - не факт - если был найден АппИД в реестре, то при входе на страницу выбора компонентов, все компоненты восстанавливаются по предидущей установке. но это только в первый раз. а потом уже должен сохраняться выбор

Ivan_009, очень просто. создаешь булевую функцию, которая отрабатывает на запуске, и исходя из ее результата используешь то, или иное оформление. если вариантов больше двух, то можно не булевую, а целочисленную. по моему это логично, само в голову просится сразу.

Ivan_009 26-09-2012 15:48 1995144

Gnom_aka_Lexander, Примерчик не даш пожалуйста... :)

Mailchik 26-09-2012 21:20 1995338

Ivan_009,
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
 Test : boolean;

function InitializeSetup : boolean;
 begin
  Test := MsgBox('Использовать стандартное оформление?', mbInformation, MB_YESNO) = idYes;
  Result := True;
end;

procedure InitializeWizard;
 begin
  case Test of
  True: begin
    with WizardForm do begin
    ClientWidth := ScaleX(400);
    ClientHeight := ScaleX(400);
    Color := clRed;
    end;
  end;
  False: begin
    with WizardForm do begin
    ClientWidth := ScaleX(500);
    ClientHeight := ScaleX(200);
    Color := clLime;
    end;
  end;
  end;
end;


Johny777 27-09-2012 11:33 1995509

Цитата:

Цитата t16bz
Нужно сделать чтобы перед появлением WizardForm появлялась, например Forma1, и только после ее закрытия появлялась WizardForm »

пример 1:
читать дальше »
Код:

[Setup]
AppName=Reg_Path_Demo
AppVerName=Reg_Path_Demo
DefaultDirName={pf}\Reg_Path_Demo



[  code]
function CreateFormAtFirst: boolean;
var
  fForm: TForm;
begin
  fForm := TForm.Create(nil);
  with fForm do
  begin
    ClientWidth := ScaleX(360);
    ClientHeight := ScaleY(487);
    Position := poScreenCenter;
    BorderStyle := bsDialog;
    Caption := 'Лучший зпголовок'

   
    with TButton.Create(nil) do
    begin
      Parent := fForm;
      SetBounds(fForm.ClientWidth - ScaleX(75),fForm.ClientHeight - ScaleY(30),Scalex(70),ScaleY(25));
      Caption := SetupMessage(msgButtonCancel);
      ModalResult := mrCancel;
      Cursor := crHand;
    end;

    with TButton.Create(nil) do
    begin
      Parent := fForm;
      SetBounds(fForm.ClientWidth - ScaleX(155),fForm.ClientHeight - ScaleY(30),Scalex(70),ScaleY(25));
      Caption := SetupMessage(msgButtonOK);
      ModalResult := mrOk;
      Cursor := crHand;
    end;
   
    Result := ShowModal = mrOk;
    Free;
  end;
end;


function InitializeSetup(): Boolean;
begin
  Result := CreateFormAtFirst;
end;



пример 2:
читать дальше »
Код:

[Setup]
AppName=Reg_Path_Demo
AppVerName=Reg_Path_Demo
DefaultDirName={pf}\Reg_Path_Demo



[  code]
procedure InitializeWizard();
var
  fForm: TForm;
begin
  fForm := TForm.Create(nil);
  with fForm do
  begin
    ClientWidth := ScaleX(360);
    ClientHeight := ScaleY(487);
    Position := poScreenCenter;
    BorderStyle := bsDialog;
    Caption := 'Лучший зпголовок'


    with TButton.Create(nil) do
    begin
      Parent := fForm;
      SetBounds(fForm.ClientWidth - ScaleX(75),fForm.ClientHeight - ScaleY(30),Scalex(70),ScaleY(25));
      Caption := SetupMessage(msgButtonCancel);
      ModalResult := mrCancel;
      Cursor := crHand;
    end;

    with TButton.Create(nil) do
    begin
      Parent := fForm;
      SetBounds(fForm.ClientWidth - ScaleX(155),fForm.ClientHeight - ScaleY(30),Scalex(70),ScaleY(25));
      Caption := SetupMessage(msgButtonOK);
      ModalResult := mrOk;
      Cursor := crHand;
    end;

    ShowModal;
    Free;
  end;
 
  /// остальной код
 
end;


в этом примере продолжению выполнения процедуры не даёт команда форме ShowModal;


Ваня!
для тебя родимого как вариант :)
если б делал выбор стилей сделал бы так:

читать дальше »
Код:

[Setup]
AppName=Reg_Path_Demo
AppVerName=Reg_Path_Demo
DefaultDirName={pf}\Reg_Path_Demo



[  code]
var
  wAnswer: Byte;
  OK_Button: TButton;
 
procedure sComboBoxOnChange(Sedner: TObject);
begin
  OK_Button.SetFocus;
end;

function AskForStyle(DefStyle:Byte;sQuestion,sStyle1,sStyle2:String):Byte;
var
  sComboBox: TComboBox;
  sForm: TForm;
begin
  sForm := TForm.Create(nil);
  with sForm do
  begin
    ClientWidth := ScaleX(200);
    ClientHeight := ScaleY(70);
    Position := poScreenCenter;
    BorderStyle := bsDialog;
    Caption := sQuestion;

    sComboBox := TComboBox.Create(nil)       
    with sComboBox do
    begin
      Parent := sForm;
      SetBounds(ScaleX(5),ScaleY(10),ScaleX(130),ScaleY(21));
        Items.add(sStyle1);
        Items.add(sStyle2);
      Style := csDropDownList;
      Cursor := crHand;
      ItemIndex := DefStyle;
      OnChange := @sComboBoxOnChange;
    end;

    with TButton.Create(nil) do
    begin
      Parent := sForm;
      SetBounds(sForm.ClientWidth - ScaleX(75),sForm.ClientHeight - ScaleY(30),Scalex(70),ScaleY(25));
      Caption := SetupMessage(msgButtonCancel);
      ModalResult := mrCancel;
      Cursor := crHand;
    end;

    OK_Button := TButton.Create(nil)
    with OK_Button do
    begin
      Parent := sForm;
      SetBounds(sForm.ClientWidth - ScaleX(155),sForm.ClientHeight - ScaleY(30),Scalex(70),ScaleY(25));
      Caption := SetupMessage(msgButtonOK);
      ModalResult := mrOk;
      Cursor := crHand;
    end;
   
    sForm.ActiveControl := OK_Button;

    if ShowModal = mrOk then Result := mrOk + sComboBox.ItemIndex else Result := 0;

    Free;

  end;
end;


function InitializeSetup(): Boolean;
begin
  ///////////////////(стиль по умолчаниб - 0 или 1//// название заголовка окна//// название первого стиля /// название второго стиля)
  /// Функция вернёт число равное 0 - нажали на отмену, 1 - 1 + индекс выбранного айтема(0+1), 2 - индекс выбранного айтема
  wAnswer := AskForStyle(1,'какой стиль юзать?','Стиль 1','Стить 2');
  Result := wAnswer <> 0;
end;


procedure InitializeWizard();
begin
  /// здесь общий код для двух стилей

  if wAnswer = 1 then
  begin
    /// код для первого слитя
 
    MsgBox('будет использован стиль 1', mbInformation, MB_OK);
  end else
  begin
    /// код для вторго слитя

    MsgBox('будет использован стиль 2', mbInformation, MB_OK);
  end;
   
end;


ispolin 27-09-2012 12:59 1995552

подскажите плиз что куда прописать

http://img837.imageshack.us/img837/259/87614951.jpg

нужно скрыть что куда распаковывается и оставить лишь надпись "Распаковка файлов..."

и ещё

http://img337.imageshack.us/img337/7807/86402742.jpg

как надпись сделать другим цветом, уж больно блёклая

R.i.m.s.k.y. 27-09-2012 13:09 1995557

Цитата:

Цитата ispolin
нужно скрыть что куда распаковывается и оставить лишь надпись "Распаковка файлов..."
как надпись сделать другим цветом, уж больно блёклая»

Код:

procedure InitializeWizard();
begin
//прячем имена файлов
WizardForm.FileNameLabel.Visible:= False;
//голубой цвет текста вместо блеклого
  with WizardForm do begin
    with BeveledLabel do begin
    Font.Color:=clBlue;
    Enabled:=True;
    end;
  end;
end;


Ivan_009 28-09-2012 11:41 1996023

Как текструировать прогрессбар на деинсталляторе через ботву если можно пример... :) Заранее спасибо за помощь...

SatHan 28-09-2012 12:16 1996042

привет. есть у меня дополнение Update_1.6.2 к программе. которое выполняется через секцию [run].
Код:

[Run]
Filename: {src}\Update_x.x.x.exe; Description: Update

но вместо 1.6.2 может быть 1.7.0. что нужно сделать для того чтоб она выполнялась не зависимо от написанной версии в имени дополнения?

Johny777 28-09-2012 12:36 1996059

SatHan,
я б так сделал:
читать дальше »
Код:

[Setup]
AppName=Reg_Path_Demo
AppVerName=Reg_Path_Demo
DefaultDirName={pf}\Reg_Path_Demo

[Run]
Filename: {code:update}; Description: Update

[  code]
function update(uFile:String):String;
var
  File:String;
begin
  GetOpenFileName('укажите файл обновления', File, ExpandConstant('{src}'), 'файл обновления (*.exe)', '*.exe');
  Result := File;
end;



Ivan_009, Посмотри. Я тебе на предыдущей странице код намутячил

Ivan_009 28-09-2012 14:55 1996141

Johny777, А для этого примера как сделать?

Dima2009 28-09-2012 17:41 1996239

Вложений: 1
Всем доброго времени!

Люди знающии как файл "TC.xxx" в папке "{app}\Other" ассоциировать с иконкой "Icon.ico" в папке "{app}\Icons" после завершения установки!
читать дальше »

[Setup]
AppName=My Program
AppVersion=0.0
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
Compression=lzma2
SolidCompression=yes
OutputDir=.

[Files]
Source: {app}\Icon.ico; DestDir: {app}\Icons; Flags: ignoreversion
Source: {app}\TC.xxx; DestDir: {app}\Other; Flags: ignoreversion

[Tasks]
Name: fileassoc; Description: Ассоциировать файл (TC.xxx) с иконкой

R.i.m.s.k.y. 28-09-2012 17:44 1996244

Dima2009, что ты понимаешь под набором словей "файл ассоциировать с иконкой"?

Dima2009 28-09-2012 17:49 1996249

Чтобы значки у файлов с расширением ".xxx" стали как у иконки в папке "{app}\Icons"

R.i.m.s.k.y. 28-09-2012 17:52 1996251

Dima2009,
Код:

[Setup]
AppName=My Program
AppVersion=0.0
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
Compression=lzma2
SolidCompression=yes
OutputDir=.
// говорим шеллу чтобы он переобновил ассоциации после установки
ChangesAssociations=true
ChangesEnvironment=true

[Files]
Source: {app}\Icon.ico; DestDir: {app}\Icons; Flags: ignoreversion
Source: {app}\TC.xxx; DestDir: {app}\Other; Flags: ignoreversion

[Tasks]
Name: fileassoc; Description: Ассоциировать файл (TC.xxx) с иконкой

[Registry]
// при выборе задачи "Ассоциировать файл" в реестре будет прописано
// xxxname - виндовая переменная, file xxx - название (для человеков)
Tasks: fileassoc; Root: HKCR; SubKey: .xxx; ValueType: string; ValueData: xxxname; Flags: uninsdeletekey
Tasks: fileassoc; Root: HKCR; SubKey: xxxname; ValueType: string; ValueData: file xxx; Flags: uninsdeletekey
Tasks: fileassoc; Root: HKCR; Subkey: xxxname\DefaultIcon; ValueType: string; ValueData: {app}\Icons\Icon.ico,0; Flags: uninsdeletevalue


Dima2009 28-09-2012 18:20 1996261

Вложений: 1
Ещё вопрос, встречал интсталлятор который без файла "ярлык интернета" в одной папке пишет.
Отсутствуют некоторые файлы инсталлятора!
Установка отменена.

Как самому так сделать?

R.i.m.s.k.y. 28-09-2012 18:33 1996271

Dima2009,
Код:

[*Code]
Function InitializeSetup: Boolean;
begin
  Result := True;
  If FileExists(ExpandConstant('{src}\file.log')) THEN begin
    MsgBox('Отсутсвуют файлы установки!' + #13#10 + 'Установка прекращена', mbError, mb_Ok);
    Result := False;
  end
  else Result := True;
// функция InitializeSetup - начальная, выполняется самой первой после запуска инсталлера, если она вернет false - инсталлер закроется и не пискнет
end;


______________

Что-то я подзабыл какие слова:
а) прекращают итерацию цикла и переходят на следующую итерацию
б) завершают цикл совсем досрочно
в) завершают функцию/процедуру

Johny777 28-09-2012 19:16 1996288

Ivan_009,
описание использования читай!

читать дальше »
Код:


    /// AskForStyle(стиль по умолчанию - 0 или 1, название заголовка окна, название первого стиля, название второго стиля) возвращает 0, 1, 2
  wAnswer := AskForStyle(0,'какой стиль юзать?','Steam стиль','White стиль');
  /////////////////////////////////////////////////// 0 /////////\\\ 1 //////

  /// Функция вернёт число равное 0 - нажали на отмену, 1 - 1 + индекс выбранного айтема(0+1) = стиль 1, 2 - индекс выбранного айтема (1+1) - стиль 2

....

procedure InitializeWizard();
begin
  /// здесь общий код для двух стилей

  if wAnswer = 1 then
  begin
    /// код для первого слитя

    Cvet:='_steam';
   
    MsgBox('будет использован стиль 1', mbInformation, MB_OK);
  end else
  begin
    /// код для вторго слитя
   
    Cvet:='_white';
   
    MsgBox('будет использован стиль 2', mbInformation, MB_OK);
  end;

end;



вот упрости функцияю, а то у меня малость запутано с этим нулём
чтоб вместо стиля по умолчанию - 0 или 1 было 1 или 2
впиши в функции заместо ItemIndex := DefStyle; это ItemIndex := DefStyle - 1; и в первом параметре отправляй стиль по умолчанию (выбранный по умолчанию айтем комбобокса)
те для стиля 1 - AskForStyle(1, ...
для стиля 2 - AskForStyle(2, ...

я ввёл в ф-ю "стиль по умолчанию" тк у тебя 100% один из двух стилее более рекомендованный и чтоб он был заранее выбран при первом запуске

Dima2009 28-09-2012 19:27 1996292

Вложений: 1
Цитата:

Цитата R.i.m.s.k.y.
[*Code]
Function InitializeSetup: Boolean;
begin
Result := True;
If FileExists(ExpandConstant('{src}\file.log'))) then begin
MsgBox('Отсутсвуют файлы установки!' + #13#10 + 'Установка прекращена', mbError, mb_Ok);
Result := False;
end
else Result := True;
// функция InitializeSetup - начальная, выполняется самой первой после запуска инсталлера, если она вернет false - инсталлер закроется и не пискнет
end; »


R.i.m.s.k.y. 28-09-2012 19:31 1996296

Dima2009, скобка лишняя, две открываются и три закрываются

Dima2009 28-09-2012 19:40 1996299

Цитата:

Цитата R.i.m.s.k.y.
Dima2009, »

тут наоборот получаеться без файла устанавливаеться а с файлом нет.

Johny777 28-09-2012 19:43 1996300

Цитата:

Цитата Dima2009
ут наоборот получаеться без файла устанавливаеться а с файлом нет. »

If not FileExists(ExpandConstant('{src}\file.log'))

R.i.m.s.k.y., Dima2009,
можно записать покороче (спасибо El Sanchez-у) :) тк FileExists возвращает булев значение которое можно напрямую передать в понимающий только эти значения в функции InitializeSetup зарезервированной переменной Result
Код:

function InitializeSetup(): Boolean;
begin
  Result := FileExists(ExpandConstant('{src}\file.log'));
  if not Result then MsgBox('Отсутсвуют файлы установки!' + #13#10 + 'Установка прекращена', mbError, mb_Ok);
end;


Ivan_009 28-09-2012 19:48 1996303

Johny777, При нажатии на отмена вот такая ошибка...

R.i.m.s.k.y. 28-09-2012 19:49 1996304

Johny777, да можно и так, только вот бывает глюк что без явного Result := True инсталлер самозакрывается.
Поэтому во избежание я всегда явно указываю где False а где True

Dima2009, пятницо, сам понимаешь ;)
Код:

[*Code]
Function InitializeSetup: Boolean;
begin
Result := True;
If ( not FileExists(ExpandConstant('{src}\file.log')) ) then begin
MsgBox('Отсутсвуют файлы установки!' + #13#10 + 'Установка прекращена', mbError, mb_Ok);
Result := False;
end
else Result := True;
// функция InitializeSetup - начальная, выполняется самой первой после запуска инсталлера, если она вернет false - инсталлер закроется и не пискнет
end;


Dima2009 28-09-2012 19:57 1996309

Вложений: 1
R.i.m.s.k.y., Johny777 - Спасибо вам за помощь!

А реально написать код деинсталлятора как у NSIS

Nasedkin Nikita 29-09-2012 08:22 1996480

Люди!!! Подскажите, пожайлуста как создать такой инсталятор

ispolin 29-09-2012 12:30 1996523

вот задача
Код:

[Files]
Source: {tmp}\java6x86.exe; DestDir: {tmp}; Components: java6x86; MinVersion: 0.0,5.01; Flags: deleteafterinstall
Source: {tmp}\java6x64.exe; DestDir: {tmp}; Components: java6x64; MinVersion: 0.0,5.01; Flags: deleteafterinstall 64bit
Source: {tmp}\java7x64.exe; DestDir: {tmp}; Components: java7x64; MinVersion: 0.0,5.01; Flags: deleteafterinstall 64bit
Source: {tmp}\java7x86.exe; DestDir: {tmp}; Components: java7x86; MinVersion: 0.0,5.01; Flags: deleteafterinstall
[Run]
Filename: {tmp}\java6x86.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 6 устанавливается...Ждите...; Components: java6x86; MinVersion: 0.0,5.01
Filename: {tmp}\java6x64.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 6 устанавливается...Ждите...; Components: java6x64; MinVersion: 0.0,5.01
Filename: {tmp}\java7x64.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 7 устанавливается...Ждите...; Components: java7x64; MinVersion: 0.0,5.01
Filename: {tmp}\java7x86.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 7 устанавливается...Ждите...; Components: java7x86; MinVersion: 0.0,5.01
[Components]
Name: java6x86; Description: Java(TM) Platform SE 6 Update 35 для x86 систем; Check: IsX86; MinVersion: 0.0,5.01
Name: java6x64; Description: Java(TM) Platform SE 6 Update 35 для x64 систем; Check: IsX64; MinVersion: 0.0,5.01
Name: java7x64; Description: Java(TM) Platform SE 7 Update 7 для x64 систем; Check: IsX64; MinVersion: 0.0,5.01
Name: java7x86; Description: Java(TM) Platform SE 7 Update 7 для x86 систем; Check: IsX86; MinVersion: 0.0,5.01

после запуска программы, она автоматом определит разрядность и выведет подходящие компоненты для установки, однако выводится будут оба
Java(TM) Platform SE 6 Update 35 для x86 систем
Java(TM) Platform SE 7 Update 7 для x86 систем
и это правильно, но нужно при выборе одной версии, запретить установку другой т.е , чтобы невозможно было поставить чекбокс на обе сразу
помогите плиз

R.i.m.s.k.y. 29-09-2012 13:25 1996540

ispolin, читай в хелпе про флаг exclusive
Код:

[Components]
Name: x86; Description: Java(TM) для x86 систем; Check: IsX86; MinVersion: 0.0,5.01;
Name: x86\java6x86; Description: Java(TM) Platform SE 6 Update 35 для x86 систем; Check: IsX86; MinVersion: 0.0,5.01; Flags: exclusive
Name: x86\java7x86; Description: Java(TM) Platform SE 7 Update 7 для x86 систем; Check: IsX86; MinVersion: 0.0,5.01; Flags: exclusive
Name: x64; Description: Java(TM) для x64 систем; Check: IsX64; MinVersion: 0.0,5.01;
Name: x64\java6x64; Description: Java(TM) Platform SE 6 Update 35 для x64 систем; Check: IsX64; MinVersion: 0.0,5.01; Flags: exclusive
Name: x64\java7x64; Description: Java(TM) Platform SE 7 Update 7 для x64 систем; Check: IsX64; MinVersion: 0.0,5.01; Flags: exclusive

[Files]
Source: {tmp}\java6x86.exe; DestDir: {tmp}; Components: x86\java6x86; MinVersion: 0.0,5.01; Flags: deleteafterinstall
Source: {tmp}\java6x64.exe; DestDir: {tmp}; Components: x64\java6x64; MinVersion: 0.0,5.01; Flags: deleteafterinstall 64bit
Source: {tmp}\java7x64.exe; DestDir: {tmp}; Components: x64\java7x64; MinVersion: 0.0,5.01; Flags: deleteafterinstall 64bit
Source: {tmp}\java7x86.exe; DestDir: {tmp}; Components: x86\java7x86; MinVersion: 0.0,5.01; Flags: deleteafterinstall

[Run]
Filename: {tmp}\java6x86.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 6 устанавливается...Ждите...; Components: x86\java6x86; MinVersion: 0.0,5.01
Filename: {tmp}\java6x64.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 6 устанавливается...Ждите...; Components: x64\java6x64; MinVersion: 0.0,5.01
Filename: {tmp}\java7x64.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 7 устанавливается...Ждите...; Components: x64\java7x64; MinVersion: 0.0,5.01
Filename: {tmp}\java7x86.exe; Parameters: /S; StatusMsg: Java (TM) Platform SE 7 устанавливается...Ждите...; Components: x86\java7x86; MinVersion: 0.0,5.01


ispolin 29-09-2012 13:54 1996549

Здорово!
задача посложнее
Код:

[Files]
Source: {tmp}\DotNet.exe; DestDir: {tmp}; Components: framework; MinVersion: 0.0,5.01; Flags: deleteafterinstall
[Run]
Filename: {tmp}\DotNet.exe; Parameters: /S /nolang; StatusMsg: Microsoft .NET Framework устанавливается...Ждите...; Components: framework; MinVersion: 0.0,5.01
[Components]
Name: framework; Description: Microsoft .NET Framework 1.1 - 4.0; Check: IsX86; MinVersion: 0.0,5.01

нужно реализовать запуск с каждым ключом по отдельности, с запретом одновременного запуска
http://forum.oszone.net/thread-46682.html

R.i.m.s.k.y. 29-09-2012 14:00 1996555

ispolin
a) не надо ставить фреймворки 1-3,5, длостаточно поставить оригинальный .Net frameWork 3.5SP1, в нем уже содержатся все предудыщие пропатченные до SP2
б) пиши в RUN несколько строчек с нужными экзешниками с флагом waituntilterminated, инно выполняет скрипт сверху вниз. Этот флаг и так задан неявно пока не поставишь флаг shellexec

Aleksoid1978 29-09-2012 14:01 1996556

Всем привет. Подскажите, могу ли в функции
Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
вызывать
Код:

if IsTaskSelected('pintotaskbar') then
Вернее не то что могу ли, а будет ли от такого вызова толк. Отработает ли что при установке я ткнул нужнуб галку(сработало IsTaskSelected('pintotaskbar')).

Заранее спасибо.

El Sanchez

Вот окончательный мой код, работает и на х86 и на х64 системах, устанавливается и удаляется с таскбара корректно. Спасибо за помощь
Код:

// thank for code to "El Sanchez" from forum.oszone.net
procedure PinToTaskbar(Filename: String; IsPin: Boolean);
var
        hInst: THandle;
  buf: array [0..255] of char;
  i, Res: Integer;
  strVerb, sVBSFile: String;
  objShell, colVerbs, oFile: Variant;
begin
  if (GetWindowsVersion shr 24 < 6) or ((GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF < 1)) then Exit; // Windows 7 check

  if not FileExists(Filename) then Exit;
 
  if IsPin then Res := 5386 else Res := 5387;
  begin
    hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
    if hInst <> 0 then
    try
      for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
      try
        objShell := CreateOleObject('Shell.Application');
      except
        ShowExceptionMessage;
        Exit;
      end;
      oFile    := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename));
      colVerbs := oFile.Verbs;
     
      if IsWin64 and (Pos (ExpandConstant ('{pf64}\'), Filename) = 1) then begin
        sVBSFile := GenerateUniqueName (GetTempDir, 'mpc_be.vbs');
        SaveStringToFile (sVBSFile, \
          'Set oShell=CreateObject("Shell.Application")'  + #13 + \
          'Set oVerbs=oShell.NameSpace("' + ExtractFileDir (Filename) + '").ParseName("' + ExtractFileName (Filename) + '").Verbs' + #13 + \
          'For Each oVerb In oVerbs'                                                                                        + #13 + \
          '  If (oVerb="' + strVerb + '") Then'                                                + #13 + \
          '    oVerb.DoIt'                                                                                                                    + #13 + \
          '    Exit For'                                                                                                                            + #13 + \
          '  End If'                                                                                                                                + #13 + \
          'Next'                                                                                                                                , False);
 
        exec( ExpandConstant ('{win}\Sysnative\cscript.exe'), '"' + sVBSFile + '" /B', '', SW_HIDE, ewWaitUntilTerminated, i);
        DeleteFile (sVBSFile);
      end else begin
        for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then begin
                            if (IsPin and oFile.IsLink) then
                                    DeleteFile (ExpandConstant ('{userappdata}\Microsoft\Internet Explorer\Quick Launch\User Pinned\TaskBar\') + ExtractFileName (Filename));
         
          colVerbs.Item[i].DoIt;
          Break;
        end;
      end;
    finally
      FreeDLL(hInst);
    end;
  end;
end;


SatHan 29-09-2012 17:17 1996628

Вложений: 1
Цитата:

Цитата Johny777
я б так сделал: »

не то. в случае может быть много обновлений. каких нибудь переменных в роде Update_%.%.%.exe или Update_*.*.*.exe нет?


такой вопрос. как сделать чтоб инсталятор обнаруживал запущенную программу и если она запущена то инсталятор выдал сообщение с предупреждением и закрылся?

Цитата:

Цитата Nasedkin Nikita
Подскажите, пожайлуста как создать такой инсталятор »

панель нужна?
взято отсюда то что в первом посте.
в вложении прикрутил.

Gnom_aka_Lexander 29-09-2012 19:48 1996674

Цитата:

Цитата Nasedkin Nikita
Люди!!! Подскажите, пожайлуста как создать такой инсталятор »

Это скрипт Need for Speed™ Undercover Юршата, только поменяны картинки и стиль, не более. хотя, да, для многих замена картинки является поводом достаточным, чтоб решить, что скрипт уже совершенно другой, как это ни прискорбно. Куда мы катимся?

SARATOVSKY 29-09-2012 20:22 1996700

А можно ли отрезать от страницы, к примеру SelectDirPage, маленький кусок размером, к примеру 190*30? Просто мне на этом месте InnerPage нужна, SelectDirPage загораживает!!! Спасибо!

Johny777 30-09-2012 01:26 1996833

Цитата:

Цитата SatHan
каких нибудь переменных в роде Update_%.%.%.exe или Update_*.*.*.exe нет? »

хз

ну да ладно
Цитата:

Цитата SatHan
в случае может быть много обновлений. »

намутячил код :) (на основе модифицированного поиска по маске из шапки от Serega) и "Получение всех файлов в папке, с полными путями" Gnom_aka_Lexander

работает так
ищем сначала файлы по расширению (в данном случае .exe)
используя имена файлов добавляем эти самые имена в цикле в чеклистбокс состоящий из одних чекбоксов
имя файла = имя чекбокса
тут же это имя файла и путь пишется в статичный массив записей длиной в 201 элемент (извиняй. Здесь подошёл бы лучше динамичный, но я только начал знакомится с массивами)
те у нас например снаружи 10 экзешников(апдейтов) = 10 чекбоксов = 10 записей в массиве(в массиве с полными путями)

ну и на этапе утановки каком хочешь мы в зависимости от отмеченного чекбокса(-ов) запускаем тот или иной экзешник

код:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup


[  Code]
var
  UpudatePage: TWizardPage;
  updList: TNewCheckListBox;
  arrUpd:array [0..200] of string;

procedure Find_Files_By_Mask(Path,Mask:string;cbBox:TNewCheckListBox);
var
  FSR: TFindRec;
  FindResult: Boolean;
  i:Integer;
begin
  i := 0;

  if Path[Length(Path)] <> '\' then Path:= Path + '\';
  FindResult:= FindFirst(Path + Mask, FSR);
  try
    while FindResult do
    begin
      if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
      begin
        cbBox.AddCheckBox(FSR.Name, '', 0, True, True, True, True, nil);
        arrUpd[i] := Path + FSR.Name;
        i := i + 1;
      end;
      FindResult:= FindNext(FSR);
    end;
  finally
    FindClose(FSR);
  end;
end;


procedure InitializeWizard();
begin
  UpudatePage := CreateCustomPage(wpWelcome, 'Список Файлов обновления', 'что установить ?');

  updList := TNewCheckListBox.Create(WizardForm);
  with updList do
  begin
    Parent := UpudatePage.Surface;
    SetBounds(ScaleX(0),ScaleY(0),UpudatePage.SurfaceWidth,UpudatePage.SurfaceHeight - ScaleY(30));
  end;

  Find_Files_By_Mask(ExpandConstant('{src}'),'*.exe',updList);
 
  updList.Items.Delete(updList.Items.IndexOf('setup.exe'));

  MsgBox(arrUpd[1], mbInformation, MB_OK); 
end;



procedure CurStepChanged(CurStep: TSetupStep);
var
  i, ErrorCode: Integer;
begin
  i:=0
  if CurStep = ssInstall then
  begin
    repeat
      if updList.Checked[i] then Exec(arrUpd[i], '', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);
      MsgBox(IntToStr(i), mbInformation, MB_OK);
      i := i + 1;
    until i = updList.ItemCount;
  end;
end;



Цитата:

Цитата SatHan
как сделать чтоб инсталятор обнаруживал запущенную программу и если она запущена то инсталятор выдал сообщение с предупреждением и закрылся? »

в шапке есть 2 кода на определение работающего процесса
оба кода возвращают булев значение
попробуй ка сам на основе этого сообщения с кодом и функций из шапки сделать себе пример
http://forum.oszone.net/post-1996300-1067.html

SatHan 30-09-2012 07:19 1996880

Цитата:

Цитата Johny777
попробуй ка сам на основе этого сообщения с кодом »

я пробовал сам на основе рунтаск. вот код
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy

[#Code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
  If RunTask('notepad.exe', false) then
    begin
      MsgBox('блокнот запущен. пожалуйста закройте блокнот и запустите установку заново.', mbInformation,  MB_OK);
          Exit;
    end;
Result:=True;
end;

на большее мозгов не хватает.это по крайне мере лучший вариант
не устраивает ISTask.dll. хотелось бы без него обойтись еси можна.

R.i.m.s.k.y. 30-09-2012 08:07 1996882

Цитата:

Цитата SatHan
не устраивает ISTask.dll. хотелось бы без него обойтись еси можна. »

Код:

const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;

type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of char;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): Boolean; external 'CloseHandle@kernel32.dll stdcall';


function IsProcessRunning(FileName: String): Boolean;
var
    hProcessSnap: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile: String;
begin
  hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
  pe32.dwSize := sizeof(pe32);
  if not Process32First(hProcessSnap, pe32) then Exit;
  while not Result and Process32Next(hProcessSnap, pe32) do
  begin
    szExeFile := '';
    while not (pe32.szExeFile[Length(szExeFile)] = #0) do szExeFile := szExeFile + pe32.szExeFile[Length(szExeFile)];
    Result := LowerCase(FileName) = LowerCase(szExeFile);
  end;
  CloseHandle(hProcessSnap);
end;

function InitializeSetup(): Boolean;
begin
  If IsProcessRunning('notepad.exe') then begin
    MsgBox('блокнот запущен. пожалуйста закройте блокнот и запустите установку заново.', mbInformation,  MB_OK);
    Exit;
  end;
Result:=True;
end;


SatHan 30-09-2012 08:15 1996883

R.i.m.s.k.y., Johny777, Спасибо.
R.i.m.s.k.y., ничево себе сколько кода :o. хотелось как лучше а получилось как всегда :sorry:.
ладно я тада сам попробую что нибудь скумекать.

R.i.m.s.k.y. 30-09-2012 08:23 1996886

SatHan, CTRL+C CTRL+V

SatHan 30-09-2012 08:44 1996890

Цитата:

Цитата R.i.m.s.k.y.
CTRL+C CTRL+V »

Спасибо. я имел введу не копировать вставить. наоборот сам код упростить и уменьшить.

сделать тоже самое
читать дальше »
Код:

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy

[#Code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
  If RunTask('notepad.exe', false) then
    begin
      MsgBox('блокнот запущен. пожалуйста закройте блокнот и запустите установку заново.', mbInformation,  MB_OK);
          Exit;
    end;
Result:=True;
end;

но без использования ISTask.dll.

R.i.m.s.k.y. 30-09-2012 08:47 1996891

Цитата:

Цитата SatHan
сделать тоже самое
но без использования ISTask.dll. »

а) делается тоже самое
б) без использования ISTask.dll
шонитаг?
А ты думал одной строчкой все сделать хорошо?

Nasedkin Nikita 30-09-2012 10:20 1996923

Цитата:

Цитата SatHan
панель нужна?
взято отсюда то что в первом посте.
в вложении прикрутил. »

Спасибо, помогло. А картинки в инстал через botva2 ставить?

Mailchik 30-09-2012 11:56 1996945

SatHan, поменьше, от El Sanchez'а вроде:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
function IsProcessRunning(FileName: String): Boolean;
var
  objSWbemLocator, objSWbemServices: Variant;
begin
  try
    objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  except
    ShowExceptionMessage;
    Exit;
  end;
  objSWbemServices := objSWbemLocator.ConnectServer();
  objSWbemServices.Security_.ImpersonationLevel := 3;
  Result := (objSWbemServices.ExecQuery('SELECT * FROM Win32_Process WHERE Name="' + FileName + '"').Count > 0);
end;

procedure InitializeWizard();
begin
  if IsProcessRunning('notepad.exe') then
    MsgBox('yes', mbInformation, MB_OK)
  else
    MsgBox('no', mbError, MB_OK);
end;


R.i.m.s.k.y. 30-09-2012 12:00 1996946

Mailchik SatHan, пример хороший только как пример работы с WMI
На затвиканных вендах и говносборках этот вариант не работает тк в них убит наглухо WMI. Ошибка SwbemLocator: not found. Плавали, знаем

SatHan 30-09-2012 14:14 1997000

Mailchik, Спасибо.
много чего уж перепробовал, но оставил этот, так как код короче всех. потому шансов на ошибки мизерный.

R.i.m.s.k.y. 30-09-2012 14:24 1997012

SatHan
Цитата:

Цитата Johny777
код короче всех. потому шансов на ошибки мизерный. »
бред. »

+1024
C использованием IsTask можно нарваться на параноидальный антивирь который блокирует вызов сторонних неизвестных неподписанных библиотек и dll (IsTask в их числе, ога), как следствие получить в инсталлере "Ошибка вызова xxx.dll" и краш инсталлера.
Самый рабочий вариант в моем посте. Не помню кто его мне накидал, или Serega или El Sanchez

R.i.m.s.k.y. 30-09-2012 14:32 1997021

Цитата:

Цитата Johny777
тк подумал что пусть он делает что хочет »

дадад, главное потом на руторе не скачать ;)

SatHan 30-09-2012 14:55 1997034

Цитата:

Цитата R.i.m.s.k.y.
C использованием IsTask можно нарваться на параноидальный антивирь который блокирует »

мне друг так и сказал. чтоб я избавился от любых длл-ок которые обращаются к процессу. ещё он совет дал чтоб я очень не навешивал инсталятор всякими картинками так как часто происходят проблемы при антивирусных программах. в частности касается антивируса касперского. говорит что касперский привередлевее остальных и может случится что касперский запретит инициализацию инсталятора не говоря о левых исполнениях.

посоветовал собрать на этом коде
читать дальше »
Код:

[#code]
Function InitializeSetup: Boolean;
var
res : integer;
begin
Result := True;
Exec('ping.exe ', ' 2ip.ru ', ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, res);
if res = 0 then begin
MsgBox('Найдено подключение к интернету. Установка будет прекращена!', mbInformation, MB_OK);
Result := False;
end;
end;


говорит можно но помогать не будет. хочет чтоб я сам разобрал и посоветовал мне внимательно справку почитать.

SARATOVSKY 30-09-2012 19:29 1997229

Johny777, Да не надо, сделал уже по-другому!

R.i.m.s.k.y. 30-09-2012 19:33 1997231

Цитата:

Цитата SatHan
в частности касается антивируса касперского. говорит что касперский привередлевее остальных и может случится что касперский запретит инициализацию инсталятора не говоря о левых исполнениях. »

Ты еще Comodo File Antivirus не щупал, этот кусок гадости не дает почту принять, не пускает к дисковым шарам и блокирует реестр одмину.
Цитата:

Цитата SatHan
хочет чтоб я сам разобрал и посоветовал мне внимательно справку почитать. »

читай, да, чтение справки еще никого не убило :read:

SARATOVSKY 01-10-2012 02:18 1997484

И последний (я надеюсь) вопрос! У меня есть много файлов которые извлекаются в папку {tmp}, естественно они имеют размер и когда на странице выбора компонентов сняты все галочки с компонетов (устанавливать нечего), то ComponentsDiskSpaceLabel выдаёт размер временных файлов, так как мне обнулить это, когда невыбран ни один компонент?

Gnom_aka_Lexander 01-10-2012 08:20 1997538

SARATOVSKY, не распаковывать эти файлы из секции [Files]. Тоесть, убрать с этих файлов Destdir : {tmp};, оставив Flags : dontcopy; Это нормальное явление, даже зубры программирования допускают эту ошибку. Единственное - нужно не забыть распковать эти файлы в коде, с помощью ExtractTemporaryFile, перед использованием. И неплохо удалять их после использования самостоятельно, с помощью DeleteFile поштучно, либо с помощью DelTree(ExpandConstant('{tmp}', True, True, True); всю временную папку инсталятора целиком на выходе, поскольку я начал замечать за инсталлом на инно косяк с неудалением временной папки время от времени.

R.i.m.s.k.y. 01-10-2012 09:01 1997553

SARATOVSKY, Gnom_aka_Lexander,
Есть антибаг: к строчке с Check вычисление места не применяется
Код:

[Files]
Source: ..\SVP.Distr\ffdshow\; DestDir: {tmp}; Check: (True_function);

[CODE]
function True_function(): Boolean;
begin
Result := True;
end;


Gnom_aka_Lexander 01-10-2012 09:07 1997557

R.i.m.s.k.y., неправильное решение в данном случае. файлы которые нужны инсталлу - они нужны ему сразу. Destdir : {tmp}; - распаковывает их на этапе установки, однако, поскольку они уже распакованы, поскольку инсталл-то работает, ведь? то это действие уже в корне неверно, и писалось об этом неоднократно, и люди тупо продолжают совершать эту ошибку.

R.i.m.s.k.y. 01-10-2012 09:12 1997559

Gnom_aka_Lexander, Не понял последовательности твоих мыслей и в чем ошибка.
Речь шла о том чтобы место не подсчитывалось для определенного файла, если файл нужен раньше секции Files - тогда да флаг dontcopy + ExtractTemporaryFile.
И в CurStep=ssDone дежурный DelTree(ExpandConstant('{tmp}', True, True, True);

Gnom_aka_Lexander 01-10-2012 09:16 1997563

R.i.m.s.k.y., может, конечно, зря я включил свою телепатию, но почемуто кажется мне, что не зря. файлы, которые нужны ему в темпе - файлы оформления инсталла, просто исходя из предидущих вопросов заключаю (да-да, телепатия - не более, чем логика) и нужны они сразу, посему - никаких DestDir : {tmp};, строго flags : dontcopy плюс ExtractTemporaryFile.
P.S. и да, сочетание DestDir : {tmp}; flags : dontcopy я видел у людей очень авторитетных, из чего могу заключить, что это можно не считать постыдной ошибкой для новичка :teeth:
P.P.S.
Цитата:

Цитата R.i.m.s.k.y.
И в CurStep=ssDone дежурный DelTree(ExpandConstant('{tmp}', True, True, True); »

а что делать, если выход из инсталла был произведен до ssDone ? наверное нужно еще и в DeinitializeSetup добавить такую строчку?

SARATOVSKY 01-10-2012 11:34 1997635

Теперь всё, :) всем спасибо!

Johny777 02-10-2012 01:11 1998107

El Sanchez,
помню спрашивал как быстро определить размер папки (те для меня пример ...\Inno Setup 5\Scripts\Dobrov\DirSizeCal.iss работает слишком медленно)

нашёл пример использующий объект FileSystemObject http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
на форуме http://forum.vingrad.ru/forum/topic-84976/unread-1.html

результат - функция (здесь вывод в мегабайтах под мои нужды) : :)
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[  code]
function GetFolserSize(path:string):Integer;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetFolder(path).Size div (1024*1024);
end;

procedure InitializeWizard();
begin                   
  MsgBox(IntToStr(GetFolserSize('C:\Program Files (x86)')), mbInformation, MB_OK);
end;

в данном случае папку Program Files (x86) у меня (пока что размером почти 2 гига после переустановки винды) посчитала за секунду
более наглядный пример:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[  code]
function GetFolserSize(path:string):Extended;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetFolder(path).Size;
end;


function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;

procedure InitializeWizard();
begin                   
  MsgBox(BytesToSize(GetFolserSize('C:\Program Files (x86)')), mbInformation, MB_OK);
end;


но вот при попытке посчитать C:\Windows вылетает с ошибкой на Result := oFS.GetFolder(path).Size div (1024*1024);
читать дальше »

---------------------------
Runtime Error
---------------------------
Line 14:

Exception: : .
---------------------------
ОК
---------------------------

может папка слишком большого размера и он не может посчитать или я функцию криво записал
с другой стороны папку с видео размером больше 250 гигов посчитала корректно и тоже быстро
в общем хотелось бы узнать в чём причина ошибки ну и как следствие - улучшение/исправление

в качестве производных:
размер файла:
читать дальше »
Код:

function GetFileSize(FilePath:string):Extended;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetFile(FilePath).Size;
end;


function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;

procedure InitializeWizard();
begin                   
  MsgBox(BytesToSize(GetFileSize('C:\Windows\regedit.exe')), mbInformation, MB_OK);
end;



версия файла:
читать дальше »
Код:

function FileVersion(FilePath:string):string;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetFileVersion(FilePath);
end;


procedure InitializeWizard();
begin                   
  MsgBox((FileVersion('C:\Windows\regedit.exe')), mbInformation, MB_OK);
end;



получение буквы жёсткого диска на которм лежит файл:
читать дальше »
Код:

function GetFolserSize(FilePath:string):string;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetDriveName(FilePath);
end;


procedure InitializeWizard();
begin                   
  MsgBox((GetFolserSize('C:\Windows\regedit.exe')), mbInformation, MB_OK);
end;



генерирование уникального имени папки для использования её в %Temp%
читать дальше »
Код:

function CreateFolserUniqueName:string;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.GetTempName;
end;


procedure InitializeWizard();
begin
  MsgBox(CreateFolserUniqueName, mbInformation, MB_OK);
end;



альтернатива функции DirExists:
читать дальше »
Код:

function FolderExists(Folder:string):boolean;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.FolderExists(Folder);
end;


procedure InitializeWizard();
begin
  if FolderExists('C:\setup') then MsgBox('ok', mbInformation, MB_OK);
end;



проверка наличия жёсткого диска по букве:
читать дальше »
Код:

function DriveExists(Drive:string):boolean;
var
  oFS: Variant;
begin
  oFS := CreateOleObject('Scripting.FileSystemObject');
  Result := oFS.DriveExists(Drive);
end;


procedure InitializeWizard();
begin
  if DriveExists('C') then MsgBox('ok', mbInformation, MB_OK);
end;


SatHan 02-10-2012 10:28 1998241

привет. при установке извлекаются некоторые файлы. из них exe bmp итд. скажите. можно сделать чтоб они работали внутри инсталятора. или хотяб брались из файла x.tmp который извлекается в %temp% а не в чистом виде?

El Sanchez 02-10-2012 10:33 1998249

Цитата:

Цитата Johny777
но вот при попытке посчитать C:\Windows вылетает с ошибкой на Result := oFS.GetFolder(path).Size div (1024*1024); »

Johny777, вот же ж двоешник.
1. Проверяй в функции наличие папки. Исключение как раз из-за этого.
2. Размер Integer мал для "толстых" папок, нужно, например, Extended.
Код:

function GetFolserSize(path: String): Extended;
var
    oFS: Variant;
begin
    try
        if not DirExists(path) then Exit;
        oFS := CreateOleObject('Scripting.FileSystemObject');
        Result := oFS.GetFolder(path).Size/1024/1024;
    except
        Result := 0;
    end;
end;

//два знака после запятой
MsgBox(FormatFloat('#0.00', GetFolserSize('C:\Windows')), mbInformation, MB_OK);


Mailchik 02-10-2012 15:44 1998393

SatHan,
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
BitmapResource=Test:compiler:WizModernImage-IS.bmp

[Code]
procedure InitializeWizard;
 begin
  WizardForm.WizardBitmapImage.Bitmap.LoadFromResourceName(HInstance, '_IS_Test');
end;


El Sanchez 02-10-2012 16:34 1998411

Цитата:

Цитата Johny777
также вот процедура перемещения файлов
просьба проверить нигде ли я не накосячил: »

Johny777, первый параметр метода MoveFile может содержать групповые символы:
Код:

procedure MoveFiles(SourceFolder, Mask, DestFolder: String);
var
    oFS: Variant;
begin
    try
        if not DirExists(SourceFolder) or not DirExists(DestFolder) then Exit;
        oFS := CreateOleObject('Scripting.FileSystemObject');
        oFS.MoveFile(AddBackslash(RemoveBackslash(SourceFolder)) + Mask, DestFolder);
    except
        //ShowExceptionMessage;
    end;
end;


Raf-9600 04-10-2012 14:54 1999502

Ктонить может показать пример кода, который бы делал так чтобы при наведении курсора на определённый компонент, возникал Hint (при том для каждого компонента свой)?

Gnom_aka_Lexander 04-10-2012 20:05 1999679

Raf-9600, как-то так, только мне не очень нравится, как это работает, может старшие товарище подскажут, как сделать лучше.
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: std; Description: Стандартная; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: std\a; Description: Анси; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: std\u; Description: Юникод; Flags: exclusive disablenouninstallwarning; Types: custom compact full

Name: ext; Description: Китаяса; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext\a; Description: Анси; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext\u; Description: Юникод; Flags: exclusive disablenouninstallwarning; Types: custom compact full

[*code]
procedure HintStr(Sender: TObject; X: Integer; Y: Integer; Index: Integer; Area: TItemArea);
begin
  with WizardForm do
    with ComponentsList do
  case Index of
    0 : Hint := 'Стандартная';
    1 : Hint := 'Стандартная Анси';
    2 : Hint := 'Стандартная Юникод';
    3 : Hint := 'Китаяса';
    4 : Hint := 'Китаяса Анси';
    5 : Hint := 'Китаяса Юникод';
  else
    Hint := 'Наведите на компонент для отображения подсказки';
  end;
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    with ComponentsList do
    begin
      ShowHint := True;
      Hint := '';
      OnItemMouseMove := @HintStr;
    end;
  end;
end;

Скорей всего на стандартной версии не будет работать.

Raf-9600 05-10-2012 13:53 1999975

Цитата:

Цитата Gnom_aka_Lexander
как-то так, только мне не очень нравится, как это работает, может старшие товарище подскажут, как сделать лучше. »

После того как первая подсказка исчезает, больше ни одна не появляется :(

Shegorat 05-10-2012 14:33 1999998

Цитата:

Цитата Raf-9600
После того как первая подсказка исчезает, больше ни одна не появляется »

Как вариант можно сделать так
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: std; Description: Стандартная; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: std\a; Description: Анси; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: std\u; Description: Юникод; Flags: exclusive disablenouninstallwarning; Types: custom compact full

Name: ext; Description: Китаяса; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext\a; Description: Анси; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext\u; Description: Юникод; Flags: exclusive disablenouninstallwarning; Types: custom compact full

[code]
var
  LastIndex: Integer;
 
procedure HintStr(Sender: TObject; X: Integer; Y: Integer; Index: Integer; Area: TItemArea);
begin
  if Index<>LastIndex then begin
    LastIndex:= Index;
    WizardForm.ComponentsList.ShowHint:= False;
    WizardForm.ComponentsList.Hint:= '';
    Exit;
  end;
 
  with WizardForm.ComponentsList do
  case Index of
    0 : Hint := 'Стандартная';
    1 : Hint := 'Стандартная Анси';
    2 : Hint := 'Стандартная Юникод';
    3 : Hint := 'Китаяса';
    4 : Hint := 'Китаяса Анси';
    5 : Hint := 'Китаяса Юникод';
  else
    Hint := 'Наведите на компонент для отображения подсказки';
  end;
  WizardForm.ComponentsList.ShowHint:= True;
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    with ComponentsList do
    begin
      ShowHint := True;
      Hint := '';
      OnItemMouseMove := @HintStr;
    end;
  end;
end;


Raf-9600 05-10-2012 16:10 2000036

Цитата:

Цитата Shegorat
Как вариант можно сделать так »

Самое оно! Благодарю.
Я бы ещё хотел узнать, можно ли сделать так, чтобы текст определённого Hint'а менялся в зависимости от выбранных компонентов?
Т.е. чтобы допустим если выбран компонент "ext\u" то у "ext\a" подсказка менялась на другую?

Mailchik 05-10-2012 18:30 2000112

Raf-9600, тот же, от Шегората:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: std; Description: Стандартная; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: std\a; Description: Анси; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: std\u; Description: Юникод; Flags: exclusive disablenouninstallwarning; Types: custom compact full

Name: ext; Description: Китаяса; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext\a; Description: Анси; Flags: exclusive disablenouninstallwarning; Types: custom compact full
Name: ext\u; Description: Юникод; Flags: exclusive disablenouninstallwarning; Types: custom compact full

[code]
var
  LastIndex: Integer;

procedure HintStr(Sender: TObject; X: Integer; Y: Integer; Index: Integer; Area: TItemArea);
begin
  if Index<>LastIndex then begin
    LastIndex:= Index;
    WizardForm.ComponentsList.ShowHint:= False;
    WizardForm.ComponentsList.Hint:= '';
    Exit;
  end;

  with WizardForm.ComponentsList do
  case Index of
    0 : Hint := 'Стандартная';
    1 : Hint := 'Стандартная Анси';
    2 : Hint := 'Стандартная Юникод';
    3 : Hint := 'Китаяса';
    4 : begin
    if IsComponentSelected('ext\u') then  // то, что вам нужно.
      Hint := 'Китаяса Анси 2'
      else Hint := 'Китаяса Анси';
    end;

    5 : Hint := 'Китаяса Юникод';
  else
    Hint := 'Наведите на компонент для отображения подсказки';
  end;
  WizardForm.ComponentsList.ShowHint:= True;
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    with ComponentsList do
    begin
      ShowHint := True;
      Hint := '';
      OnItemMouseMove := @HintStr;
    end;
  end;
end;


SatHan 05-10-2012 21:07 2000199

привет.
Цитата:

Цитата Mailchik
тот же, от Шегората »

а можно сделать чтобы подсказка плавала за курсором мыши в области компонента а не стояла на одном месте?

Gnom_aka_Lexander 05-10-2012 21:26 2000214

SatHan, я тоже люблю поиздеваться.
Цитата:

Цитата SatHan
а можно сделать чтобы подсказка плавала за курсором мыши в области компонента а не стояла на одном месте? »

Можно

R.i.m.s.k.y. 05-10-2012 21:47 2000227

Можно ли как-то обойти окно выбора языка при старте установщика, задав "насильно" устанавливаемый язык?

Gnom_aka_Lexander 05-10-2012 21:50 2000229

R.i.m.s.k.y., только с опорой на язык системы, больше никак.
Код:

[Setup]
ShowLanguageDialog=no
LanguageDetectionMethod=locale


R.i.m.s.k.y. 05-10-2012 22:12 2000240

Имеется
Код:

[Setup]
ShowLanguageDialog=no
LanguageDetectionMethod=locale

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

Можно как-то "обощить" инсталлер на множество нерусских языков? если система русская - инсталлер выбирал русский язык (что собственно в секции Setup и указано), но если ОС любая кроме русской (китайская, корейская, бразильская etc) - то принудительно выбирался английский язык? естественно без окна выбора языка

Mailchik 05-10-2012 22:36 2000255

R.i.m.s.k.y., поставьте английский первым в списке, то есть:
Код:

[Setup]
AppName=Test
AppVerName=Test v1.1
DefaultDirName={pf}\Test
ShowLanguageDialog=no
LanguageDetectionMethod=locale

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


SatHan 05-10-2012 22:36 2000256

Цитата:

Цитата Gnom_aka_Lexander
Можно »

на ссылку чевото не переходит:(.

R.i.m.s.k.y. 05-10-2012 22:41 2000257

Цитата:

Цитата Mailchik
поставьте английский первым в списке »

что-то я сомневаюсь что такое сработает
Что будет если установщик запустят на бразильской или китайской системе?

Mailchik 05-10-2012 22:44 2000258

R.i.m.s.k.y., можете сами проверить. панель управления -- часы, язык и регион -- язык и региональные стандарты -- формат.
я думаю вы имеете в виду язык самой системы, но и в том случае должен сработать. инсталлятор, насколько я знаю, выбирает первый язык из списка [languages], если ShowLanguageDialog=no.
из справки:
Код:

3.Если ни один не найден, первый указанный язык в секции [Languages] принимается языком по умолчанию.

Respin 06-10-2012 08:03 2000325

Цитата:

Цитата R.i.m.s.k.y.
Можно ли как-то обойти окно выбора языка при старте установщика, задав "насильно" устанавливаемый язык? »

Цитата:

Цитата R.i.m.s.k.y.
Можно как-то "обощить" инсталлер на множество нерусских языков? если система русская - инсталлер выбирал русский язык (что собственно в секции Setup и указано), но если ОС любая кроме русской (китайская, корейская, бразильская etc) - то принудительно выбирался английский язык? естественно без окна выбора языка »

Вариант первый:
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[_Code]
type
LCID = LongInt;

function GetSystemDefaultLCID() : LCID; external 'GetSystemDefaultLCID@kernel32.dll stdcall';

procedure InitializeWizard();
begin
with WizardForm.WelcomeLabel1 do begin
if GetSystemDefaultLCID = 1049 then WizardForm.WelcomeLabel1.Caption:= 'По умолчанию' else WizardForm.WelcomeLabel1.Caption:= 'On Default';
end;
end;

Вариант второй:
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: "compiler:Languages\Russian.isl"; DestDir: {tmp}; Flags: dontcopy;
Source: "compiler:Languages\English.isl"; DestDir: {tmp}; Flags: dontcopy

[_Code]
type
LCID = LongInt;

var
LangFile: String;
 
function GetSystemDefaultLCID() : LCID; external 'GetSystemDefaultLCID@kernel32.dll stdcall';

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\Russian.isl')) then ExtractTemporaryFile('Russian.isl');
  if not FileExists(ExpandConstant('{tmp}\English.isl')) then ExtractTemporaryFile('English.isl');
  Result:=True;
end;

procedure InitializeWizard();
begin
with WizardForm.WelcomeLabel1 do begin
if GetSystemDefaultLCID = 1049 then begin
LangFile:= ExpandConstant('{tmp}\Russian.isl');
WizardForm.WelcomeLabel1.Caption:= GetIniString('Messages', 'WelcomeLabel1', '', LangFile)
end else begin
LangFile:= ExpandConstant('{tmp}\English.isl');
WizardForm.WelcomeLabel1.Caption:= GetIniString('Messages', 'WelcomeLabel1', '', LangFile);
end;
end;
end;

P.S. Во втором варианте нужно создать INI-Файл, так как лейблы с ISL-Файла отображаются коряво (это так, для примера).

Gnom_aka_Lexander 06-10-2012 09:26 2000340

Respin, так веселее, я думаю - зачем лишний раз обращаться к одному и томуже. если все надписи делать таким образом, то придется кучу времени потратить на оптимизацию, поэтому начинать нужно сразу.
читать дальше »
Код:

var
LangFile: String;
 
function GetSystemDefaultLCID() : LCID; external 'GetSystemDefaultLCID@kernel32.dll stdcall';
function InitializeSetup:boolean;
var
  lngF : String;
begin
  if GetSystemDefaultLCID = 1049 then
    lngF := 'Russian.isl';
  else
    lngF := 'English.isl';

  LangFile:= ExpandConstant('{tmp}\'+lngF);
  if not FileExists(LangFile) then ExtractTemporaryFile(lngF);
  Result:=True;
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    WelcomeLabel1.Caption:= GetIniString('Messages', 'WelcomeLabel1', '', LangFile); // и так для каждого статика и лейбела инсталла
    WelcomeLabel2.Caption:= GetIniString('Messages', 'WelcomeLabel2', '', LangFile); // и так для каждого статика и лейбела инсталла
  end;
end;


Respin 06-10-2012 10:00 2000346

Цитата:

Цитата Gnom_aka_Lexander
зачем лишний раз обращаться к одному и томуже. если все надписи делать таким образом, то придется кучу времени потратить на оптимизацию, поэтому начинать нужно сразу. »

Там уже у кого на сколько фантазии хватит. Вот только он будет читать c ISL-Файла: "Вас приветствует Мастер установки [name]"
"Программа установит [name/ver] на Ваш компьютер"...

Вообщем кто как хочет, пусть так и делает. Главное суть вопроса.

Gnom_aka_Lexander 06-10-2012 10:11 2000348

Respin, да при чем тут фантазия? Запусти свой вариант с прописью для каждой надписи и просмотри на скорость его выполнения. в любом случае, единственный правильный вариант - тут. Любой другой способ ведет к потерям производительности и к совершенно ненужным телодвижениям - зачем писать километр кода, который будет отнимать процессорное время для того, что и так делается самим инсталлом, при указании ему пары параметров?

SatHan 06-10-2012 17:15 2000470

SoftLine, не работает. что мне с этим делать?
подскажите что можно сделать чтобы подсказка плавала за курсором мыши в области компонента?

insombia 06-10-2012 18:22 2000502

del

Raf-9600 06-10-2012 20:39 2000557

Цитата:

Цитата R.i.m.s.k.y.
Можно как-то "обощить" инсталлер на множество нерусских языков? если система русская - инсталлер выбирал русский язык (что собственно в секции Setup и указано), но если ОС любая кроме русской (китайская, корейская, бразильская etc) - то принудительно выбирался английский язык? естественно без окна выбора языка »

Если можно, я покритикую такой подход.
Есть множество украинцев устанавливающих украиноязычную винду, и я уверен, что подавляющее большинство из них русский понимают гораздо лучше, чем английский.

R.i.m.s.k.y. 06-10-2012 21:41 2000594

Raf-9600, здровую критику воспринимаю здраво. Так бы я и рассудил и оставил выбор языка руками.
Но пришлось делать одном скрипте два инсталлера (разный набор компонентов): один рус/англ с выбором, и один рус/англ-автомат без выбора языка.
"Автомат"предназначался для non-exUUSR и вообще отправился в Южную Омеригу на бета-тест :)
Релизов это не касается

insombia 07-10-2012 10:52 2000782

как сделать чтобы при выборе русского языка в реестр вписывался русский язык,а при английском английский?

R.i.m.s.k.y. 07-10-2012 10:59 2000784

insombia,
Код:

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

[Registry]
Languages: russian; Root: HKCU; SubKey: твой ключ реестра для русского
Languages: english; Root: HKCU; SubKey: твой ключ реестра для собачьего


Dark_Delphin 07-10-2012 21:38 2001085

Всем привет.

Дайте пожалуйста пример Сплэш картинки png для скрипта.

Заранее благодарен.

SoulSide 08-10-2012 00:40 2001142

Цитата:

Цитата Dark_Delphin
Дайте пожалуйста пример Сплэш картинки png для скрипта. »

читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program

[Files]
Source: isgsg.dll; DestDir: {tmp}; Flags: dontcopy nocompression
Source: splash.png; DestDir: {tmp}; Flags: dontcopy nocompression

[*Code]
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload';

procedure Splash();
begin
ExtractTemporaryFile('Splash.png');
ShowSplashScreen(WizardForm.Handle,ExpandConstant('{tmp}')+'\Splash.png',1000,3000,1000,0,255,False,$FFFFFF,10);
end;

procedure InitializeWizard();
begin
Splash();
end;


insombia 08-10-2012 16:49 2001459

как называется флаг для компонентов что его можно снять и поставить(галочка)

R.i.m.s.k.y. 08-10-2012 16:55 2001465

insombia,
WizardForm.ComponentsList.Checked[N] := True - выбрать компонент номер N
WizardForm.ComponentsList.ItemEnabled[N] := False - сделатьк компонент номер N неактивным (будет засвечен и недоступен для выбора)

insombia 08-10-2012 19:03 2001541

R.i.m.s.k.y. а по проще можно?типа как Flags: Exclusive

R.i.m.s.k.y. 08-10-2012 19:16 2001554

insombia,

Цитата:

Flags
This parameter is a set of extra options. Multiple options may be used by separating them by spaces. The following options are supported:

checkablealone
Specifies that the component can be checked when none of its children are. By default, if no Components parameter directly references the component, unchecking all of the component's children will cause the component to become unchecked.

dontinheritcheck
Specifies that the component should not automatically become checked when its parent is checked. Has no effect on top-level components, and cannot be combined with the exclusive flag.

exclusive
Instructs Setup that this component is mutually exclusive with sibling components that also have the exclusive flag.

fixed
Instructs Setup that this component can not be manually selected or unselected by the end user during installation.

restart
Instructs Setup to ask the user to restart the system if this component is installed, regardless of whether this is necessary (for example because of [Files] section entries with the restartreplace flag). Like AlwaysRestart but per component.

disablenouninstallwarning
Instructs Setup not to warn the user that this component will not be uninstalled after he/she deselected this component when it's already installed on his/her machine.
Depending on the complexity of your components, you can try to use the [InstallDelete] section and this flag to automatically 'uninstall' deselected components.

insombia 08-10-2012 19:16 2001555

нашел disablenouninstallwarning называется

R.i.m.s.k.y. 08-10-2012 19:19 2001559

Цитата:

Цитата insombia
как называется флаг для компонентов что его можно снять и поставить(галочка) »

Цитата:

Цитата insombia
нашел disablenouninstallwarning называется »


insombia 08-10-2012 20:04 2001577

ой checkablealone,перепутал

Johny777 09-10-2012 19:36 2002236

Gnom_aka_Lexander, El Sanchez, ваши выкатывающиеся панели очень классные, но есть один недостаток - после завершения таймера не выгружается оперативка
те после каждого выката прибавляется по 4кб при закате по 4 = 8кб на один закат/выкат


поэтому я прикинул создать похожий код без использования таймеров (на основе циклов с задержкой)
но проблема с закатом во время выката и наоборот
вот ранняя версия (пока что ещё примитивная)

читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[  Code]
var
  SettingPanel  : TPanel;
  Flag          : boolean;
  Stop: boolean;
 

function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';

procedure Delay(dwMilliseconds: Longint);
var
  iStart, iStop: DWORD;
begin
  iStart := GetTickCount;
  repeat
    iStop := GetTickCount;
    Application.ProcessMessages;
  until (iStop - iStart) >= DWORD(dwMilliseconds);
end;

procedure Roll(Ctrl:TControl);
begin
  if Ctrl.Top < 0 then
  begin
    repeat
      Ctrl.Top := Ctrl.Top + ScaleY(1);
      Delay(1);
      if Stop then
      begin
        Stop := False;

        Break;
        Exit;
      end;
    until Ctrl.Top = 0;
    Exit;
  end;
 
  if Ctrl.Top > -Ctrl.Height then
  begin
    repeat
      Ctrl.Top := Ctrl.Top - ScaleY(1);
      Delay(0);
      if Stop then
      begin
        Stop := False;

        Break;
        Exit;
      end;
    until Ctrl.Top = -Ctrl.Height;
    Exit;
  end;
end;

procedure HideShow(Sender: TObject);
begin
  Roll(SettingPanel);
end;



procedure InitializeWizard();
 begin
  Flag:= False;
  Stop := False;

  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  with TButton.Create(WizardForm) do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;



просьба:
кто-нибудь помогите пожалуйста исправить глючность прерывания движения

Gnom_aka_Lexander 09-10-2012 19:45 2002245

Johny777, можно проще - не останавливать, а убивать таймер, тогда и не будет утечки памяти. а то получается на каждом выкате - закате создается новый таймер, отсюда и утечка.

Johny777 09-10-2012 19:57 2002257

Gnom_aka_Lexander,
он и убивается
твой код:
читать дальше »
Код:

var
  SettingPanel  : TPanel;
  Flag          : boolean;
  Timer          : LongWord;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer1;
begin
  if SettingPanel.Top < 0 then SettingPanel.Top := SettingPanel.Top + ScaleY(3);
  if SettingPanel.Top = 0 then KillTimer(WizardForm.Handle, Timer);
end;

procedure Timer2;
begin
  if SettingPanel.Top > -315 then SettingPanel.Top := SettingPanel.Top - ScaleY(3);
  if SettingPanel.Top = -315 then KillTimer(WizardForm.Handle, Timer);
end;


procedure HideShow(Sender: TObject);
begin
  KillTimer(WizardForm.Handle, Timer);
  case Flag of
  True :
    begin
      Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('Timer2'));
      TButton(Sender).Caption:='Show';
    end;
  False :
    begin
      Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('Timer1'));
      TButton(Sender).Caption:='Hide';
    end;
  end;
  Flag:= not Flag;
end;


procedure InitializeWizard();
 begin
  Flag:= False;

  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  with TButton.Create(WizardForm) do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;



El Sanchez
читать дальше »
Код:

var
    SettingPanel: TPanel;
    hBtn: TButton;
    //iStartTime: Integer; //debug
    iTimer, iRollInfo: Integer;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
//function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall'; //debug


procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
var
    iLen, iStep: Integer;
begin
    iLen := iRollInfo and $FFFF;
    iStep := (iRollInfo and $FF0000) shr $10;
    case iRollInfo shr $18 of
        $0: begin
                if SettingPanel.Left >= -iStep then
                begin
                    KillTimer(0, iTimer);
                    hBtn.Enabled := True;
                end;
                SettingPanel.Left := SettingPanel.Left + iStep;
                //WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Left); //debug
            end;
        $1: begin
                if SettingPanel.Left <= -iLen + iStep then
                begin
                    KillTimer(0, iTimer);
                    hBtn.Enabled := True;
                end;
                SettingPanel.Left := SettingPanel.Left - iStep;
                //WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Left); //debug
            end;
        $2: begin
                if SettingPanel.Top >= -iStep then
                begin
                    KillTimer(0, iTimer);
                    hBtn.Enabled := True;
                end;
                SettingPanel.Top := SettingPanel.Top + iStep;
                //WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Top); //debug
            end;
        $3: begin
                if SettingPanel.Top <= -iLen + iStep then
                begin
                    KillTimer(0, iTimer);
                    hBtn.Enabled := True;
                end;
                SettingPanel.Top := SettingPanel.Top - iStep;
                //WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Top); //debug
            end;
    end;
end;

procedure RollControl(Ctrl: TControl; dwTime, dwFlag: DWORD);
//  Ctrl    :  control
//  dwTime  :  rolling time, ms
//  dwFlag  :  roll type ($0 - left to right, $1 - right to left, $2 - top to bottom, $3 - bottom to top)
var
    iLen, iStep: Integer;
    iKoeff: Extended;
begin
    iLen := (dwFlag shr $1 xor $1)*Ctrl.Width + (dwFlag shr $1)*Ctrl.Height;
    repeat
        iStep := iStep + 1;
        iKoeff := (iStep * dwTime)/(iLen * 1000/64);
    until iKoeff >= 1;
    //
    if iRollInfo = 0 then iRollInfo := (dwFlag shl $18) or (iStep shl $10) or iLen else iRollInfo := iRollInfo xor $1000000;
    iTimer := SetTimer(0, 0, Trunc(iKoeff)*1000/64, CallbackAddr('TimerProc'));
end;

procedure HideShow(Sender: TObject);
begin
    //iStartTime := GetTickCount; //debug
    RollControl(SettingPanel, 1000, $2);
    TButton(Sender).Enabled := False;
end;

procedure InitializeWizard();
begin
    SettingPanel := TPanel.Create(WizardForm);
    with SettingPanel do
    begin
        Parent := WizardForm;
        SetBounds(ScaleX(0), ScaleY(-315), ScaleX(497), ScaleY(315));
        ParentBackground := False;
    end;

    hBtn := TButton.Create(WizardForm);
    with hBtn do
    begin
        OnClick := @HideShow;
        SetBounds(ScaleX(40), ScaleY(327), ScaleX(75), ScaleY(25));
        Caption := 'Show';
        Parent := WizardForm;
    end;
end;



утечка тем не менее имеет место :(
к тому же в коде который пилю можно двигать по 1-му пикселю c большой скоростью - явный плюс!

JHeavy 09-10-2012 20:53 2002299

Приветствую, этот вопрос вероятно обсуждался не один раз, но найти мне ответа не удалось... наверное.
Имеются компоненты:
a Flags: fixed
a\b
a\c

Как сделать так чтобы если не выбрать a\b то a\c становится недоступен
a\c при выборе a\b можно снять или отметить

Mailchik 09-10-2012 21:27 2002319

JHeavy,
читать дальше »
Код:

[Setup]
AppName=Test
AppVerName=Test
DefaultDirname={pf}\Test

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: a; Description: a; Types: full; Flags: fixed checkablealone
Name: a\b; Description: a\b;
Name: a\c; Description: a\c;

[Code]
procedure TestClick(Sender: TObject);
 begin
  with WizardForm.ComponentsList do begin
  if Checked[1] then begin
    ItemEnabled[2]:= True;
    end else begin
    ItemEnabled[2]:= False;
    Checked[2]:= False;
  end;
  end;
end;

procedure InitializeWizard();
 begin
  with WizardForm.ComponentsList do begin
  OnClickCheck := @TestClick;
  TestClick(nil);
  end;
end;


JHeavy 09-10-2012 23:10 2002379

Mailchik, спасибо, то что нужно, только скажите как в этом примере сделать чтобы компонент a был всегда отмечен, и как добавлять компоненты (что куда дописывать если их много будет) т.е. если не трудно добавьте комментарии для "усвоения материала"

Просто хочу понять как это работает если будет разное количество компонентов

Mailchik 09-10-2012 23:33 2002394

Цитата:

Цитата JHeavy
Ну отметить a "навсегда" значит не получится, просто - a программа, a\b и a\c - желаемые дополнения, без которых программа также ставится, решения нет?

читать дальше »
Код:

[Setup]
AppName=Test
AppVerName=Test
DefaultDirname={pf}\Test

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: a; Description: a; Types: full; Flags: fixed checkablealone
Name: a\b; Description: a\b;
Name: a\c; Description: a\c;

[Code]
procedure TestClick(Sender: TObject);
 begin
  with WizardForm.ComponentsList do begin
  if Checked[1] then begin  //если выбран 2-й компонент (отсчет начинается с 0)
    ItemEnabled[2]:= True;    //то 3-й компонент активен
    end else begin            //если нет
    ItemEnabled[2]:= False;  //то не активен 3-й компонент
    Checked[2]:= False;      //и убираем "отмеченность" 3-го компонента
  end;
  end;
end;

procedure InitializeWizard();
 begin
  with WizardForm.ComponentsList do begin
  OnClickCheck := @TestClick;
  TestClick(nil);
  end;
end;


Цитата:

Цитата JHeavy
добавьте комментарии для "усвоения материала"

читать дальше »
Код:

[Setup]
AppName=Test
AppVerName=Test
DefaultDirname={pf}\Test

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: a; Description: a; Types: full; Flags: fixed checkablealone
Name: a\b; Description: a\b;
Name: a\c; Description: a\c;

[Code]
procedure TestClick(Sender: TObject);
 begin
  with WizardForm.ComponentsList do begin
  if Checked[1] then begin  //если выбран 2-й компонент (отсчет начинается с 0)
    ItemEnabled[2]:= True;    //то 3-й компонент активен
    end else begin            //если нет
    ItemEnabled[2]:= False;  //то не активен 3-й компонент
    Checked[2]:= False;      //и убираем "отмеченность" 3-го компонента
  end;
  end;
end;

procedure InitializeWizard();
 begin
  with WizardForm.ComponentsList do begin
  OnClickCheck := @TestClick;
  TestClick(nil);
  end;
end;


Цитата:

Цитата JHeavy
как добавлять компоненты (что куда дописывать если их много будет)

читать дальше »
Код:

[Setup]
AppName=Test
AppVerName=Test
DefaultDirname={pf}\Test

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
//a первый по списку, но имеет значение 0 в компонент листе и остальные компоненты по порядку
Name: a; Description: a; Types: full; Flags: fixed checkablealone
Name: a\b; Description: a\b;
Name: a\c; Description: a\c;
Name: a\d; Description: a\d;
Name: a\e; Description: a\e;
Name: b; Description: b; Types: full; Flags: fixed
Name: b\b; Description: b\b;
Name: b\c; Description: b\c;

[Code]
procedure TestClick(Sender: TObject);
 begin
  with WizardForm.ComponentsList do begin
  if Checked[1] then begin  //если выбран 2-й компонент (a\b) (отсчет начинается с 0)
    ItemEnabled[2]:= True;    //то 3-й компонент (a\c) активен
    ItemEnabled[6]:= True;    //7-й компонент (b\b) активен
    end else begin            //если нет
    ItemEnabled[2]:= False;  //то не активен 3-й компонент (a\c)
    Checked[2]:= False;      //и убираем "отмеченность" 3-го компонента (a\c)
    ItemEnabled[6]:= False;  //не активен 7-й компонент (b\b)
  end;
  end;
end;

procedure InitializeWizard();
 begin
  with WizardForm.ComponentsList do begin
  OnClickCheck := @TestClick;
  TestClick(nil);
  end;
end;


JHeavy 09-10-2012 23:53 2002405

Ну отметить a "навсегда" значит не получится, просто - a программа, a\b и a\c - желаемые дополнения, без которых программа также ставится, решения нет?

Да и скажите будет ли работать пример в сворачивающихся списках компонентов (который расширенной версией делается), вроде проверил - никак
Вернее работает, но пропадают подсказки компонентов
Спасибо... Оказывается все работает... если правильно написать

SatHan 10-10-2012 12:38 2002644

привет.
как применить тему в Se7en?

Gnom_aka_Lexander 10-10-2012 21:58 2003014

Johny777, вот так они в дельфе.
Код:

QS_KEY                  = $0001;
QS_MOUSEMOVE            = $0002;
QS_MOUSEBUTTON          = $0004;
QS_POSTMESSAGE          = $0008;
QS_TIMER                = $0010;
QS_PAINT                = $0020;
QS_SENDMESSAGE          = $0040;
QS_HOTKEY              = $0080;

QS_MOUSE = (QS_MOUSEMOVE or QS_MOUSEBUTTON);

QS_INPUT = (QS_MOUSE or QS_KEY);

QS_ALLEVENTS = (QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or QS_HOTKEY);

WAIT_TIMEOUT = $00000102;


Johny777 11-10-2012 00:02 2003082

Gnom_aka_Lexander, El Sanchez, поздравьте меня! :) Тк сделал свой вариант "выкатов и закатов". 2 дня убил на код: (зато никаких таймеров)
подробнее в коде:
читать дальше »
Код:

[Setup]
AppName=The_Best_RollDemo_Ever
AppVerName=The_Best_RollDemo_Ever v 777
DefaultDirName={pf}\The_Best_RollDemo_Ever
DefaultGroupName=The_Best_RollDemo_Ever
OutputDir=.
Uninstallable=no

[code]
var
  PanelUp, PanelDown, PanelLeft, PanelRight: TPanel;
  RollInfo: DWORD;

function SleepEx(dwMilliseconds: DWORD; bAlertable: BOOL): DWORD; external 'SleepEx@Kernel32.dll stdcall';

//  сдвиг статичный в один пиксель (не менять)
//  плюсы такого сдвига:
//  1. плавность
//  2. точность выполнения (что будет если панель высотой 70 двигать по 3 пикселя до -70)
//  3. настройка скорости задержкой (диапазон от 0 до 100 = 101 скоростей)

///////// Roll(переменная_контрола(например панель или скроллбокс или мемо), задержка(максимум 100 т.к. дальше будет некрасиво))
procedure Roll(Ctrl:TControl; RollDelay: Integer);
begin
  case RollInfo of
    $1: repeat
          if SleepEx(RollDelay,True) = 0 then Ctrl.Top := Ctrl.Top + ScaleY(1);      /// сверху вниз и назад
          Application.ProcessMessages;
        until (RollInfo = $0) or (Ctrl.Top = 0)
    $0: repeat  /// снизу вверх
          if SleepEx(RollDelay,True) = 0 then Ctrl.Top := Ctrl.Top - ScaleY(1);
          Application.ProcessMessages;
        until (RollInfo = $1) or (Ctrl.Top = - Ctrl.Height)
        //////////////////////////////////////////////////////////////////
    $4: repeat
          if SleepEx(RollDelay,True) = 0 then Ctrl.Left := Ctrl.Left + ScaleX(1);    /// слева направо и назад
          Application.ProcessMessages;
        until (RollInfo = $3) or (Ctrl.Left = 0)
    $3: repeat
          if SleepEx(RollDelay,True) = 0 then Ctrl.Left := Ctrl.Left - ScaleX(1);
          Application.ProcessMessages;
        until (RollInfo = $4) or (Ctrl.Left = - Ctrl.Width);
        ///////////////////////////////////////////////////////////////////
    $6: repeat
          if SleepEx(RollDelay,True) = 0 then Ctrl.Left := Ctrl.Left - ScaleX(1);  /// справа налево  и назад
          Application.ProcessMessages;
        until (RollInfo = $5) or (Ctrl.Left = Ctrl.Parent.Width-Ctrl.Width)
    $5: repeat
          if SleepEx(RollDelay,True) = 0 then Ctrl.Left := Ctrl.Left + ScaleX(1);
          Application.ProcessMessages;
        until (RollInfo = $6) or (Ctrl.Left = Ctrl.Parent.Width);
        ////////////////////////////////////////////////////////////////////
    $8: repeat
          if SleepEx(RollDelay,True) = 0 then Ctrl.Top := Ctrl.Top - ScaleY(1);    /// снизу вверх и назад
          Application.ProcessMessages;
        until (RollInfo = $7) or (Ctrl.Top = Ctrl.Parent.Height-Ctrl.Height)
    $7: repeat
          if SleepEx(RollDelay,True) = 0 then Ctrl.Top := Ctrl.Top + ScaleY(1);
          Application.ProcessMessages;
        until (RollInfo = $8) or (Ctrl.Top = Ctrl.Parent.Top + Ctrl.Height);
  end;
end;




procedure UpDown(Sender: TObject);
begin
  case TButton(Sender).Caption of
  'Roll1':
    begin
      TButton(Sender).Caption:='Roll0';

      RollInfo := $1;
      Roll(PanelDown,0);  ////  A

//      RollInfo := $4;  //////// B
//      Roll(PanelLeft,0);

//      RollInfo := $6;
//      Roll(PanelRight,2); ///////// C

//      RollInfo := $8;
//      Roll(PanelUp,0);  //////////// d

    end;
    'Roll0':
    begin
      TButton(Sender).Caption:='Roll1';

      RollInfo := $0;
      Roll(PanelDown,10);  ////// A

//      RollInfo := $3;
//      Roll(PanelLeft,0);  ///////// B

//      RollInfo := $5;
//      Roll(PanelRight,0);  //////////// C

//      RollInfo := $7;
//      Roll(PanelUp,0);  //////////// d
    end;
  end;
end;





procedure InitializeWizard();
begin
  PanelUp := TPanel.Create(WizardForm);
  with PanelUp do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),Parent.Top + Parent.Height,ScaleX(497),ScaleY(200));
    ParentBackground := False;
    Color := clBlue;
  end;

  PanelDown := TPanel.Create(WizardForm);
  with PanelDown do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-200),ScaleX(497),ScaleY(200));
    ParentBackground := False;
    Color := clYellow;
  end;

  PanelLeft := TPanel.Create(WizardForm);
  with PanelLeft do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(-200),ScaleY(0),ScaleX(200),ScaleY(314));
    ParentBackground := False;
    Color := clGreen;
  end;

  PanelRight := TPanel.Create(WizardForm);
  with PanelRight do
  begin
    Parent := WizardForm;
    SetBounds(Parent.Width + ScaleX(200),ScaleY(0),ScaleX(200),ScaleY(314));
    ParentBackground := False;
    Color := clRed;
  end;

  with TButton.Create(WizardForm) do
  begin
    OnClick:= @UpDown;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Roll1';
    Parent:= WizardForm;
  end;
end;



просьба оценить работу! (отписаться о впечатлениях)

nik1967 11-10-2012 00:35 2003107

Johny777, вниз падает (по другому х.з. как сказать) а вверх плавно поднимается. И да, компилишь на Ansi? На Unicode ругнулось несколько раз - точку с запятой забыл поставить в нескольких местах.

El Sanchez 11-10-2012 10:49 2003271

Цитата:

Цитата Johny777
поздравьте меня! Тк сделал свой вариант "выкатов и закатов" »

Johny777, респект, только SleepEx не по назначению используешь, достаточно простого Sleep.
Цитата:

Цитата Johny777
и где мне на будущее смотреть эти значения »

Johny777, в MSDN нередко при описании какой-либо функции указывают значения используемых констант. Если нет, то в гугел я даю запрос типа const QS_KEY =, первые же результаты дают искомое, даже не нужно по ссылкам переходить.
Цитата:

Цитата Johny777
но есть один недостаток - после завершения таймера не выгружается оперативка
те после каждого выката прибавляется по 4кб при закате по 4 = 8кб на один закат/выкат »

Это не утечка, борландовский менеджер памяти для своих нужд выделяет квант памяти, равный размеру страницы памяти.

Gnom_aka_Lexander 11-10-2012 10:55 2003274

Цитата:

Цитата El Sanchez
в MSDN нередко при описании какой-либо функции »

Цитата:

Цитата El Sanchez
в гугел я даю запрос типа const QS_KEY »

самый быстрый вариант - в модулях дельфи - я просто ввожу константу и потом на ней правой кнопкой - "Find declaration". все что потом нужно - собрать остальные значения, если она составная.

JHeavy 11-10-2012 17:11 2003537

Приветствую, подскажите пожалуйста, существует ли возможность запуска программы из папки {app} (программы которая туда уже распаковалась), а после её завершения продолжалась распаковка других файлов в эту папку.

Serega 11-10-2012 17:42 2003567

Цитата:

Цитата El Sanchez
Это не утечка, борландовский менеджер памяти для своих нужд выделяет квант памяти, равный размеру страницы памяти. »

Это именно утечка, вот только не понятно почему...
Попробуйте написать используя TTimer, такого не будет, хотя при вызове TTimer.Enabled := True, происходит вызов функции SetTimer, а при TTimer.Enabled := False, происходит вызов функции KillTimer и при этом такой утечки не происходит.

Цитата:

Цитата Gnom_aka_Lexander
и потом на ней правой кнопкой - "Find declaration" »

Так же можно нажать Ctrl+клик мышкой

Gnom_aka_Lexander 11-10-2012 18:05 2003586

JHeavy, посмотри в справке BeforeInstall и AflerInstall, с их помощью можно до или после распаковки нужного файла вызвать встроенную функцию Exec, и поскольку она подвешивает инсталл, то при использвоании флага ewNoWait есть большие шансы, что распаковка продолжится только после отработки Exec.

LinkOFF 11-10-2012 21:36 2003733

Добрый вечер всем. А не подскажите как убрать кнопку "О программе" и иконку в левом верхнем углу? Заранее благодарен.

Johny777 11-10-2012 22:14 2003766

Цитата:

Цитата El Sanchez
SleepEx не по назначению используешь, достаточно простого Sleep. »

уже поправил.
Теперь это функция: function Roll(Ctrl: TControl; RollDelay: Byte; InputRollInfo: DWORD): DWORD;
упростил вызов
в выкатах справа и снизу иногда нужно учитывать ширину границы формы
например $6: ... until (RollInfo <> $6) or (Ctrl.Top = Ctrl.Parent.Height-Ctrl.Height-ScaleY(28));
читать дальше »
Код:

[Setup]
AppName=The_Best_RollDemo_Ever
AppVerName=The_Best_RollDemo_Ever v 777
DefaultDirName={pf}\The_Best_RollDemo_Ever
DefaultGroupName=The_Best_RollDemo_Ever
OutputDir=.
Uninstallable=no

[code]
var
  PanelUp, PanelDown, PanelLeft, PanelRight: TPanel;
  RollInfo: DWORD;

// function SleepEx(dwMilliseconds: DWORD; bAlertable: BOOL): DWORD; external 'SleepEx@Kernel32.dll stdcall';

//  сдвиг статичный в один пиксель (не менять)
//  плюсы такого сдвига:
//  1. плавность
//  2. точность выполнения (что будет если панель высотой 70 двигать по 3 пикселя до -70)
//  3. настройка скорости задержкой (диапазон от 0 до 100 = 101 скоростей)

///////// Roll(переменная_контрола(например панель или скроллбокс или мемо), задержка(максимум 100 т.к. дальше будет некрасиво), индикатор выката)
function Roll(Ctrl: TControl; RollDelay: Byte; InputRollInfo: DWORD): DWORD;
begin
  Result := InputRollInfo;
  case Result of
    $0: repeat
          Ctrl.Top := Ctrl.Top + ScaleY(1);      /// сверху вниз и назад
          Sleep(RollDelay);
          Application.ProcessMessages;
        until (RollInfo <> $0) or (Ctrl.Top = 0);
    $1: repeat  /// снизу вверх
          Ctrl.Top := Ctrl.Top - ScaleY(1);
          Sleep(RollDelay);
          Application.ProcessMessages;
        until (RollInfo <> $1) or (Ctrl.Top = - Ctrl.Height);
        //////////////////////////////////////////////////////////////////
    $2: repeat
          Ctrl.Left := Ctrl.Left + ScaleX(1);    /// слева направо и назад
          Sleep(RollDelay);
          Application.ProcessMessages;
        until (RollInfo <> $2) or (Ctrl.Left = 0);
    $3: repeat
          Ctrl.Left := Ctrl.Left - ScaleX(1);
          Sleep(RollDelay);
          Application.ProcessMessages;
        until (RollInfo <> $3) or (Ctrl.Left = - Ctrl.Width);
        ///////////////////////////////////////////////////////////////////
    $4: repeat
          Ctrl.Left := Ctrl.Left - ScaleX(1);  /// справа налево  и назад
          Sleep(RollDelay);
          Application.ProcessMessages;
        until (RollInfo <> $4) or (Ctrl.Left = Ctrl.Parent.Width-Ctrl.Width);
    $5: repeat
          Ctrl.Left := Ctrl.Left + ScaleX(1);
          Sleep(RollDelay);
          Application.ProcessMessages;
        until (RollInfo <> $5) or (Ctrl.Left = Ctrl.Parent.Width);
        ////////////////////////////////////////////////////////////////////
    $6: repeat
          Ctrl.Top := Ctrl.Top - ScaleY(1);    /// снизу вверх и назад
          Sleep(RollDelay);
          Application.ProcessMessages;
        until (RollInfo <> $6) or (Ctrl.Top = Ctrl.Parent.Height-Ctrl.Height);
    $7: repeat
          Ctrl.Top := Ctrl.Top + ScaleY(1);
          Sleep(RollDelay);
          Application.ProcessMessages;
        until (RollInfo <> $7) or (Ctrl.Top = Ctrl.Parent.Top + Ctrl.Height);
    end;
end;




procedure UpDown(Sender: TObject);
begin
  case TButton(Sender).Caption of
  'Roll1':
    begin
      TButton(Sender).Caption:='Roll0';

//      RollInfo := Roll(PanelDown, 2, $0); // A

      RollInfo := Roll(PanelLeft, 0, $2); // B

//      RollInfo := Roll(PanelRight, 0, $4); // C

//      RollInfo := Roll(PanelUp, 0, $6);  // D

    end;
    'Roll0':
    begin
      TButton(Sender).Caption:='Roll1';

//      RollInfo := Roll(PanelDown, 2, $1); // A

      RollInfo := Roll(PanelLeft, 0, $3);  // B

//      RollInfo := Roll(PanelRight, 0, $5); // C

//      RollInfo := Roll(PanelUp, 0, $7);
        //////////// d
    end;
  end;
end;





procedure InitializeWizard();
begin
  PanelUp := TPanel.Create(WizardForm);
  with PanelUp do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),Parent.Top + Parent.Height,ScaleX(497),ScaleY(200));
    ParentBackground := False;
    Color := clBlue;
  end;

  PanelDown := TPanel.Create(WizardForm);
  with PanelDown do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-200),ScaleX(497),ScaleY(200));
    ParentBackground := False;
    Color := clYellow;
  end;

  PanelLeft := TPanel.Create(WizardForm);
  with PanelLeft do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(-390),ScaleY(0),ScaleX(390),ScaleY(314));
    ParentBackground := False;
    Color := clGreen;
  end;

  PanelRight := TPanel.Create(WizardForm);
  with PanelRight do
  begin
    Parent := WizardForm;
    SetBounds(Parent.Width + ScaleX(200),ScaleY(0),ScaleX(200),ScaleY(314));
    ParentBackground := False;
    Color := clRed;
  end;

  with TButton.Create(WizardForm) do
  begin
    OnClick:= @UpDown;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Roll1';
    Parent:= WizardForm;
  end;
end;



Цитата:

Цитата LinkOFF
как убрать ... иконку в левом верхнем углу? »

кто-то уже спрашивал. Смотрел на форумах. это жуткий геморрой. как вариант используй скин и иконку однотонную по цвету скина
это не обязательно иконка экзешника инсталла
http://forum.ru-board.com/topic.cgi?...07&limit=1&m=1

Mailchik 11-10-2012 22:26 2003774

Цитата:

Цитата LinkOFF
как убрать кнопку "О программе"

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
procedure InitializeWizard;
 begin
  with WizardForm do begin
  Position := poScreenCenter;
  end;
end;


LinkOFF 11-10-2012 23:08 2003797

Mailchik, что-то я вставить не могу. у меня InitializeWizard разделен на 4 части, создаю 5, компилирую и кнопка не уберается. не могли бы вставить? http://rghost.ru/download/40879331/3...dishonored.iss

Mailchik, уже не нужно. я вставил.

El Sanchez 12-10-2012 17:23 2004265

Цитата:

Цитата Serega
Это именно утечка, вот только не понятно почему... »

Serega, это память, отводимая для функции обратного вызова. Если вызвать CallbackAddr один раз, результат поместить в глобальную переменную и работать потом только с ней, то память скакнет только раз.

SatHan 12-10-2012 21:00 2004355

Цитата:

Цитата Serega
Это именно утечка, вот только не понятно почему... »

тоже самое происходит при закрытии/завершении инсталятора. о чём пытался донести из этого поста. хотя инсталятор простой. сделанный по дефолту мастера инно. ничем не напичкан не каких кодов. инсталятор завершил а из памяти ещё 2-3 секунды выгружается.

Respin 13-10-2012 13:54 2004582

Цитата:

Цитата SatHan
Спасибо.
много чего уж перепробовал, но оставил этот, так как код короче всех. потому шансов на ошибки мизерный. »

Цитата:

Цитата R.i.m.s.k.y.
+1024
C использованием IsTask можно нарваться на параноидальный антивирь который блокирует вызов сторонних неизвестных неподписанных библиотек и dll (IsTask в их числе, ога), как следствие получить в инсталлере "Ошибка вызова xxx.dll" и краш инсталлера.
Самый рабочий вариант в моем посте. Не помню кто его мне накидал, или Serega или El Sanchez »

Просто может ему надо не только найти, но и "убить процесс"!?
Позволил себе немного доработать этот код, некаких .dll, а работает также как IsTask.
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

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

[*Code]
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;

type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of char;
    end;
var
ResultCode: Integer;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): Boolean; external 'CloseHandle@kernel32.dll stdcall';


function IsProcessRunning(FileName: String): Boolean;
var
    hProcessSnap: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile: String;
   
begin
  hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
  pe32.dwSize := sizeof(pe32);
  if not Process32First(hProcessSnap, pe32) then Exit;
  while not Result and Process32Next(hProcessSnap, pe32) do
  begin
    szExeFile := '';
    while not (pe32.szExeFile[Length(szExeFile)] = #0) do szExeFile := szExeFile + pe32.szExeFile[Length(szExeFile)];
    Result := LowerCase(FileName) = LowerCase(szExeFile);
  end;
  CloseHandle(hProcessSnap);
end;


function InitializeSetup(): Boolean;
begin
  Result:= True;
  if IsProcessRunning('notepad.exe') then begin
  if MsgBox('Блокнот запущен.'#13#10'Для продолжения установки нужно закрыть блокнот'#13#10'Закрыть блокнот сейчас?', mbError, MB_YESNO) = IDYES then
  begin
  Exec('cmd', '/C taskkill /f /im notepad.exe /t > nul', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
  end else begin
  MsgBox ('Закройте блокнот и запустите установку заново', mbCriticalError,  MB_OK);
  Result:= False;
end;
end;
end;


SatHan 13-10-2012 17:15 2004679

Respin, Привет.
чего уж скрывать, поделюсь своей мыслью по этому поводу. главное расскажу зачем мне это нужно.
эта фишка как раз расчитана на антивирусы и фаерволы. если инсталятор находит любой запущенный процесс. то в данном случае выдаёт сообщение что есть запущенная программа защиты и закрывается сам инсталятор не прибегая к попытке закрыть антивирусную программу. поскольку это не возможно так как у многой защиты есть самозащита.
я мог бы применить хак на vbs который для меня пару лет назад писали но это будет не верным решением. так как эта штука убивает напрочь любую защиту (даже самозащита не помогает). что не один антивирус, фаервол и пр. пр. после этого не запустятся. что в итоге мой инсталятор будет являться как вредоносное ПО. по этому хотел поступить как можно проще.

Respin 13-10-2012 19:42 2004757

Знающие люди! Если вы когда-нибудь сталкивались или делали такую задачу, помогите, пожалуйста.
Как в кустомном Edit ограничить число символов? То есть чтобы минимум нужно ввести 4 и максимум 12 и после этого сконвертировать текст в UTF 8 (соответственно в файл INI).
читать дальше »
Когда это знаешь - всё просто, а когда ни разу с этим не сталкивался - это кажется недостижимым.

SatHan, Привет.
Я думал тебе надо какую-то другую программу закрыть, без использования сторонних .dll-ок.
А ты значит собираешься "антивири" вырубать :nunchaku: Твоими инсталляторами я пользоваться не буду :teeth:

SatHan 13-10-2012 20:49 2004796

Цитата:

Цитата Respin
А ты значит собираешься "антивири" вырубать»

как раз таки не хочу чтоб инсталятор вырубал защиту. наоборот. нужно чтоб при нахождении защиты инсталятор выдал сообщение что "не может продолжить установку из-за запущенного антивируса, фаервола" и закрывался а защита осталась не тронута.

Mailchik 13-10-2012 23:27 2004871

Цитата:

Цитата Respin
Как в кустомном Edit ограничить число символов? То есть чтобы минимум нужно ввести 4 и максимум 12 и после этого сконвертировать текст в UTF 8 (соответственно в файл INI).

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
 TestEdit : TCustomEdit;
 TestCheckBox : TCheckBox;
//----- Конвертирование в UTF-8-----Начало\\
const
    CP_ACP = 0;
    CP_UTF8 = 65001;

function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint;
external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar; cbMultiByte, lpDefaultChar, lpUsedDefaultChar: Integer): Longint;
external 'WideCharToMultiByte@kernel32.dll stdcall';

function StringToWideString(const aStr: String; codePage: Word): String;
var
    len: Integer;
begin
    len := MultiByteToWideChar(codePage, 0, aStr, -1, '', 0);
    if len > 0 then
    begin
        SetLength(Result, (len*2)-2);
        MultiByteToWideChar(codePage, 0, aStr, -1, Result, Length(Result));
    end;
end;

function WideStringToString(const wStr: String; codePage: Word): String;
var
    len: Integer;
begin
    len := WideCharToMultiByte(codePage, 0, wStr, -1, '', 0, 0, 0);
    if len > 0 then
    begin
        SetLength(Result, len-1);
        WideCharToMultiByte(codePage, 0, wStr, -1, Result, Length(Result), 0, 0);
    end;
end;

function SetNickname(Nickname: String; IsConvert: Boolean): String;
begin
    Result := Nickname;
    if IsConvert then Result := WideStringToString(StringToWideString(Result, CP_ACP), CP_UTF8);
end;
//----- Конвертирование в UTF-8-----Конец\\

procedure InitializeWizard;
 begin
  with WizardForm do begin
  OuterNotebook.Hide;
  end;

  TestEdit := TCustomEdit.Create(WizardForm);
  with TestEdit do begin
  Parent := WizardForm;
  Left := ScaleX(150);
  Top := ScaleY(200);
  Width := ScaleX(150);
  end;

  TestCheckBox := TCheckBox.Create(WizardForm);
  with TestCheckBox do begin
  Parent := WizardForm;
  Width := ScaleX(150);
  Left := ScaleX(150);
  Top := ScaleY(230);
  Checked := True;
  Caption := 'Конвертировать в UTF-8';
  end;
end;

function NextButtonClick(CurPageID : Integer) : Boolean;
 begin
  Result := True;
  if (CurPageId = wpWelcome) then if
  (Length(TestEdit.Text) < 4) or (Length(TestEdit.Text) > 12) then begin //Если длина меньше 4 и больше 12 символов
  MsgBox('минимум нужно ввести 4 и максимум 12', mbInformation, MB_OK);  //то переход не выполнится
  Result := False end else begin
  SetIniString('Settings', 'PlayerName', SetNickname(TestEdit.Text, TestCheckBox.Checked), ExpandConstant('{src}\test.ini')); //конвертирование в utf-8
  end;
end;

Пример конвертирования в utf-8 заимствован у El Sanchez'а.

SARATOVSKY 14-10-2012 02:51 2004929

Здравствуйте! У меня инсталл с 3-мя компонентами и один из этих компонентов с флагом "фиксирован( fixed)", так как сделать так, что-бы если этот компонент уже установлен при первой инсталляции, то все последующие инсталляции он не устанавливался, а пропускался, так как это отнимает время! P.S. использую архивы фри арк и скрипт исДоне! Спасибо!

Respin 14-10-2012 10:19 2004971

Mailchik, Благодарю.

Цитата:

Цитата SARATOVSKY
то все последующие инсталляции он не устанавливался, а пропускался »

Не совсем понятно, какие последующие инсталляции... Если пользователь удалит программу, то его же вновь придётся установить.
Как вариант: К нему нужно прописать ключ реестра (и потом не удалять этот ключ)...
читать дальше »
Код:

[Components]
Name: "Component"; Description: "Мой компонент"; Flags: fixed; Check: MyComponent;

[Registry]
Root: HKLM; Subkey: "Software\MyProgram\MyComponent";

function MyComponent: Boolean;
begin
  if RegKeyExists(HKLM, 'Software\MyProgram\MyComponent;')
  then
    Result:= False;
end;

Если ключ имеется, то компонент не будет видно вообще.
P.S. На FreeArc-ке и ISDone не проверял (будет ли он архив распаковывать или нет).


SARATOVSKY 14-10-2012 15:41 2005125

Respin, Спасибо!

LinkOFF 15-10-2012 02:00 2005494

Доброй ночи. Подскажите: как сделать так, чтобы после установки заносились ключи в реестр и с последующим запуском инсталляции было сообщение "Программа уже установлена." и выскакивал запрос на деинсталляцию?

Johny777 15-10-2012 02:57 2005502

LinkOFF, фапай код: :)
читать дальше »
Код:


[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

AppId=The_Best_AppId

[  code]
function InitializeSetup(): Boolean;
var
  AppPath, UninsPath: string;
  ResultCode: Integer;
begin
  AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}'));
  UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}'));

  if (AppPath <> '') then
  begin
    Result := MsgBox('Программа установлена' +#13#10+ 'Удалить?', mbError, MB_YESNO) = IDNO;
    if not Result then Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
  end else Result := True;
end;


поставь где-нибудь El Sanchez-у спасибо, тк дёрнул значения переменных из его кода авторана халфы!

LinkOFF 15-10-2012 03:04 2005504

Johny777, а почему пишет "unknown identifier 'Result'

а все решил проблему

LinkOFF 15-10-2012 03:21 2005508

Johny777, не не встает

Robby 15-10-2012 10:45 2005605

Есть инсталлятор который устанавливает программу, к программе идет xml файл настроек. В файле настроек в конце установки нужно прописать пути к нескольким папкам. Проблема кроется в русских буквах, и заключается в следующем: программа работает с кодировкой символов CP1252 (ISO 8859-1) при этом проблем с русскими буквами она не имеет, но в файле настроек путь должен выглядеть вот так C:\Documents and Settings\Admin\Ìîè äîêóìåíòû\ а не так C:\Documents and Settings\Admin\Мои документы\. Вопрос в следующем как перекодировать CP1251 в CP1252? В общем нужна функция которая на входе получает строку в кодировке CP1251 и возвращает ее в кодировке CP1252.

insombia 17-10-2012 16:44 2007220

как сделать чтобы исдон распаковывал файлы через секцию run? где-то видел такое

LagunaFAN 17-10-2012 17:40 2007265

Всем добрый день! Имею проблему :( Для своих нужно хочется реализовать следующее:

2 типа инсталляции - обычная установка и установка в стим. С обычной установкой все понятно. А вот с установкой в стим затык :(

Допустим, есть 2 установщика - setup.exe (обычная установка) и steamsetup.exe (установка в стим).

Steamsetup.exe имеет свой путь установки непосредственно в стим. Хочется, чтобы на стадии инсталляции он запускал setup.exe, а тот распаковывал файлы по тому пути, который ему сообщит steamsetup.exe .

Подскажите, пожалуйста, как можно реализовать такое?

Ребят, я слаб в паскале, поэтому дико прошу помощи! Заранее благодарю!

Respin 17-10-2012 19:47 2007375

Цитата:

Цитата insombia
как сделать чтобы исдон распаковывал файлы через секцию run? »

Файлы чего именно?

Цитата:

Цитата LagunaFAN
Допустим, есть 2 установщика - setup.exe (обычная установка) и steamsetup.exe (установка в стим).
Steamsetup.exe имеет свой путь установки непосредственно в стим. Хочется, чтобы на стадии инсталляции он запускал setup.exe, а тот распаковывал файлы по тому пути, который ему сообщит steamsetup.exe . »

А по какому пути распаковывается Steamsetup.exe?
Не проще ли сделать один установщик и для... и для того?

LagunaFAN 17-10-2012 20:34 2007416

Цитата:

Цитата Respin
А по какому пути распаковывается Steamsetup.exe?
Не проще ли сделать один установщик и для... и для того? »

Например, по такому C:\Steam\steamapps\common\unknown game

А насчет запихнуть все в один установщик... Быть может это и проще, но я незнаю как :unsure: :blush: :blush:

Respin 17-10-2012 21:58 2007474

Цитата:

Цитата LagunaFAN
Например, по такому C:\Steam\steamapps\common\unknown game »

Вы уже всё распланировали (что будет два установщика (один из которых будет искать Steam + путь установки)). И всё же говорите примерно...
Ну значит, примерно, как-то так:
читать дальше »

Два в одном.
Код:

[Setup]
AppName=unknown game
AppVerName=unknown ver game
AppVersion=unknown game version
DefaultDirName={pf}\unknown game
DefaultGroupName=unknown game
PrivilegesRequired=lowest

[_Code]
procedure InitializeWizard();
begin
if RegKeyExists(HKLM, 'Software\Valve\Steam') then
begin
 WizardForm.DirEdit.Text:= ExpandConstant('{reg:HKLM\Software\Valve\Steam,InstallPath}\steamapps\common\unknown game');
 WizardForm.DirBrowseButton.Hide;
end;
end;


LagunaFAN 17-10-2012 23:27 2007517

Цитата:

Цитата Respin
Вы уже всё распланировали (что будет два установщика (один из которых будет искать Steam + путь установки)). И всё же говорите примерно...
Ну значит, примерно, как-то так: »

Примерно я говорю потому, что какого-то конкретного сейчас сейчас нет. Но в скором времени это мне понадобится :angel: :blush:

Спасибо! Как сделать так, чтобы при наличии установленного стима игра устанавливалась в папку стима понятно. Но мне хотелось, чтобы даже при наличии установленного стима был выбор между обычной установкой и установкой стим. Может можно сделать какие чекбоксы на отдельной странице перед DirPage, чтобы в соответствии с чекбоксом прописывался путь либо "path1", либо "path2"?

Прошу прощения, что возможно много вопросов задаю. Просто я действительно не шарю в паскале :blush: :blush:

Mailchik 18-10-2012 00:28 2007552

LagunaFAN,
читать дальше »
Код:

#define GameName  "My Application"
[Setup]
AppName={#GameName}
AppVersion=1.5
DefaultDirName={pf}\{#GameName}

[Code]
var
 SteamCheckBox : TNewCheckBox;

procedure InitializeWizard;
 begin
  SteamCheckBox := TNewCheckBox.Create(WizardForm);
  with SteamCheckBox do begin
  Parent := WizardForm.WelcomePage;
  SetBounds(ScaleX(170), ScaleY(250), ScaleX(200), ScaleY(20));
  Caption := 'Steam-установка';
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if (CurPageID = wpSelectDir) and (SteamCheckBox.Checked) then begin
  if RegKeyExists(HKLM, 'Software\Valve\Steam') then
    WizardForm.DirEdit.Text := ExpandConstant('{reg:HKLM\Software\Valve\Steam, InstallPath}\steamapps\common\{#GameName}')
    else MsgBox('Steam не установлен', mbInformation, MB_OK);
  end else begin
    WizardForm.DirEdit.Text := ExpandConstant('{pf}\{#GameName}');
  end;
end;


apozlevich 18-10-2012 13:03 2007781

Добрый день. Помогите:
Код:

Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}}\Shell\Open CCleaner..."; Tasks: open; Languages: en; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}}\Shell\Open CCleaner...\command"; ValueName: ""; ValueType: string; ValueData: "{app}\CCleaner.exe"; Tasks: open; Languages: en

Не делает совсем ничего. Думаю, глупая опечатка, но в упор ее не вижу.

Gnom_aka_Lexander 18-10-2012 17:52 2007967

apozlevich, в каком смысле не делает? если эти ключи не пишутся в реестр, то нужно проверить соблюдение всех условий.
Цитата:

Цитата apozlevich
Tasks: open; Languages: en »

будет добавлено, если выполнены одновременно оба условия - выбрана задача open и выбран язык инсталлятора en в начале установки ( если выбор языка отсутствует вообще, то условие скорей всего будет считаться невыполненым, утверждать не могу, не видя скрипта)

apozlevich 18-10-2012 18:00 2007978

Цитата:

Цитата Gnom_aka_Lexander
будет добавлено, если выполнены одновременно оба условия - выбрана задача open и выбран язык инсталлятора en в начале установки ( если выбор языка отсутствует вообще, то условие скорей всего будет считаться невыполненым, утверждать не могу, не видя скрипта) »

Оба условия соблюдены.

Gnom_aka_Lexander 18-10-2012 18:12 2007989

Цитата:

Цитата Gnom_aka_Lexander
не видя скрипта »

нужно посмотреть скрипт полностью.

El Sanchez 18-10-2012 21:28 2008125

Цитата:

Цитата apozlevich
Не делает совсем ничего. Думаю, глупая опечатка, но в упор ее не вижу. »

apozlevich, и не будет работать из-за:
1. GUID, дабы компилятор не посчитал его константой, экранируется только открывающей фигурной скобкой, нужно убрать лишнюю - {{645FF040-5081-101B-9F08-00AA002F954E}}.
2. Толку от этих записей на x64-системах будет никакого, т.к. запишутся в 32-разрядный куст реестра - в контекстном меню корзины ничего не увидите. Нужна проверка разрядности системы, в зависимости от результата писать в нужные кусты.
P.S. Раз делаете мультиязычный установщик, в данном случае от флага Languages можно отказаться. В общем, я бы сделал так:
Код:

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl
Name: en; MessagesFile: compiler:default.isl

[CustomMessages]
ru.ContextMenu=Открыть CCleaner...
en.ContextMenu=Open CCleaner...

[Registry]
;32-bit
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}\shell\{cm:ContextMenu}"; Tasks: open; Flags: uninsdeletekey; Check: not IsWin64
Root: HKLM; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}\shell\{cm:ContextMenu}\command"; ValueType: string; ValueData: "{app}\CCleaner.exe"; Tasks: open; Flags: uninsdeletekey; Check: not IsWin64
;64-bit
Root: HKLM64; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}\shell\{cm:ContextMenu}"; Tasks: open; Flags: uninsdeletekey; Check: IsWin64
Root: HKLM64; Subkey: "SOFTWARE\Classes\CLSID\{{645FF040-5081-101B-9F08-00AA002F954E}\shell\{cm:ContextMenu}\command"; ValueType: string; ValueData: "{app}\CCleaner.exe"; Tasks: open; Flags: uninsdeletekey; Check: IsWin64


apozlevich 18-10-2012 21:34 2008130

El Sanchez, спасибо, но я забыл отметить, что мне уже все объяснил Gnom_aka_Lexander, за что ему большое спасибо.

Цитата:

Цитата El Sanchez
P.S. Раз делаете мультиязычный установщик, в данном случае от флага Languages можно отказаться. В общем, я бы сделал так: »

А это хорошая идея!

Tco 03 18-10-2012 23:51 2008200

Подскажите пожалуйста, как скопировать папку целиком (со всеми вложенными в неё файлами) через секцию [code]?

Johny777 19-10-2012 01:05 2008231

Tco 03, лови :)
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
procedure CopyFolder(SourceFolder, DestFolder: String);
var
    oFS: Variant;
begin
    try
        if not DirExists(SourceFolder) then Exit;
        if not DirExists(DestFolder) then if not CreateDir(DestFolder) then Exit;
        oFS := CreateOleObject('Scripting.FileSystemObject');
        oFS.CopyFolder(RemoveBackslash(SourceFolder), DestFolder);
    except
        //ShowExceptionMessage;
    end;
end;


procedure InitializeWizard();
begin
    CopyFolder('C:\setup', 'C:\Intel\setup');
end;


ToBeLife 19-10-2012 21:52 2008772

Доброго времени суток.
Подскажите код
что бы перед началом установки инсталятор удалил определённый файл и только потом начинал установку программы.
и второе, если выбрать определённый компонент, скажем патч в инсталяторе, что бы установился в начале он и только потом все остальные файлы.

R.i.m.s.k.y. 19-10-2012 22:09 2008780

Цитата:

Цитата ToBeLife
что бы перед началом установки инсталятор удалил определённый файл и только потом начинал установку программы »

Код:

[CODE]
procedure RD(Dir:string);
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure RF(file:string);
begin
  Exec('cmd.exe', ' /c del /F /Q  ' + '"'+file+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

Function InitializeSetup: Boolean;
var file2delete : string;
Begin
  file2delete := твой файл;
  RF(file2delete);
  if (not FileExists(file2delete)) then Result := true else Result := False;
end;

Цитата:

Цитата ToBeLife
второе, если выбрать определённый компонент, скажем патч в инсталяторе, что бы установился в начале он и только потом все остальные файлы. »

Читай в справке Installation Order.
Установщик выполняет скрипт сверху вниз, так что как вариант в секции Files просто нужно поставить файлы "твоего компонента" первыми.

ToBeLife 19-10-2012 22:14 2008784

R.i.m.s.k.y.,
Благодарствую, и как всегда спасибо.

R.i.m.s.k.y. 19-10-2012 22:14 2008785

El Sanchez,
расскажи пожалуйста, поподробнее про ключи реестра в 64-х битных системах
К примеру три ключа
- HKLM\SOFTWARE\Wow6432Node
- HKLM64\SOFTWARE\
- HKLM\SOFTWARE\
к каким разрядностям относятся? не являются первый и третий ключи синонимами и если нет - в каких случаях юзается первый и последний?

ToBeLife 19-10-2012 22:55 2008796

R.i.m.s.k.y.,
простите благодушно, по поводу кода, у меня inno ругается на неизвестный идентификатор res
Exec('cmd.exe', ' /c rd /S /Q ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
подскажите пожалуйста

R.i.m.s.k.y. 19-10-2012 23:09 2008805

ToBeLife,
Код:

[CODE]
var res : integer;

procedure RD(Dir:string);
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure RF(file:string);
begin
  Exec('cmd.exe', ' /c del /F /Q  ' + '"'+file+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

Function InitializeSetup: Boolean;
var file2delete : string;
Begin
  file2delete := твой файл;
  RF(file2delete);
  if (not FileExists(file2delete)) then Result := true else Result := False;
end;


ToBeLife 19-10-2012 23:13 2008811

простите, это я невнимателен, ещё раз спасибо

R.i.m.s.k.y. 20-10-2012 06:03 2008882

ToBeLife, та ни, это я строчку var res : integer; забыл

ToBeLife 20-10-2012 13:03 2008984

R.i.m.s.k.y.,
а в каком формате писать, просто имя с расширением или в кавычки брать?

Цитата:

Цитата R.i.m.s.k.y.
Begin
file2delete := твой файл;
RF(file2delete);
if (not FileExists(file2delete)) then Result := true else Result := False;
end; »

потому как нужный файл не удаляется.

Johny777 20-10-2012 13:24 2008994

R.i.m.s.k.y., ToBeLife,
можно ж проще :)
просто удаление:
читать дальше »
Код:

function InitializeSetup(): Boolean;
begin
  Result := not FileExists(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));
  if not Result then Result := DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));
end;



если у файла есть атрибут "только чтение":
читать дальше »
Код:

function GetFileAttributes(lpFileName: string): integer;external 'GetFileAttributesA@kernel32.dll stdcall';
function SetFileAttributes(lpFileName: string; dwFileAttributes: integer): integer;external 'SetFileAttributesA@kernel32.dll stdcall';

function InitializeSetup(): Boolean;
begin
  Result := not FileExists(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));
  if not Result then
  begin
    if (GetFileAttributes(ExpandConstant('{userdesktop}\Half-Life 2.lnk')) and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then SetFileAttributes(ExpandConstant('{userdesktop}\Half-Life 2.lnk'), FILE_ATTRIBUTE_NORMAL);
    Result := DeleteFile(ExpandConstant('{userdesktop}\Half-Life 2.lnk'));
  end;
end;


R.i.m.s.k.y. 20-10-2012 13:25 2008995

ToBeLife, полный путь до файла, с расширением, кавычки не нужны, они добавляются в процедурах RD/RF

Johny777, не всегда работает встроенная функция удаления файлов и папок, поэтому я через комстроку сделал.
И копирование тоже делаю через комстроку, и добавление кавык тоже своими функциями а не встроенными тк работают они по настроению, а разбираться чего установщик выкаблучивается вломм.
Код:

function Add_Quotes(strng : String):String;
begin
  Result := '"' + strng + '"';
end;

procedure copy1file(fromfile, tofile:string);
begin
  Exec('cmd.exe', ' /c copy /Y /V /B ' + Add_Quotes(fromfile) + ' ' + Add_Quotes(tofile),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;


ToBeLife 20-10-2012 13:29 2008997

R.i.m.s.k.y., путь до файла который необходимо удалить, может варьироваться.
или это не будет иметь значения?
**и всё равно ругается на на неизвесный параметр (в данном случае диск C)

R.i.m.s.k.y. 20-10-2012 13:32 2009000

ToBeLife, конечно будет и это надо учитывать

El Sanchez 20-10-2012 14:29 2009027

Цитата:

Цитата R.i.m.s.k.y.
расскажи пожалуйста, поподробнее про ключи реестра в 64-х битных системах
К примеру три ключа
- HKLM\SOFTWARE\Wow6432Node
- HKLM64\SOFTWARE\
- HKLM\SOFTWARE\
к каким разрядностям относятся? не являются первый и третий ключи синонимами и если нет - в каких случаях юзается первый и последний? »

R.i.m.s.k.y., первый вариант не применяется. Inno Setup является 32-разрядным приложением, поэтому по умолчанию запись в реестр производится в 32-разрядный куст. Для доступа к 64-разрядным кустам реестра необходимо указывать префикс 64 (64-разрядный режим работы инсталлятора ОТКЛЮЧЕН (по умолчанию)). При включенном 64-разрядном режиме (ArchitecturesInstallIn64BitMode=x64 ia64) умолчальным кустом будет являться 64-разрядный куст, доступ к 32-разрядному кусту по префиксу 32.
Код:

;64-разрядный режим работы инсталлятора ОТКЛЮЧЕН (по умолчанию)
HKLM\SOFTWARE\MyProgram - запись в 32-разрядный куст реестра, для 64-разрядных систем система сама произведет редирект в HKLM\SOFTWARE\Wow6432Node\MyProgram
HKLM64\SOFTWARE\MyProgram - запись в 64-разрядный куст реестра.
P.S. HKLM=HKLM32

;64-разрядный режим работы инсталлятора ВКЛЮЧЕН
HKLM\SOFTWARE\MyProgram - запись в 64-разрядный куст реестра.
HKLM32\SOFTWARE\MyProgram - запись в 32-разрядный куст реестра, редирект в HKLM\SOFTWARE\Wow6432Node\MyProgram
P.S. HKLM=HKLM64

Разумеется, все это с использованием функции IsWin64.

R.i.m.s.k.y. 20-10-2012 17:54 2009113

El Sanchez, спасибо
такой вопрос:

1.при импортировании толстого файла реестра через reg import в какой куст реестра (32/64) он попадает? как правильно в 64битной ос занести 32/64 битный куст из reg-файла?

2. при использовании утилиты regshot она показывает что одинаковые записи заносятся в HKLM\SOFTWARE\Classes\Wow6432Node\ и HKLM\SOFTWARE\Wow6432Node\Classes\
Это чьи синонимы? Чтол это за кусты и как с ними бороться?

El Sanchez 20-10-2012 19:27 2009141

Цитата:

Цитата R.i.m.s.k.y.
при использовании утилиты regshot она показывает что одинаковые записи заносятся в HKLM\SOFTWARE\Classes\Wow6432Node\ и HKLM\SOFTWARE\Wow6432Node\Classes\
Это чьи синонимы? Чтол это за кусты и как с ними бороться? »

R.i.m.s.k.y., HKLM\SOFTWARE\Classes\Wow6432Node\ - 32-разрядный куст 64-разрядного куста HKLM\SOFTWARE\Classes, HKLM\SOFTWARE\Wow6432Node\Classes\ - 32-разрядный куст Classes 64-разрядного куста HKLM\SOFTWARE. Разница налицо.
Цитата:

Цитата R.i.m.s.k.y.
при импортировании толстого файла реестра через reg import в какой куст реестра (32/64) он попадает? »

R.i.m.s.k.y., зависит от того какой (32- или 64-разрядный) reg.exe/regedit.exe будет вызван.
Цитата:

Цитата R.i.m.s.k.y.
как правильно в 64битной ос занести 32/64 битный куст из reg-файла? »

R.i.m.s.k.y., пример reg-файла test.reg:
Код:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\123]
@="test"

[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\321]
@="test"

Как нужно:
Код:

[Run]
;запуск на 64-разрядной системе с помощью 64-разрядного regedit.exe
;не путать с 32-разрядной версией regedit.exe, находящегося в SysWOW64, указание {sys}\regedit.exe как раз этот случай
;флаг 64bit обязателен, без него записи из test.reg будут только в 32-разрядном кусте
Filename: {win}\regedit.exe; Parameters: "/S ""{src}\test.reg"""; Flags: 64bit; Check: IsWin64

;запуск на 64-разрядной системе с помощью 64-разрядного reg.exe
;флаг 64bit обязателен, без него будет вызвана 32-разрядная версия reg.exe
Filename: {sys}\reg.exe; Parameters: "import ""{src}\test.reg"""; Flags: runhidden 64bit; Check: IsWin64

Понятно, что не стоит применять reg-файл, сделанный на 64-разрядной системе, на 32-разрядной из-за наличия редиректа Wow6432Node в reg-файле.

CrashTest 22-10-2012 20:54 2010359

Народ кому не сложно помогите. Нужно создать наипростейший инсталлятор на is. и с помощью его внести реестр, а при деинсталляции удалить его. Я изучаю nsis и не хочу заморачиваться с is. Просто мне нужно проверить один парадокс.

Ключи реестра нужно внести при инсталляции:
Код:

WriteRegDWORD HKCU "Software\Andrew Zhezherun\WinDjView\Settings" "language" "1049"
WriteRegDWORD HKCU "Software\Andrew Zhezherun\WinDjView\Settings" "check-updates" "0"
WriteRegDWORD HKCU "Software\Andrew Zhezherun\WinDjView\Settings" "warn-not-default-viewer" "0"
WriteRegStr HKCU "Software\Andrew Zhezherun\WinDjView\Settings" "version" "2.0.1"

Удалить:
Код:

DeleteRegKey HKCU "Software\Andrew Zhezherun"

El Sanchez 22-10-2012 21:29 2010381

CrashTest,
Код:

[Setup]
AppName=test
AppVerName=test
DefaultDirName={pf}\test

[Registry]
Root: HKCU; Subkey: Software\Andrew Zhezherun; Flags: uninsdeletekey
Root: HKCU; Subkey: Software\Andrew Zhezherun\WinDjView\Settings; ValueType: dword; ValueName: language; ValueData: 1049
Root: HKCU; Subkey: Software\Andrew Zhezherun\WinDjView\Settings; ValueType: dword; ValueName: check-updates; ValueData: 0
Root: HKCU; Subkey: Software\Andrew Zhezherun\WinDjView\Settings; ValueType: dword; ValueName: warn-not-default-viewer; ValueData: 0
Root: HKCU; Subkey: Software\Andrew Zhezherun\WinDjView\Settings; ValueType: string; ValueName: version; ValueData: 2.0.1


CrashTest 22-10-2012 21:53 2010396

El Sanchez, спасибо.

Volonter908 23-10-2012 07:26 2010548

Доброго времени суток.
Обращаюсь к Вам,уважаемый господин El Sanchez и надеюсь на помощь.
Давно ищу скрипт для выбора имени пользователя и шары в установщике DC++(Речь идёт о файле DCPlusPlus.xml)
Имя,строка <Nick type="string">имя</Nick>
Шара,строка <Share>
</Share>
Несколько раз видел,как Вы помогали в похожей ситуации.Дело в том,что во всех таких случаях,кроме этих двух пунктов фигурировали ещё URL,временная папка для скачивания и тд(Пробовал убирать лишний функционал из тех примеров и потерпел неудачу.
Облазил уже всё что только можно.Please help.

El Sanchez 23-10-2012 11:11 2010633

Цитата:

Цитата Volonter908
ищу скрипт для выбора имени пользователя и шары в установщике DC++(Речь идёт о файле DCPlusPlus.xml) »

Volonter908, дабы не тратить время на создание нод xml-файла через код, создайте шаблон файла DCPlusPlus.xml в кодировке UTF-8:
читать дальше »

HTML код:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<DCPlusPlus>
        <Settings>
                <Nick></Nick>
        </Settings>
        <Share>
                <Directory Virtual=""></Directory>
        </Share>
</DCPlusPlus>



Тогда скрипт будет выглядеть вот так:
читать дальше »

Код:

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[CustomMessages]
ru.NickNamePageCaption=Информация о пользователе
ru.NickNamePageDescription=Какой ник у Вас в DC++?
ru.NickNamePageSubcaption=Укажите ник и нажмите "Далее"
ru.NickNamePageEditName=Имя пользователя в DC++:
ru.ShareDirPageCaption=Выбор каталога для общего доступа
ru.ShareDirPageDescription=Где будут храниться файлы для общего доступа?
ru.ShareDirPageSubcaption=Укажите каталог для файлов общего доступа

[Files]
;допустим, что шаблон рядом со скриптом находится
Source: DCPlusPlus.xml; DestDir: {app}; Flags: ignoreversion

[code]
var
    NickNamePage: TInputQueryWizardPage;
    ShareDirPage: TInputDirWizardPage;

//создание xml-файла   
procedure CreateDCPlusPlus(Filename: String);
var
    objXMLDoc: Variant;
begin
    try
        objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
        objXMLDoc.load(Filename);
        //nick node
        objXMLDoc.selectSingleNode('//DCPlusPlus/Settings/Nick').text := NickNamePage.Values[0];
        //share node
        objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').setAttribute('Virtual', ExtractFileName(RemoveBackSlash(ShareDirPage.Values[0])));
        objXMLDoc.selectSingleNode('//DCPlusPlus/Share/Directory').text := ShareDirPage.Values[0];
        //save xml
        objXMLDoc.save(Filename);
    except
        //ShowExceptionMessage;
        Exit;
    end;
end;

//чтение значений из xml-файла при повторной установке
function ReadDCPlusPlus(Filename, Node, Default: String): String;
var
    objXMLDoc: Variant;
begin
    Result := Default;
    if not FileExists(Filename) then Exit;
    try
        objXMLDoc := CreateOleObject('Microsoft.XMLDOM');
        objXMLDoc.load(Filename);
        objXMLDoc.async := False;
        if objXMLDoc.parseError.errorCode <> 0 then Exit;
        Result := objXMLDoc.selectSingleNode(Node).text;
    except
        //ShowExceptionMessage;
        Exit;
    end;
end;

procedure CreateNickNamePage;
begin
    NickNamePage := CreateInputQueryPage(wpSelectTasks, ExpandConstant('{cm:NickNamePageCaption}'), ExpandConstant('{cm:NickNamePageDescription}'), ExpandConstant('{cm:NickNamePageSubcaption}'));
    NickNamePage.Add(ExpandConstant('{cm:NickNamePageEditName}'), False);
    NickNamePage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\DCPlusPlus.xml', '//DCPlusPlus/Settings/Nick', ExpandConstant('{username}'));
end;

procedure CreateShareDirPage;
begin
    ShareDirPage := CreateInputDirPage(NickNamePage.ID, ExpandConstant('{cm:ShareDirPageCaption}'), ExpandConstant('{cm:ShareDirPageDescription}'), ExpandConstant('{cm:ShareDirPageSubcaption}'), False, 'Новая папка');
    ShareDirPage.Add('');
    ShareDirPage.Values[0] := ReadDCPlusPlus(WizardDirValue + '\DCPlusPlus.xml', '//DCPlusPlus/Share/Directory', '');
end;


procedure InitializeWizard();
begin
    CreateNickNamePage;
    CreateShareDirPage;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    case CurStep of
        ssPostInstall: CreateDCPlusPlus(ExpandConstant('{app}\DCPlusPlus.xml'));
    end;
end;


R.i.m.s.k.y. 23-10-2012 11:33 2010641

El Sanchez, спасибо, последний вопрос: в коде через exec как правильно вносить 32-х и 64-х битные ключи реестра в 64-й ОС?

El Sanchez 23-10-2012 12:55 2010676

Цитата:

Цитата R.i.m.s.k.y.
в коде через exec как правильно вносить 32-х и 64-х битные ключи реестра в 64-й ОС? »

R.i.m.s.k.y.,
Код:

var
  OldState: Boolean;
  ResultCode: Integer;
begin
  if IsWin64 then
  begin
    OldState := EnableFsRedirection(False);
    try
      //через regedit.exe...
      Exec(ExpandConstant('{win}\regedit.exe'), ExpandConstant('/S "{src}\test.reg"'), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
      //...или reg.exe
      Exec(ExpandConstant('{sys}\reg.exe'), ExpandConstant('import "{src}\test.reg"'), '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
    finally
      EnableFsRedirection(OldState);
    end;
  end;
end;


R.i.m.s.k.y. 23-10-2012 13:18 2010683

El Sanchez,
я окончательно запутался
а) для какого режима установщика (32/64) два вышеприведенных примера?
б) последний пример занесет файл реестра в 32-х или в 64-х разрядную секцию реестра?

El Sanchez 23-10-2012 14:36 2010715

Цитата:

Цитата R.i.m.s.k.y.
а) для какого режима установщика (32/64) два вышеприведенных примера? »

R.i.m.s.k.y., для режима по умолчанию. 64-режим нужен, если делаешь установщик 64-битной программы.
Цитата:

Цитата R.i.m.s.k.y.
б) последний пример занесет файл реестра в 32-х или в 64-х разрядную секцию реестра? »

R.i.m.s.k.y., смотря что в reg-файле написано: HKEY_LOCAL_MACHINE\SOFTWARE\123 - пойдет в 64-разрядный куст, HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\321 - 32-разрядный

R.i.m.s.k.y. 23-10-2012 14:54 2010726

El Sanchez, я окончательно перестал понимать
Можно тебя об одолжении рассортировать все написанное по моим вопросам для ArchitecturesInstallIn64BitMode=x64 и ArchitecturesInstallIn64BitMode=(blank)

El Sanchez 23-10-2012 17:40 2010818

R.i.m.s.k.y., ну тогда слушай теорию, повторять не буду. 64-битная система помимо нативных (родных, своих в доску, etc) 64-битных файлов имеет набор 32-битных файлов для поддержки запуска 32-битных программ через подсистему WOW64, не позволяющей обращаться 32-битному коду к 64-битным файлам и реестру. Грубо говоря, 64-битные программы работают с родными файлами из С:\Windows\system32 и родным реестром (напр. куст HKLM\SOFTWARE), а 32-битные со своим 32-битным набором из С:\Windows\SysWoW64 и своим 32-битным реестром в составе 64-битного (напр. куст HKLM\SOFTWARE\Wow6432Node). Программные группы тоже различаются: Program Files для 64-битных программ, Program Files (x86) для 32-битных. Inno, как и любое другое 32-битное приложение, при обращении к С:\Windows\system32 или к HKLM\SOFTWARE\MyProgram будет перенаправлено подсистемой WOW64 в соответстующие папку SysWoW64 и куст Wow6432Node, {sys} становится С:\Windows\SysWoW64, {pf} - C:\Program Files (x86), HKLM\SOFTWARE - HKLM\SOFTWARE\Wow6432Node и т.д. Если же установщик помимо 32-битных компонентов содержит 64-битные, то нужно позаботиться о том, чтобы неродные для 32-битной программы 64-битные файлы не попали куда не надо (флаг 64bit (для секций Files, Run и UninstallRun), функции IsWin64, EnableFsRedirection и т.д., префикс 64 для параметра Root секции Registry и т.д.).
Код:

[Run]
;64-bit mode OFF
Filename: {sys}\calc.exe; WorkingDir: {sys} - запустит калькулятор из С:\Windows\SysWoW64
Filename: {sys}\calc.exe; WorkingDir: {sys}; Flags: 64bit - запустит калькулятор из С:\Windows\system32

[Registry]
;64-bit mode OFF
Root: HKLM; Subkey: SOFTWARE\MyProgram; Flags: uninsdeletekey - запись в HKLM\SOFTWARE\Wow6432Node\MyProgram
Root: HKLM64; Subkey: SOFTWARE\MyProgram; Flags: uninsdeletekey -  запись в HKLM\SOFTWARE\MyProgram

Теперь о директиве ArchitecturesInstallIn64BitMode. Установка ее значения в x64 и/или ia64 позволяет подсистеме WOW64 выполнять 32-битный код в 64-битном режиме путем переключения собственного режима процессора. Другими словами установщик не становится 64-битным приложением, это невозможно, просто теперь редирект не нужен, дефолтными стают теперь 64-битные папки и кусты, отпадает необходимость в указании флага 64bit или префикса 64, но появляется необходимость использования при обращении к 32-битным папкам и реестру флага 32bit, спецконстант типа {syswow64}, {pf32} и т.д., префикса 32. Поэтому включение режима целесообразно, если устанавливаемые компоненты сплошь 64-битные или их больше, чем 32-битных - меньше писанины. Т.к. 32-битных программ гораздо больше, чем "чистых" 64-битных, то на практике включение режима 64-bit mode встретишь нечасто. Лично я ни разу не применял.
Код:

[Run]
;64-bit mode ON
Filename: {sys}\calc.exe; WorkingDir: {sys} - запустит калькулятор из С:\Windows\system32
Filename: {sys}\calc.exe; WorkingDir: {sys}; Flags: 32bit - запустит калькулятор из С:\Windows\SysWoW64
Filename: {syswow64}\calc.exe; WorkingDir: {syswow64} - запустит калькулятор из С:\Windows\SysWoW64, не рекомендуется

[Registry]
;64-bit mode ON
Root: HKLM; Subkey: SOFTWARE\MyProgram; Flags: uninsdeletekey - запись в HKLM\SOFTWARE\MyProgram
Root: HKLM32; Subkey: SOFTWARE\MyProgram; Flags: uninsdeletekey -  запись в HKLM\SOFTWARE\Wow6432Node\MyProgram


R.i.m.s.k.y. 23-10-2012 18:36 2010857

El Sanchez, благодарю,
Твой пост будет очень полезен и другим, помести ссылку на него в шапку.

Johny777 24-10-2012 01:16 2011076

добрые люди! :)
скажите пожалуйста
можно ли импортировать функции 7z.dll (лежит в папке архиватора) в Inno для распаковки (по возможности и запаковки) внешних архивов с отображением прогрессбара
если да то можно мне пожалуйста код?
кажись там даже можно юзать ком строку параметров (пропускать, перезаписывать ...)

просьба не предлагать мне IsDone

Respin 24-10-2012 07:04 2011110

Цитата:

Цитата Johny777
можно ли импортировать функции 7z.dll (лежит в папке архиватора) в Inno для распаковки (по возможности и запаковки) внешних архивов с отображением прогрессбара »

7.z-архивы (с отображением прогрессбара) можно распаковать через модуль распаковки FreeArc-архивов.
Есть ещё модуль для распаковки 7-zip архивов (с отображением прогрессбара).
Также где-то видел скрипт для запаковки в 7-zip архивы...
Вот тут посмотри (первое и второе там точно есть).

Johny777 24-10-2012 13:45 2011290

Respin, спасибо за ответ :)
первое
Цитата:

Цитата Respin
модуль для распаковки 7-zip архивов (с отображением прогрессбара) »

is7z v1.01от ExpeditorR сильно устарело. Переходить на древние версии архиватора - не катит. Можно забить/забыть
FreeArc - не то что нужно
Цитата:

Цитата Respin
Также где-то видел скрипт для запаковки в 7-zip архивы... »

нет прогрессбара - не то :(


переоформлю вопрос
архиватор и есть библиотека, те все что делается через гуи делается через функции и импортированные из библиотеки. Мне хотелось бы импортировать основные возможности библиотеки и юзать их не прыгая с ветки на ветку (читай от левой библиотеки к левой)
важны
1: Проресс
2: Параметры
3: Запаковка(не в большей мере)
4: возможность распаковки отдельного файла
5: вывод имени извлекаемого файла.
короче то что мы делаем в архиваторе

===================================================================

посоны
помогите пожалуйста портировать код
http://sendfile.su/695878

El Sanchez 26-10-2012 17:01 2012750

Цитата:

Цитата Johny777
помогите пожалуйста портировать код »

Johny777, у тебя в архиве устаревшая версия библиотеки 7-zip.dll - 4.42. Скачай отсюда версию поновее, там прогресс доработан. Тепер, собственно порт:
читать дальше »

Код:

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

[Files]
Source: 7-zip32.dll; Flags: dontcopy

[code]
#define A = (Defined UNICODE) ? "W" : "A"

const
    SZ_ERROR = 1;
    SZ_DLLERROR = 3;
    ARCEXTRACT_INPROCESS = 1;
    WM_USER = $400;
    PBM_SETPOS = (WM_USER + 2);
    PBM_SETRANGE32 = (WM_USER + 6);

type
    EXTRACTINGINFO = record
        dwFileSize: DWORD;                                 
        dwWriteSize: DWORD;                               
        szSourceFileName: array [0..512] of Char;
        dummy1: array [0..2] of Byte;
        szDestFileName: array [0..512] of Char;
        dummy: array [0..2] of Byte;
    end;

function SevenZip(const hwnd: HWND; szCmdLine: PAnsiChar; szOutput: AnsiString; const dwSize: DWORD): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
function SevenZipSetOwnerWindowEx(_hwnd: HWND; _lpArcProc: Longint): BOOL; external 'SevenZipSetOwnerWindowEx@files:7-zip32.dll stdcall';
function SevenZipKillOwnerWindowEx(_hwnd: HWND): BOOL; external 'SevenZipKillOwnerWindowEx@files:7-zip32.dll stdcall';
//
function RtlMoveMemory(var Destination: EXTRACTINGINFO; const Source: Longint; len: Integer): Integer; external 'RtlMoveMemory@kernel32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: String; cbMultiByte: Integer; lpWideCharStr: String; cchWideChar: Integer): Integer; external 'MultiByteToWideChar@kernel32.dll stdcall';


var
    ei: EXTRACTINGINFO;
    ProgressPage: TOutputProgressWizardPage;
    hProgress, hMsg1Label, hMsg2Label: HWND;

//////////////////////////////////////////////////////////
function CharArrayToString(cArray: array of Char): String;
begin
    Result := '';
    while cArray[Length(Result)] <> #0 do Insert(cArray[Length(Result)], Result, Length(Result)+1);
end;

//////////////////////////////////////////////
function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
    except end;
end;

////////////////////////////////////////////////////////////////////////////////////////
function ArchiverCallbackProc(hwnd: HWND; uMsg, nState: UINT; lpEis: Longint): BOOL;
begin
    Result := True;
    case nState of
        ARCEXTRACT_INPROCESS: begin
            RtlMoveMemory(ei, lpEis, SizeOf(ei));
            PostMessage(hwnd, PBM_SETRANGE32, 0, 100);
            PostMessage(hwnd, PBM_SETPOS, Round(ei.dwWriteSize*100/ei.dwFileSize), 0);
            SetWindowText(hMsg1Label, Format('Файл: %s'#13#10'Общий размер: %s'#13#10'Текущий размер: %s', [CharArrayToString(ei.szSourceFileName), BytesToSize(ei.dwFileSize), BytesToSize(ei.dwWriteSize)]));
            SetWindowText(hMsg2Label, FormatFloat('Прогресс: 0.#0 %', (ei.dwWriteSize*100)/ei.dwFileSize));
        end;
    end;
end;

/////////////////////////////////////
procedure CreateSevenZipProgressPage;
begin
    ProgressPage := CreateOutputProgressPage('7-zip', '');
    ProgressPage.Msg1Label.Height := ScaleY(50);
    ProgressPage.Msg2Label.Top := ProgressPage.Msg1Label.Top + ProgressPage.Msg1Label.Height + ScaleY(5);
    ProgressPage.ProgressBar.Top := ProgressPage.Msg2Label.Top + ProgressPage.Msg2Label.Height + ScaleY(5);
end;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function SevenZipCommand(const hWnd: HWND; szParams: String; const lpArchiverCallback: Longint): Longint;
begin
    Result := SZ_ERROR;
    case szParams[1] of
        'a': ProgressPage.Description := 'Создание архива';
        'b': ProgressPage.Description := 'Тестирование производительности';
        'd': ProgressPage.Description := 'Удаление файлов из архива';
        'e': ProgressPage.Description := 'Извлечение файлов из архива';
        'l': ProgressPage.Description := 'Список файлов архива';
        't': ProgressPage.Description := 'Тестирование файлов архива';
        'u': ProgressPage.Description := 'Обновление файлов в архиве';
        'x': ProgressPage.Description := 'Извлечение файлов из архива с полными путями';
    end;
    if lpArchiverCallback <> 0 then szParams := Format('%s -hide', [szParams]);
    CharToOemBuff(szParams);
    try
        if lpArchiverCallback <> 0 then
        begin
            hMsg1Label := ProgressPage.Msg1Label.Handle;
            hMsg2Label := ProgressPage.Msg2Label.Handle;
            //show progress page
            ProgressPage.Show;
            ProgressPage.ProgressBar.Show;
            //set callback
            SevenZipSetOwnerWindowEx(hWnd, lpArchiverCallback);
        end;
        Result := SevenZip(hWnd, szParams, '', 0);
    finally
        if lpArchiverCallback <> 0 then
        begin
            ProgressPage.Hide;
            SevenZipKillOwnerWindowEx(hWnd);
        end;
    except
        Result := SZ_DLLERROR;
    end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
    CreateSevenZipProgressPage;
end;

//////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
    if CurPageID = wpWelcome then
    begin
        // compress with callback
        SevenZipCommand(ProgressPage.ProgressBar.Handle, Format('a "%s" "%s"', ['d:\123.7z', 'd:\Firefox Setup 19.0.2.exe']), CallbackAddr('ArchiverCallbackProc'));

        // compress without callback
        //SevenZipCommand(ProgressPage.ProgressBar.Handle, Format('a "%s" "%s"', ['d:\123.7z', 'd:\Firefox Setup 19.0.2.exe']), 0);

        // extract with callback
        //SevenZipCommand(ProgressPage.ProgressBar.Handle, Format('x "%s" "%s" -y', ['d:\123.7z', 'd:\']), CallbackAddr('ArchiverCallbackProc'));

        // extract without callback
        //SevenZipCommand(ProgressPage.ProgressBar.Handle, Format('x "%s" "%s" -y', ['d:\123.7z', 'd:\']), 0);
        Result := True;
    end;
end;


P.S. С функцией обратного вызова для отрисовки своего прогресса пока ничего, обходись пока встроенным в библиотеку прогрессом.
UPD: Реализовал callback. Мусор удален.
UPD2: No problemo с кириллицей.
UPD3: к черту неиспользуемые функции

Johny777 26-10-2012 22:14 2012963

El Sanchez, Слов нет, Спасибо! :)
думаю коду прямая дорога в шапку к остальным кодам
Цитата:

Цитата El Sanchez
С функцией обратного вызова для отрисовки своего прогресса пока ничего, обходись пока встроенным в библиотеку прогрессом. »

не проблема и так уже супер
Но всёж есть ли шанс реализовать в будущем?

И кстати. Маленькая инфа
функция SevenZipExtractArchive возвращает:
32800 - нажали на "отмену"
0 - распаковка завершена

insombia 29-10-2012 23:56 2014729

можно ли сделать так,чтобы установщик запускался лишь на 7 и висте?

R.i.m.s.k.y. 30-10-2012 03:58 2014795

insombia,
Код:

[CODE]
var
  Version: TWindowsVersion;

Function InitializeSetup: Boolean;
Begin
  GetWindowsVersionEx (version);
  if (Version.Major=6) then Result := True
  else begin
    MsgBox('Для установки требуется Windows Vista или Se7en', mbInformation, MB_OK);
    Result := False;
  end;
end;


SoulSide 30-10-2012 05:07 2014808

insombia,
Код:

[Setup]
MinVersion=0,6.0
OnlyBelowVersion=0,6.1


El Sanchez 30-10-2012 17:27 2015190

Цитата:

Цитата Johny777
не проблема и так уже супер
Но всёж есть ли шанс реализовать в будущем? »

Johny777, реализовал. Работает на ANSI/Unicode (Restools).

El Sanchez 30-10-2012 21:18 2015344

Цитата:

Цитата Johny777
а как отменить например распаковку? »

Johny777,
  1. Создаешь глобальную булеву переменную, например, bWork, инициализируешь в True;
  2. Создаешь свою кнопку отмены на ProgressPage.
  3. В ее обработчике OnClick пишешь bWork := False;
  4. В callback-функции ArchiverCallbackProc в теле выбора ARCEXTRACT_INPROCESS последней строкой пишешь Result := bWork;

Gugle 31-10-2012 12:53 2015726

Доброго времени суток!

В первой процедуре создаю xml документ:

Код:

oXMLDoc:= CreateOleObject('MSXML2.DOMDocument');
oXMLDoc.appendChild(oXMLDoc.createProcessingInstruction('xml', 'version="1.0" encoding="UTF-8"'));
rootNode:= oXMLDoc.appendChild(oXMLDoc.createElement("CONFIG"));
oXMLDoc.save("C:\test.xml");

В следующей процедуре мне надо добавить туда элементы:
Код:

xmlParser := CreateOleObject('Microsoft.XMLDOM');
xmlParser.async := False;
xmlParser.load(fileName);
rootElement:= xmlParser.getElementsByTagName("CONFIG");
for i := 0 to rootElement.length-1 do
    addElement:= rootElement.item[i].appendChild(xmlParser.createElement("Name"));

xmlParser.save(fileName);

Открываю файл, а там все в одну строку кроме заголовка.
<?xml version="1.0" encoding="UTF-8"?>
<CONFIG><Name>/<Name></CONFIG>

Подскажите можно как нить указать парсеру, что надо расставить переносы?

Johny777 31-10-2012 16:35 2015874

El Sanchez, ещё раз спасибо за код!
в общем добавил входной параметр OverwriteExistingFiles
Извиняюсь за свой поспешный вывод о внесённых мной изменениях. всё работает!
в функции SevenZipExtractArchive заменил TStringList на динамичный массив записей
касательно куска кода if FileList = '' then FileList := '*.*';
как-то странно работало, те если мы указываем '' , то извлекаться должно все, но каталоги и файлы в них не извлекались, поэтому справил:
Код:

    if FileList[0] <> '' then
    for i := 0 to GetArrayLength(FileList)-1 do
    begin
        s7cmd := s7cmd + ' -i';
        if RecurseFolders then s7cmd := s7cmd + 'r';
        s7cmd := s7cmd + '!"' + RemoveQuotes(FileList[i]) + '"';
    end;

а теперь о неприятном:
с тех пор как добавил "Отмену" (еще до внесения мной изменений) часто вылетает ошибка без выделения строки в дебаггере "Out Of Range"
Я не знаю как исправить :(. Прошу помочь (хочу весь свой инсталл перевести на внешние архивы 7зип), а невозможность отменить распаковку от 4 до 16 гигив (в зависимости от выбора "компонентов") - это жесть :)

И ещё просьба!
есть вывод ei.dwFileSize, ei.dwWriteSize
их ведь можно использовать для вывода второго прогрессбара, на котором будет отображаться прогресс распаковки текущего файла
было бы здорово реализовать. В общем прошу помочь мне и в этом.
Всё это мне не к спеху :)
вот модифицированный код:
Код:

;El Sanchez, Реализовал callback. Мусор удален. Работает на ANSI/Unicode (Restools).

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

[Files]
Source: 7-zip32.dll; Flags: ignoreversion dontcopy nocompression solidbreak sortfilesbyextension

[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
    // codes returned by SevenZipCreateArchive and SevenZipExtractArchive
    SZ_OK = 0;
    SZ_ERROR = 1;
    SZ_CANCELLED = 2;
    SZ_DLLERROR = 3;

    FNAME_MAX32 = 512;

    // these get returned as nState in the Callback function
    ARCEXTRACT_BEGIN = 0;
    ARCEXTRACT_INPROCESS = 1;
    ARCEXTRACT_END = 2;
    ARCEXTRACT_OPEN = 3;
    ARCEXTRACT_COPY = 4;

    // Errors
    ERROR_START = $8000;

    // WARNING
    ERROR_DISK_SPACE = $8005;
    ERROR_READ_ONLY = $8006;
    ERROR_USER_SKIP = $8007;
    ERROR_UNKNOWN_TYPE = $8008;
    ERROR_METHOD = $8009;
    ERROR_PASSWORD_FILE = $800A;
    ERROR_VERSION = $800B;
    ERROR_FILE_CRC = $800C;
    ERROR_FILE_OPEN = $800D;
    ERROR_MORE_FRESH = $800E;
    ERROR_NOT_EXIST = $800F;
    ERROR_ALREADY_EXIST = $8010;
    ERROR_TOO_MANY_FILES  = $8011;

    // ERROR
    ERROR_MAKEDIRECTORY = $8012;
    ERROR_CANNOT_WRITE = $8013;
    ERROR_HUFFMAN_CODE = $8014;
    ERROR_COMMENT_HEADER = $8015;
    ERROR_HEADER_CRC = $8016;
    ERROR_HEADER_BROKEN = $8017;
    ERROR_ARC_FILE_OPEN = $8018;
    ERROR_NOT_ARC_FILE = $8019;
    ERROR_CANNOT_READ  = $801A;
    ERROR_FILE_STYLE = $801B;
    ERROR_COMMAND_NAME = $801C;
    ERROR_MORE_HEAP_MEMORY = $801D;
    ERROR_ENOUGH_MEMORY = $801E;
    ERROR_ALREADY_RUNNING = $801F;
    ERROR_USER_CANCEL = $8020;
    ERROR_HARC_ISNOT_OPENED = $8021;
    ERROR_NOT_SEARCH_MODE = $8022;
    ERROR_NOT_SUPPORT = $8023;
    ERROR_TIME_STAMP = $8024;
    ERROR_TMP_OPEN = $8025;
    ERROR_LONG_FILE_NAME = $8026;
    ERROR_ARC_READ_ONLY = $8027;
    ERROR_SAME_NAME_FILE = $8028;
    ERROR_NOT_FIND_ARC_FILE = $8029;
    ERROR_RESPONSE_READ = $802A;
    ERROR_NOT_FILENAME = $802B;
    ERROR_TMP_COPY = $802C;
    ERROR_EOF = $802D;
    ERROR_ADD_TO_LARC = $802E;
    ERROR_TMP_BACK_SPACE = $802F;
    ERROR_SHARING = $8030;
    ERROR_NOT_FIND_FILE = $8031;
    ERROR_LOG_FILE = $8032;
    ERROR_NO_DEVICE = $8033;
    ERROR_GET_ATTRIBUTES = $8034;
    ERROR_SET_ATTRIBUTES = $8035;
    ERROR_GET_INFORMATION = $8036;
    ERROR_GET_POINT = $8037;
    ERROR_SET_POINT = $8038;
    ERROR_CONVERT_TIME = $8039;
    ERROR_GET_TIME = $803A;
    ERROR_SET_TIME = $803B;
    ERROR_CLOSE_FILE = $803C;
    ERROR_HEAP_MEMORY = $803D;
    ERROR_HANDLE = $803E;
    ERROR_TIME_STAMP_RANGE = $803F;
    ERROR_MAKE_ARCHIVE = $8040;
    ERROR_NOT_CONFIRM_NAME = $8041;
    ERROR_UNEXPECTED_EOF = $8042;
    ERROR_INVALID_END_MARK = $8043;
    ERROR_INVOLVED_LZH = $8044;
    ERROR_NO_END_MARK = $8045;
    ERROR_HDR_INVALID_SIZE = $8046;
    ERROR_UNKNOWN_LEVEL = $8047;
    ERROR_BROKEN_DATA = $8048;
    ERROR_7ZIP_START = $8100;
    ERROR_WARNING = $8101;
    ERROR_FATAL = $8102;
    ERROR_DURING_DECOMPRESSION = $8103;
    ERROR_DIR_FILE_WITH_64BIT_SIZE = $8104;
    ERROR_FILE_CHANGED_DURING_OPERATION = $8105;

    FA_RDONLY = $01;
    FA_HIDDEN = $02;
    FA_SYSTEM = $04;
    FA_LABEL = $08;
    FA_DIREC = $10;
    FA_ARCH = $20;
    FA_ENCRYPTED = $40;

    ARCHIVETYPE_ZIP = 1;
    ARCHIVETYPE_7Z = 2;

    WM_USER = $400;
    PBM_SETPOS = (WM_USER + 2);


type
    HARC = Longint;

    INDIVIDUALINFO = record
        dwOriginalSize: DWORD;                              // Size of file.
        dwCompressedSize: DWORD;                            // Size after the compressing.
        dwCRC: DWORD;                                      // For checksum CRC of file.
        uFlag: UINT;                                        // With 7-zip32.dll always 0.
        uOSType: UINT;                                      // OS which was used the occasion where the file is housed. Under present conditions always 0.
        wRatio: WORD;                                      // Permill (thousand minute ratio) with the bulk compressibility which is displayed. In case of solid book room always 0.
        wDate: WORD;                                        // Renewal date of file (DOS type).
        wTime: WORD;                                        // Renewal time of file (DOS type).
        szFileName: array [0..FNAME_MAX32] of Byte;        // Archive file name.
        dummy1: array [0..2] of Byte;
        szAttribute: array [0..7] of Byte;                  // Attribute of file.
        szMode: array [0..7] of Byte;                      // With 7-zip32.dll the character string of compressed system houses.
    end;

    EXTRACTINGINFO = record
        dwFileSize: DWORD;                                  // Size of all the housing files. When entire size 0xFFFFFFFF (-1) it is above, 0xFFFFFFFF (-1) it houses.
        dwWriteSize: DWORD;                                // The entire size which processed with compression thawing processing. When dwFileSize 0xFFFFFFFF (-1) is, entire processing ratio (permill) it houses.
        szSourceFileName: array [0..FNAME_MAX32] of Byte;  // The housing file name which processes.
        dummy1: array [0..2] of Byte;
        szDestFileName: array [0..FNAME_MAX32] of Byte;    // The path name which actually is written.
        dummy: array [0..2] of Byte;
    end;

    EXTRACTINGINFOEX = record
        exinfo: EXTRACTINGINFO;                            //The EXTRACTINGINFO structure is housed.
        dwCompressedSize: DWORD;                            //Compressed size of housing file. When compressed size 0xFFFFFFFF (-1) it is above, 0xFFFFFFFF (-1) it houses.
        dwCRC: DWORD;                                      //Checksum of housing file.
        uOSType: UINT;                                      //OS which was used the occasion where the file is housed. Under present conditions always 0.
        wRatio: WORD;                                      //Permill (thousand minute ratio) with the bulk compressibility which is displayed. In case of solid book room always 0.
        wDate: WORD;                                        //Renewal date of housing file (DOS type).
        wTime: WORD;                                        //Renewal time of housing file (DOS type).
        szAttribute: array [0..7] of Byte;                  //Attribute of housing file.
        szMode: array [0..7] of Byte;                      //With 7-zip32.dll the character string of compressed system houses.
    end;

    EXTRACTINGINFOEX32 = record
        dwStructSize: DWORD;                                //Size of structure.
        exinfo: EXTRACTINGINFO;                            //The EXTRACTINGINFO structure is housed. It just is left because of compatibility
        dwFileSize: DWORD;                                  //Size of all the housing files. When entire size 0xFFFFFFFF (-1) it is above, 0xFFFFFFFF (-1) it houses.
        dwCompressedSize: DWORD;                            //Compressed size of housing file. When compressed size 0xFFFFFFFF (-1) it is above, 0xFFFFFFFF (-1) it houses.
        dwWriteSize: DWORD;                                //The entire size which processed with compression thawing processing. When dwFileSize 0xFFFFFFFF (-1) is, entire processing ratio (permill) it houses.
        dwAttributes: DWORD;                                //Attribute of housing file.
        dwCRC: DWORD;                                      //Checksum of housing file.
        uOSType: UINT;                                      //OS which was used the occasion where the file is housed. Under present conditions always 0.
        wRatio: WORD;                                      //Permill (thousand minute ratio) with the bulk compressibility which is displayed. In case of solid book room always 0.
        ftCreateTime: TFileTime;                            //Compilation day and time of the file due to FILETIME type.
        ftAccessTime: TFileTime;                            //Reference day and time of the file due to FILETIME type.
        ftWriteTime: TFileTime;                            //Renewal day and time of the file due to FILETIME type.
        szMode: array [0..7] of Byte;                      //With 7-zip32.dll the character string of compressed system houses.
        szSourceFileName: array [0..FNAME_MAX32] of Byte;  //The housing file name which processes.
        dummy1: array [0..2] of Byte;
        szDestFileName: array [0..FNAME_MAX32] of Byte;    //The path name which actually is written.
        dummy2: array [0..2] of Byte;
    end;

    EXTRACTINGINFOEX64 = record
        dwStructSize: DWORD;                                //Size of structure
        exinfo: EXTRACTINGINFO;                            //The EXTRACTINGINFO structure is housed. It just is left because of compatibility.
        llFileSize: Extended;                              //Size of all the housing files.
        llCompressedSize: Extended;                        //Compressed size of housing file.
        llWriteSize: Extended;                              //The entire size which processed with compression thawing processing.
        dwAttributes: DWORD;                                //Attribute of housing file.
        dwCRC: DWORD;                                      //Checksum of housing file.
        uOSType: UINT;                                      //OS which was used the occasion where the file is housed. Under present conditions always 0.
        wRatio: WORD;                                      //Permill (thousand minute ratio) with the bulk compressibility which is displayed. In case of solid book room always 0.
        ftCreateTime: TFileTime;                            //Compilation day and time of the file due to FILETIME type.
        ftAccessTime: TFileTime;                            //Reference day and time of the file due to FILETIME type.
        ftWriteTime: TFileTime;                            //Renewal day and time of the file due to FILETIME type.
        szMode: array [0..7] of Byte;                      //With 7-zip32.dll the character string of compressed system houses.
        szSourceFileName: array [0..FNAME_MAX32] of Byte;  //The housing file name which processes.
        dummy1: array [0..2] of Byte;
        szDestFileName: array [0..FNAME_MAX32] of Byte;    //The path name which actually is written.
        dummy2: array [0..2] of Byte;
    end;

    // Callback func should return FALSE to cancel the archiving process, else TRUE
    ARCHIVERPROC = function(_hwnd: HWND; _uMsg: UINT; _nState: UINT; _lpEis: Longint): BOOL;

function SevenZip(const _hwnd: HWND; _szCmdLine: PAnsiChar; _szOutput: AnsiString; const _dwSize: DWORD): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
function SevenZipGetVersion(): WORD; external 'SevenZipGetVersion@files:7-zip32.dll stdcall';
function SevenZipGetCursorMode(): BOOL; external 'SevenZipGetCursorMode@files:7-zip32.dll stdcall';
function SevenZipSetCursorMode(const _CursorMode: BOOL ): BOOL; external 'SevenZipSetCursorMode@files:7-zip32.dll stdcall';
//function SevenZipGetBackgroundMode(): BOOL; external 'SevenZipGetBackgroundMode@files:7-zip32.dll stdcall';
//function SevenZipSetBackgroundMode(const _BackGroundMode: BOOL): BOOL; external 'SevenZipSetBackgroundMode@files:7-zip32.dll stdcall';
function SevenZipGetCursorInterval(): WORD; external 'SevenZipGetCursorInterval@files:7-zip32.dll stdcall';
function SevenZipSetCursorInterval(const _CursorInterval: WORD): BOOL; external 'SevenZipSetCursorInterval@files:7-zip32.dll stdcall';
function SevenZipGetRunning(): BOOL; external 'SevenZipGetRunning@files:7-zip32.dll stdcall';
function SevenZipConfigDialog(const _hwnd: HWND; _szOptionBuffer: AnsiString; const _iMode: Integer): BOOL; external 'SevenZipConfigDialog@files:7-zip32.dll stdcall';
function SevenZipCheckArchive(_szFileName: PAnsiChar; const _iMode: Integer): BOOL; external 'SevenZipCheckArchive@files:7-zip32.dll stdcall';
function SevenZipGetArchiveType(_szFileName: PAnsiChar): Integer; external 'SevenZipGetArchiveType@files:7-zip32.dll stdcall';
function SevenZipGetFileCount(_szArcFile: PAnsiChar): Integer; external 'SevenZipGetFileCount@files:7-zip32.dll stdcall';
function SevenZipQueryFunctionList(const _iFunction: Integer): BOOL; external 'SevenZipQueryFunctionList@files:7-zip32.dll stdcall';
function SevenZipOpenArchive(const _hwnd: HWND; _szFileName: PAnsiChar; const _dwMode: DWORD): HARC; external 'SevenZipOpenArchive@files:7-zip32.dll stdcall';
function SevenZipCloseArchive(_harc: HARC): Integer; external 'SevenZipCloseArchive@files:7-zip32.dll stdcall';
function SevenZipFindFirst(_harc: HARC; _szWildName: PAnsiChar; var _lpSubInfo: INDIVIDUALINFO): Integer; external 'SevenZipFindFirst@files:7-zip32.dll stdcall';
function SevenZipFindNext(_harc: HARC; var _lpSubInfo: INDIVIDUALINFO): Integer; external 'SevenZipFindNext@files:7-zip32.dll stdcall';
function SevenZipGetArcFileName(_harc: HARC; _lpBuffer: PAnsiChar; _nSize: Integer): Integer; external 'SevenZipGetArcFileName@files:7-zip32.dll stdcall';
function SevenZipGetArcFileSize(_harc: HARC): DWORD; external 'SevenZipGetArcFileSize@files:7-zip32.dll stdcall';
function SevenZipGetArcOriginalSize(_harc: HARC): DWORD; external 'SevenZipGetArcOriginalSize@files:7-zip32.dll stdcall';
function SevenZipGetArcCompressedSize(_harc: HARC): DWORD; external 'SevenZipGetArcCompressedSize@files:7-zip32.dll stdcall';
function SevenZipGetArcRatio(_harc: HARC): WORD; external 'SevenZipGetArcRatio@files:7-zip32.dll stdcall';
function SevenZipGetArcDate(_harc: HARC): WORD; external 'SevenZipGetArcDate@files:7-zip32.dll stdcall';
function SevenZipGetArcTime(_harc: HARC): WORD; external 'SevenZipGetArcTime@files:7-zip32.dll stdcall';
function SevenZipGetArcOSType(_harc: HARC): UINT; external 'SevenZipGetArcOSType@files:7-zip32.dll stdcall';
function SevenZipIsSFXFile(_harc: HARC): Integer; external 'SevenZipIsSFXFile@files:7-zip32.dll stdcall';
function SevenZipGetFileName(_harc: HARC; _lpBuffer: PAnsiChar; _nSize: Integer): Integer; external 'SevenZipGetFileName@files:7-zip32.dll stdcall';
function SevenZipGetOriginalSize(_harc: HARC): DWORD; external 'SevenZipGetOriginalSize@files:7-zip32.dll stdcall';
function SevenZipGetCompressedSize(_harc: HARC): DWORD; external 'SevenZipGetCompressedSize@files:7-zip32.dll stdcall';
function SevenZipGetRatio(_harc: HARC): WORD; external 'SevenZipGetRatio@files:7-zip32.dll stdcall';
function SevenZipGetDate(_harc: HARC): WORD; external 'SevenZipGetDate@files:7-zip32.dll stdcall';
function SevenZipGetTime(_harc: HARC): WORD; external 'SevenZipGetTime@files:7-zip32.dll stdcall';
function SevenZipGetCRC(_harc: HARC): DWORD; external 'SevenZipGetCRC@files:7-zip32.dll stdcall';
function SevenZipGetAttribute(_harc: HARC): Integer; external 'SevenZipGetAttribute@files:7-zip32.dll stdcall';
function SevenZipGetOSType(_harc: HARC): UINT; external 'SevenZipGetOSType@files:7-zip32.dll stdcall';
function SevenZipGetMethod(_harc: HARC; _lpBuffer: AnsiString; const _nSize: Integer): Integer; external 'SevenZipGetMethod@files:7-zip32.dll stdcall';
function SevenZipGetWriteTime(_harc: HARC): DWORD; external 'SevenZipGetWriteTime@files:7-zip32.dll stdcall';
function SevenZipGetWriteTimeEx(_harc: HARC; var _lpftLastWriteTime: TFileTime): BOOL; external 'SevenZipGetWriteTimeEx@files:7-zip32.dll stdcall';
function SevenZipGetArcCreateTimeEx(_harc: HARC; var _lpftCreationTime: TFileTime): BOOL; external 'SevenZipGetArcCreateTimeEx@files:7-zip32.dll stdcall';
function SevenZipGetArcAccessTimeEx(_harc: HARC; var _lpftLastAccessTime: TFileTime): BOOL; external 'SevenZipGetArcAccessTimeEx@files:7-zip32.dll stdcall';
function SevenZipGetArcWriteTimeEx(_harc: HARC; var _lpftLastWriteTime: TFileTime): BOOL; external 'SevenZipGetArcWriteTimeEx@files:7-zip32.dll stdcall';
function SevenZipSetOwnerWindow(_hwnd: HWND): BOOL; external 'SevenZipSetOwnerWindow@files:7-zip32.dll stdcall';
function SevenZipClearOwnerWindow(): BOOL; external 'SevenZipClearOwnerWindow@files:7-zip32.dll stdcall';
function SevenZipSetOwnerWindowEx(_hwnd: HWND; _lpArcProc: Longint): BOOL; external 'SevenZipSetOwnerWindowEx@files:7-zip32.dll stdcall';
function SevenZipKillOwnerWindowEx(_hwnd: HWND): BOOL; external 'SevenZipKillOwnerWindowEx@files:7-zip32.dll stdcall';
function SevenZipSetOwnerWindowEx64(_hwnd: HWND; _lpArcProc: Longint; _dwStructSize: DWORD): BOOL; external 'SevenZipSetOwnerWindowEx64@files:7-zip32.dll stdcall';
function SevenZipKillOwnerWindowEx64(_hwnd: HWND): BOOL; external 'SevenZipKillOwnerWindowEx@files:7-zip32.dll stdcall';
function SevenZipGetSubVersion(): WORD; external 'SevenZipKillOwnerWindowEx64@files:7-zip32.dll stdcall';
function SevenZipGetArcFileSizeEx(_harc: HARC; var _lpllSize: Extended): BOOL; external 'SevenZipGetArcFileSizeEx@files:7-zip32.dll stdcall';
function SevenZipGetArcOriginalSizeEx(_harc: HARC; var _lpllSize: Extended): BOOL; external 'SevenZipGetArcOriginalSizeEx@files:7-zip32.dll stdcall';
function SevenZipGetArcCompressedSizeEx(_harc: HARC; var _lpllSize: Extended): BOOL; external 'SevenZipGetArcCompressedSizeEx@files:7-zip32.dll stdcall';
function SevenZipGetOriginalSizeEx(_harc: HARC; var _lpllSize: Extended): BOOL; external 'SevenZipGetOriginalSizeEx@files:7-zip32.dll stdcall';
function SevenZipGetCompressedSizeEx(_harc: HARC; var _lpllSize: Extended): BOOL; external 'SevenZipGetCompressedSizeEx@files:7-zip32.dll stdcall';
function SevenZipSetUnicodeMode(_bUnicode: BOOL): BOOL; external 'SevenZipSetUnicodeMode@files:7-zip32.dll stdcall';
//
function RtlMoveMemory(var Destination: EXTRACTINGINFO; const Source: Longint; len: Integer): Integer; external 'RtlMoveMemory@kernel32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';


var
    szStatus: TNewStaticText;
    ei: EXTRACTINGINFO;
    ProgressPage: TOutputProgressWizardPage;
    hProgress, hMsg1Label, hMsg2Label: HWND;
    Cancel: boolean;

function ByteArrayToString(cArray: array of Byte): String;
begin
    Result := '';
    while cArray[Length(Result)] <> 0 do Insert(Chr(cArray[Length(Result)]), Result, Length(Result)+1);
end;

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
    except end;
end;

function ArchiverCallbackProc(_hwnd: HWND; _uMsg, _nState: UINT; _lpEis: Longint): BOOL;
var
    dwCurrentSize: Single;
begin
    Result := True;
    case _nState of
        ARCEXTRACT_BEGIN: SetWindowText(hMsg1Label, 'Status: scanning');
        ARCEXTRACT_INPROCESS:
        begin
          // if Cancel then Exit;
            RtlMoveMemory(ei, _lpEis, SizeOf(ei));
            dwCurrentSize := ei.dwWriteSize;
            PostMessage(hProgress, PBM_SETPOS, Round(65535*(dwCurrentSize/ei.dwFileSize)), 0);
            SetWindowText(hMsg1Label, 'Status: compressing');
            SetWindowText(hMsg2Label, FormatFloat('Progress: 0.#0 %', (dwCurrentSize*100)/ei.dwFileSize));
            SetWindowText(_hwnd, 'File: ' + ByteArrayToString(ei.szSourceFileName) + #13#10 +
            'Total size: ' + BytesToSize(ei.dwFileSize) + #13#10 +
            'Current size: ' + BytesToSize(ei.dwWriteSize));
            Result := not Cancel;
        end;
        ARCEXTRACT_END: Result := False;
        ARCEXTRACT_OPEN: SetWindowText(hMsg1Label, 'Status: open archive');
    end;
end;

procedure Cancel7ZipWork(Sender: TObject);
begin
    Cancel := True;
end;

/////////////////////
procedure CreateSevenZipProgressPage;
begin
    ProgressPage := CreateOutputProgressPage('7-zip', '');
    szStatus := TNewStaticText.Create(ProgressPage);
    with szStatus do
    begin
        Parent := ProgressPage.Surface;
        WordWrap := True;
        SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(30), ProgressPage.Surface.Width, ScaleY(300));
    end;
    with TButton.Create(nil) do
    begin
        Parent := ProgressPage.Surface;
        Caption := 'Cancel';
        SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(90), ScaleX(75), ScaleY(25));
        OnClick := @Cancel7ZipWork;
    end;
end;


//////////////////////////////////////////////////////
function SevenZipCreateArchive(hWnd: HWND; ArchiveFilename, BaseDirectory, FileList : String; CompressionLevel: Integer; CreateSolidArchive: Boolean; RecurseFolders: Boolean; Password, Sfx: String; ShowProgress: Boolean; Callback: Longint): Integer;
var
    flist : TStringList;
    S7ResultOutput, s7cmd, cwd: AnsiString;
    i: Integer;
begin
    Result := SZ_ERROR;
    if not SetCurrentDir(BaseDirectory) then Exit;
    //
    cwd := GetCurrentDir;
    flist := TStringList.Create;
    flist.CommaText := FileList;
    if Callback <> 0 then ShowProgress := False;
    try
        s7cmd := 'a "' + ArchiveFilename + '" "' + RemoveQuotes(flist.Strings[0]) + '"';
        for i := 1 to flist.Count - 1 do
        begin
            s7cmd := s7cmd + ' -i';
            if RecurseFolders then s7cmd := s7cmd + 'r';
            s7cmd := s7cmd + '!"' + RemoveQuotes(flist.Strings[i]) + '"';
        end;
        s7cmd := s7cmd + ' -mx' + IntToStr(CompressionLevel);
        if RecurseFolders then s7Cmd := s7cmd + ' -r';
        if Password <> '' then s7Cmd := s7Cmd + ' -p' + Password;
        if CreateSolidArchive then s7cmd := s7cmd + ' -ms=on' else s7cmd := s7cmd + ' -ms=off';
        if not ShowProgress then s7cmd := s7cmd + ' -hide';
        if Length(Sfx) > 0 then s7cmd := s7cmd + ' -sfx' + Sfx;
        try
            s7ResultOutput := StringOfChar(#0, 10240);
            if Callback <> 0 then
            begin
                //get handles for 7-zip callback thread
                hProgress := ProgressPage.ProgressBar.Handle;
                hMsg1Label := ProgressPage.Msg1Label.Handle;
                hMsg2Label := ProgressPage.Msg2Label.Handle;
                //show progress page
                ProgressPage.Show;
                ProgressPage.ProgressBar.Show;
                ProgressPage.Description := 'Compress';
                //set callback
                SevenZipSetOwnerWindowEx(hWnd, Callback);
            end;
            Result := SevenZip(hWnd, s7cmd, s7ResultOutput, Length(s7ResultOutput)-1);
        finally
            if Callback <> 0 then
            begin
                ProgressPage.Hide;
                SevenZipKillOwnerWindowEx(hWnd);
            end;
            //MsgBox(S7ResultOutput, mbInformation, MB_OK);
        except
            Result := SZ_DLLERROR;
        end;
    finally
        flist.Free;
        SetCurrentDir(cwd);
    end;
end;

//////////////////////////////////////////////////////
function SevenZipExtractArchive(hWnd: HWND; ArchiveFilename: String; FileList: TArrayOfString;
RecurseFolders: Boolean; OverwriteExistingFiles: Boolean; Password: String; ExtractFullPaths: Boolean; ExtractBaseDir: String; ShowProgress: Boolean; Callback: Longint): Integer;
var
    S7ResultOutput, s7cmd: AnsiString;
    i: Integer;
begin
    Result := SZ_ERROR;
    if not FileExists(ArchiveFilename) then Exit;
    //
    //if FileList[0] = '' then FileList[0] := '*.*';
    if Callback <> 0 then ShowProgress := False;
    if ExtractFullPaths then s7cmd := 'x' else s7cmd := 'e';
    s7cmd := s7cmd + ' "' + ArchiveFilename + '" -o"' + ExtractBaseDir + '"';
  // s7cmd := s7cmd + ' "' + FileList[0] + '"';
    //
    if FileList[0] <> '' then
    for i := 0 to GetArrayLength(FileList)-1 do
    begin
        s7cmd := s7cmd + ' -i';
        if RecurseFolders then s7cmd := s7cmd + 'r';
        s7cmd := s7cmd + '!"' + RemoveQuotes(FileList[i]) + '"';
    end;
    //
    if RecurseFolders then s7cmd := s7cmd + ' -r';
    if Password <> '' then s7Cmd := s7Cmd + ' -p' + Password;
    if OverwriteExistingFiles then s7cmd := s7cmd + ' -aoa' else s7cmd := s7cmd + ' -aos';
    if not ShowProgress then s7cmd := s7cmd + ' -hide';
    s7cmd := s7cmd + ' -y';
    try
        s7ResultOutput := StringOfChar(#0, 10240);
        if Callback <> 0 then
        begin
            //get handles for 7-zip callback thread
            hProgress := ProgressPage.ProgressBar.Handle;
            hMsg1Label := ProgressPage.Msg1Label.Handle;
            hMsg2Label := ProgressPage.Msg2Label.Handle;
            //show progress page
            ProgressPage.Show;
            ProgressPage.ProgressBar.Show;
            ProgressPage.Description := 'Extract';
            //set callback
            SevenZipSetOwnerWindowEx(hWnd, Callback);
        end;
        Result := SevenZip(hWnd, s7cmd, S7ResultOutput, Length(s7ResultOutput)-1);
    finally
        if Callback <> 0 then
        begin
            ProgressPage.Hide;
            SevenZipKillOwnerWindowEx(hWnd);
        end;
        //MsgBox(S7ResultOutput, mbInformation, MB_OK);
    except
        Result := SZ_DLLERROR;
    end;
end;

procedure InitializeWizard();
begin
    Cancel := True;
    CreateSevenZipProgressPage;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
    if CurPageID = wpWelcome then
    begin
        Cancel := False;
        // compress with callback
        //SevenZipCreateArchive(szStatus.Handle, 'C:\123.7z', 'c:\setup\se15', 'counter-strike.gcf', 1, True, False, '', '', False, CallbackAddr('ArchiverCallbackProc'));
        // compress without callback
        //SevenZipCreateArchive(szStatus.Handle, 'd:\123.7z', 'd:\', 'SkypeSetupFull.exe', 1, True, False, '', '', True, 0);
                                                                                       
        // extract with callback
        SevenZipExtractArchive(szStatus.Handle, 'C:\hl1.VALVE', ['half-life high definition.gcf', 'se15\counter-strike.gcf'], False, True, '', True, 'c:\setup', False, CallbackAddr('ArchiverCallbackProc'));
        // extract with callback
        //SevenZipExtractArchive(szStatus.Handle, 'd:\123.7z', '', False, '', True, 'c:\', True, 0);
        Result := True;
    end;
end;


insombia 31-10-2012 21:36 2016061

как в isdone сделать разбивку на тома?

Gnom_aka_Lexander 01-11-2012 15:36 2016541

insombia, как человек вроде-бы уже опытный, мог-бы и знать, что библиотека isdone не предназначена ни для сжатия, ни для разбития на тома. Она используется исключительно для распаковки архивов, упакованных внешними архиваторами, не более. И там есть функция, которая выводит диалог запроса следующего диска, если ты об этом. Один из параметров этой функции - любой файл, который должен лежать на запрошеном диске, и если этот файл уже есть в наличии, то соответственно, запроса следующего диска не будет, ввиду отсутствия таковой необходимости.
Хотя, чего сильно распинаться? Вместе с этой библиотекой распространяется справка, в которой все ее функции удивительно подробно и понятно расписаны.

El Sanchez 01-11-2012 18:07 2016682

Цитата:

Цитата Johny777
с тех пор как добавил "Отмену" (еще до внесения мной изменений) часто вылетает ошибка без выделения строки в дебаггере "Out Of Range" »

Johny777, ты уверен, что массив FileList существует и в нем есть хотя бы 1 элемент?
Так нельзя:
Код:

if FileList[0] = '' then FileList[0] := '*.*';
...
if FileList[0] <> '' then
    for i := 0 to GetArrayLength(FileList)-1 do

Нужно:
Код:

if GetArrayLength(FileList) = 0 then
begin
  SetArrayLength(FileList, 1);
  FileList[0] := '*.*';
end;
...
if GetArrayLength(FileList) > 0 then
    for i := 1 to GetArrayLength(FileList)-1 do

Цитата:

Цитата Gnom_aka_Lexander
библиотека isdone не предназначена ни для сжатия, ни для разбития на тома »

Gnom_aka_Lexander, хоть буду знать для чего она.

insombia 01-11-2012 18:08 2016683

Gnom_aka_Lexander да я уже нашел,просто забыл удалить сообщение,но все равно спс

Johny777 01-11-2012 21:12 2016809

El Sanchez, спасибо за правку! я понял своё косячище
теперь ошибка не вылезает! :)
вот только с этой строкой ( for i := 1 to GetArrayLength(FileList)-1 do ... ) попытаться извлечь 2 файла из архива ['half-life high definition.gcf', 'se15\counter-strike.gcf'], то извлечётся только второй фаил
'se15\counter-strike.gcf' с индексом 1,
поэтому ( for i := 0 to GetArrayLength(FileList)-1 do ... ) приводит к нужному результату
======
с FileList[0] := '*.*' извлекаются только файлы лежащие в корне архива. Те, напимер, 'se15\counter-strike.gcf' не распакуется
получается если массив пустой то делать вообще ничего не надо (в смысле никакие параметры архиватору не нужны)
только если не пустой нужен код:
Код:

    if GetArrayLength(FileList) > 0 then
    for i := 0 to GetArrayLength(FileList)-1 do
    begin
        s7cmd := s7cmd + ' -i';
        if RecurseFolders then s7cmd := s7cmd + 'r';
        s7cmd := s7cmd + '!"' + RemoveQuotes(FileList[i]) + '"';
    end;

вывод:
извлекаем все файлы с подкаталогами. Те реально всё - SevenZipExtractArchive(szStatus.Handle, 'C:\hl1.VALVE', [], False, True, '', True, 'c:\setup', False, CallbackAddr('ArchiverCallbackProc'));
извлекаем нужные файлы : SevenZipExtractArchive(szStatus.Handle, 'C:\hl1.VALVE', ['half-life high definition.gcf', 'se15\counter-strike.gcf'], False, True, '', True, 'c:\setup', False, CallbackAddr('ArchiverCallbackProc'));

Проверено. Работает. :)
хотя прошу желающих на всякий случай потестить
вот тестовый архив: http://sendfile.su/700617
========
функция целиком:
читать дальше »
Код:

function SevenZipExtractArchive(hWnd: HWND; ArchiveFilename: String; FileList: TArrayOfString;
RecurseFolders: Boolean; OverwriteExistingFiles: Boolean; Password: String; ExtractFullPaths: Boolean; ExtractBaseDir: String; ShowProgress: Boolean; Callback: Longint): Integer;
var
    S7ResultOutput, s7cmd: AnsiString;
    i: Integer;
begin
    Result := SZ_ERROR;
    if not FileExists(ArchiveFilename) then Exit;
    //
    //if FileList[0] = '' then FileList[0] := '*.*';
    if Callback <> 0 then ShowProgress := False;
    if ExtractFullPaths then s7cmd := 'x' else s7cmd := 'e';
    s7cmd := s7cmd + ' "' + ArchiveFilename + '" -o"' + ExtractBaseDir + '"';
  // s7cmd := s7cmd + ' "' + FileList[0] + '"';
    //
//    if GetArrayLength(FileList) = 0 then
//    begin
//        SetArrayLength(FileList, 1);
//        MsgBox('0',mbError, MB_OK);
//        FileList[0] := '*.*';
//    end;
    if GetArrayLength(FileList) > 0 then
    for i := 0 to GetArrayLength(FileList)-1 do
    begin
        s7cmd := s7cmd + ' -i';
        if RecurseFolders then s7cmd := s7cmd + 'r';
        s7cmd := s7cmd + '!"' + RemoveQuotes(FileList[i]) + '"';
    end;
    //
    if RecurseFolders then s7cmd := s7cmd + ' -r';
    if Password <> '' then s7Cmd := s7Cmd + ' -p' + Password;
    if OverwriteExistingFiles then s7cmd := s7cmd + ' -aoa' else s7cmd := s7cmd + ' -aos';
    if not ShowProgress then s7cmd := s7cmd + ' -hide';
    s7cmd := s7cmd + ' -y';
    try
        s7ResultOutput := StringOfChar(#0, 10240);
        if Callback <> 0 then
        begin
            //get handles for 7-zip callback thread
            hProgress := ProgressPage.ProgressBar.Handle;
            hMsg1Label := ProgressPage.Msg1Label.Handle;
            hMsg2Label := ProgressPage.Msg2Label.Handle;
            //show progress page
            ProgressPage.Show;
            ProgressPage.ProgressBar.Show;
            ProgressPage.Description := 'Extract';
            //set callback
            SevenZipSetOwnerWindowEx(hWnd, Callback);
        end;
        Result := SevenZip(hWnd, s7cmd, S7ResultOutput, Length(s7ResultOutput)-1);
    finally
        if Callback <> 0 then
        begin
            ProgressPage.Hide;
            SevenZipKillOwnerWindowEx(hWnd);
        end;
        //MsgBox(S7ResultOutput, mbInformation, MB_OK);
    except
        Result := SZ_DLLERROR;
    end;
end;



PS:
блин
возможности у кода суперские
любой параметр ком.строки можно загнать в функцию (при необходимости настраивать через входные параметры)
и ещё куча функций (типа SevenZipGetArchiveType или SevenZipCheckArchive)

hl1.VALVE есть 7зип архив(не sfx). я только поменял расширение "7z" на имя всем известной конторы (для понта)

El Sanchez 01-11-2012 22:44 2016874

Цитата:

Цитата Johny777
вот только с этой строкой ( for i := 1 to GetArrayLength(FileList)-1 do ... ) попытаться извлечь 2 файла из архива ['half-life high definition.gcf', 'se15\counter-strike.gcf'], то извлечётся только второй фаил »

Johny777, ну, дык, первый файл должен (хотя и не обязательно) в комстроке писаться без параметра -i. Извлечение первого файла описано в строке s7cmd := s7cmd + ' "' + FileList[0] + '"', следующие файлы идут через цикл через параметр -i, поэтому цикл начинается со второго элемента (for i=1...). Но параметр -i можно применить и к первому извлекаемому файлу, это не ошибка, поэтому вот эту часть можно выбросить, да и не нужно маску указывать, если извлекаются все файлы:
Цитата:

Цитата Johny777
// if GetArrayLength(FileList) = 0 then
// begin
// SetArrayLength(FileList, 1);
// MsgBox('0',mbError, MB_OK);
// FileList[0] := '*.*';
// end; »

...и оставить, как ты предложил
Код:

    if GetArrayLength(FileList) > 0 then
    for i := 0 to GetArrayLength(FileList)-1 do
    begin
        s7cmd := s7cmd + ' -i';
        if RecurseFolders then s7cmd := s7cmd + 'r';
        s7cmd := s7cmd + '!"' + RemoveQuotes(FileList[i]) + '"';
    end;


Johny777 03-11-2012 20:26 2018024

El Sanchez, если в пути есть русские символы, то 7зип архив не извлекается. Можно ли это исправить?

R.i.m.s.k.y. 03-11-2012 20:32 2018032

Johny777, комстрока? возможна проблема в кодировке, установщик работает с системной СР1251, а комстрока с ДОС кодировкой СР866

R.i.m.s.k.y. 03-11-2012 21:11 2018064

Johny777, вот уж не думал что тебя, камрад, придется отправлять в шапку темы
Твой случай function AnsiToDos

R.i.m.s.k.y. 03-11-2012 21:32 2018077

Johny777, дык одмин одмину друг, товарисч и мануал! :)
кстати даже если прогу поставить корректно в путь с пробелами и русскими буквами то не факт что она будет работать - тот же самый косяк может оказаться внутри проги
Формат 8.3 жив и здоров (8 символов на имя, 3 на расширение, толькр 10 цифр и 26 англ букв)

R.i.m.s.k.y. 03-11-2012 22:06 2018105

Johny777, знаю - ругаиццо

insombia 04-11-2012 16:27 2018594

все кто ставит мои репаки на win 7 64x игры не пашут,может со скриптом что-то? http://rghost.ru/41339323

R.i.m.s.k.y. 04-11-2012 17:17 2018635

insombia, а ошибка то какая что не пашут?

insombia 04-11-2012 17:52 2018656

R.i.m.s.k.y. говорят ошибки при распаковки,или игра по просту не запускается

R.i.m.s.k.y. 04-11-2012 17:59 2018662

insombia,

Игра не запускается скорее всего потому что записи реестра и/или файлы в sys/appdata/localuser/etc не туда складываются. Несколько страниц назад El Sanchez отлично расписал как в х64/х86 нужно прописывать. Листани поищи
Надеюсь ты всегда используешь относительные, а не абсолютные пути?

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

insombia 04-11-2012 18:07 2018672

R.i.m.s.k.y. у игр которые я паковал вообще нету реестра

R.i.m.s.k.y. 04-11-2012 18:11 2018675

Цитата:

Цитата insombia
у игр вообще нету реестра »

ога, а потом патчи на репаки не ставятся
У меня под рукой ведьмак
Код:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\CD Projekt Red\The Witcher]
"IsDjinniInstalled"=dword:00000001
"RegionVersion"="RU"
"Language"="14"
"InstallFolder"="R:\\WitcherEE"

Без этого ключа в меню нет букв и патч 1,5 игру не найдет
Реестра у игр нет, дадад

Регшоть и аккуратно импортируй

insombia 04-11-2012 18:22 2018686

R.i.m.s.k.y. я для sleeping dogs что-то не могу найти ветки реестра

Nightwishh 08-11-2012 03:55 2021288

Доброго времени суток! Небольшой вопросик! как сделать так что-бы музыка при запуске инталла начинала проигрываться несразу, а через секунд 4-6 после запуска инсталека? ( Использую обычный скрипт с кнопками в формате .bmp)!

Johny777 08-11-2012 22:53 2021885

Nightwishh,
Цитата:

Цитата Nightwishh
Использую обычный скрипт с кнопками в формате .bmp »

ни о чём не говорит. Приучись пожалуйста выкладывать код (на музыку в твоём случае) с файлами(библиотеки, картинки и пр.)
концепт реализации через таймер:
читать дальше »
Код:

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


[code]
var
  SoundTimer: LongWord;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure PlaySound;
begin
  KillTimer(WizardForm.Handle, SoundTimer); // убиваем таймер, ведь он уже не нужен

  WizardForm.Color := clGreen;  // заместо этой строки код запуска проигрывания звука
end;

procedure InitializeWizard;
begin

  SoundTimer := SetTimer(WizardForm.Handle, 5, 4000, CallbackAddr('PlaySound')); // в конце процедуры запускаем таймер. Интервал его обновления 4000 мс = 4 с
end;

procedure DeinitializeSetup();
begin
  KillTimer(WizardForm.Handle, SoundTimer); // если пользователь вышел из инсталла менее чем за 4 секунды после его запуска
end;


Nightwishh 08-11-2012 23:40 2021920

Johny777, Вот этот скрипт:
читать дальше »

[Setup]
AppName=Example.Play.MP3.Music.On.Start.Up.With.Texture
AppVerName=Example.Play.MP3.Music.On.Start.Up.With.Texture
AppPublisher=genri.sampron.iTASmania_Inc.uncle
DefaultDirName=C:\Play.MP3
OutputBaseFilename=play.mp3.by.genri.sampron.iTASmania_Inc.uncle
OutputDir=.


[Files]
Source: BASS.dll; DestDir: {tmp}; Flags: dontcopy noencryption
Source: sound.mp3; DestDir: {tmp}; Flags: dontcopy noencryption nocompression
Source: MusicButton.bmp; DestDir: {tmp}; Flags: dontcopy


[code]
const
BASS_ACTIVE_STOPPED = 0;
BASS_ACTIVE_PLAYING = 1;
BASS_ACTIVE_STALLED = 2;
BASS_ACTIVE_PAUSED = 3;
BASS_SAMPLE_LOOP = 4;

var
mp3Handle: HWND;
mp3Name: String;
PlayButton, PauseButton, StopButton: TPanel;
PlayImage, PauseImage, StopImage: TBitmapImage;
PlayLabel, PauseLabel, StopLabel: TLabel;
MouseLabel: Tlabel;

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): DWORD;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function BASS_ChannelIsActive(handle: DWORD): Integer;
external 'BASS_ChannelIsActive@files:BASS.dll stdcall delayload';

function BASS_ChannelPause(handle: DWORD): Boolean;
external 'BASS_ChannelPause@files:BASS.dll stdcall delayload';

function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

function BASS_Pause(): Boolean;
external 'BASS_Pause@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';

procedure PlayMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PlayImage.Left := -96
end;

procedure PlayMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PlayImage.Left := 0
end;

procedure PlayMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if PlayImage.Left <> -96 then PlayImage.Left := -192
StopImage.Left := -64
end;

procedure PauseMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PauseImage.Left := -128
end;

procedure PauseMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PauseImage.Left := -32
end;

procedure PauseMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if PauseImage.Left <> -128 then PauseImage.Left := -224
StopImage.Left := -64
end;

procedure StopMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StopImage.Left := -160
end;

procedure StopMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StopImage.Left := -64
end;

procedure StopMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if StopImage.Left <> -160 then StopImage.Left := -256
PlayImage.Left := 0
PauseImage.Left := -32
end;

procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
PlayImage.Left := 0
PauseImage.Left := -32
StopImage.Left := -64
end;

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('sound.mp3');
mp3Name := ExpandConstant('{tmp}\sound.mp3');
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
Result := True;
end;

procedure PlayButtonOnClick(Sender: TObject);
begin
case BASS_ChannelIsActive(mp3Handle) of
BASS_ACTIVE_PAUSED:
begin
BASS_ChannelPlay(mp3Handle, False);
PlayButton.Hide
PauseButton.Show
end;
BASS_ACTIVE_STOPPED:
begin
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
PlayButton.Hide
PauseButton.Show
end;
end;
end;

procedure PauseButtonOnClick(Sender: TObject);
begin
BASS_ChannelPause(mp3Handle);
PauseButton.Hide
PlayButton.Show
end;

procedure StopButtonOnClick(Sender: TObject);
begin
BASS_Stop();
BASS_Free();
PauseButton.Hide
PlayButton.Show
end;

procedure InitializeWizard();
begin
ExtractTemporaryFile('MusicButton.bmp')

MouseLabel := TLabel.Create(WizardForm)
MouseLabel.Width := WizardForm.Width
MouseLabel.Height := WizardForm.Height
MouseLabel.Autosize := False
MouseLabel.Transparent := True
MouseLabel.OnMouseMove := @MouseMove
MouseLabel.Parent := WizardForm

PlayButton := TPanel.Create(WizardForm)
PlayButton.Left := 50
PlayButton.Top := 320
PlayButton.Width := 32
PlayButton.Height := 33
PlayButton.Cursor := crHand
PlayButton.ShowHint := True
PlayButton.Hint := 'Воспроизведение музыки'
PlayButton.OnClick := @PlayButtonOnClick
PlayButton.Parent := WizardForm

PlayImage := TBitmapImage.Create(WizardForm)
PlayImage.Left := 0
PlayImage.Top := 0
PlayImage.Width := 288
PlayImage.Height := 33
PlayImage.Enabled := False
PlayImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
PlayImage.Parent := PlayButton
//
PlayImage.ReplaceColor:=$E2E2E2
PlayImage.ReplaceWithColor:=clBtnFace


PlayLabel := TLabel.Create(WizardForm)
PlayLabel.Width := PlayButton.Width
PlayLabel.Height := PlayButton.Height
PlayLabel.Autosize := False
PlayLabel.Transparent := True
PlayLabel.OnClick := @PlayButtonOnClick
PlayLabel.OnMouseDown := @PlayMouseDown
PlayLabel.OnMouseUp := @PlayMouseUp
PlayLabel.OnMouseMove := @PlayMouseMove
PlayLabel.Parent := PlayButton

PauseButton := TPanel.Create(WizardForm)
PauseButton.Left := 50
PauseButton.Top := 320
PauseButton.Width := 32
PauseButton.Height := 33
PauseButton.Cursor := crHand
PauseButton.ShowHint := True
PauseButton.Hint := 'Приостановить музыку'
PauseButton.OnClick := @PauseButtonOnClick
PauseButton.Parent := WizardForm

PauseImage := TBitmapImage.Create(WizardForm)
PauseImage.Left := -32
PauseImage.Top := 0
PauseImage.Width := 288
PauseImage.Height := 33
PauseImage.Enabled := False
PauseImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
PauseImage.Parent := PauseButton
//
PauseImage.ReplaceColor:=$E2E2E2
PauseImage.ReplaceWithColor:=clBtnFace

PauseLabel := TLabel.Create(WizardForm)
PauseLabel.Width := PauseButton.Width
PauseLabel.Height := PauseButton.Height
PauseLabel.Autosize := False
PauseLabel.Transparent := True
PauseLabel.OnClick := @PauseButtonOnClick
PauseLabel.OnMouseDown := @PauseMouseDown
PauseLabel.OnMouseUp := @PauseMouseUp
PauseLabel.OnMouseMove := @PauseMouseMove
PauseLabel.Parent := PauseButton

StopButton := TPanel.Create(WizardForm)
StopButton.Left := 82
StopButton.Top := 320
StopButton.Width := 32
StopButton.Height := 33
StopButton.Cursor := crHand
StopButton.ShowHint := True
StopButton.Hint := 'Остановить музыку'
StopButton.OnClick := @StopButtonOnClick
StopButton.Parent := WizardForm

StopImage := TBitmapImage.Create(WizardForm)
StopImage.Left := -64
StopImage.Top := 0
StopImage.Width := 288
StopImage.Height := 33
StopImage.Enabled := False
StopImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
StopImage.Parent := StopButton
//
StopImage.ReplaceColor:=$E2E2E2
StopImage.ReplaceWithColor:=clBtnFace

StopLabel := TLabel.Create(WizardForm)
StopLabel.Width := StopButton.Width
StopLabel.Height := StopButton.Height
StopLabel.Autosize := False
StopLabel.Transparent := True
StopLabel.OnClick := @StopButtonOnClick
StopLabel.OnMouseDown := @StopMouseDown
StopLabel.OnMouseUp := @StopMouseUp
StopLabel.OnMouseMove := @StopMouseMove
StopLabel.Parent := StopButton
end;

procedure DeinitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;

Johny777 09-11-2012 00:45 2021956

Nightwishh, ну переносишь кусок кода:
Код:

ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('sound.mp3');
mp3Name := ExpandConstant('{tmp}\sound.mp3');
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);

из function InitializeSetup(): Boolean; в procedure PlaySound; и получаешь
Код:

procedure PlaySound;
begin
  KillTimer(WizardForm.Handle, SoundTimer); // убиваем таймер, ведь он уже не нужен

  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('sound.mp3');
  mp3Name := ExpandConstant('{tmp}\sound.mp3');
  BASS_Init(-1, 44100, 0, 0, 0);
  mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
  BASS_Start();
  BASS_ChannelPlay(mp3Handle, False);
end;

функцию function InitializeSetup(): Boolean; у себя в коде полностью удали

PS: без отступов код читать тяжело. Убирай в [code] твои код [/code] иначе они слетают, если были

Nightwishh 09-11-2012 01:16 2021970

Ок. Спасибо!

elChoopacabra 09-11-2012 18:21 2022478

Уважаемые, помогите пожалуйста осилить задачу.
При выборе определённого компонента:
1. запустить (до копирования файлов) сторонний (дополнительный) инсталлятор из {tmp} с заданными ключами установки.
2. удалить в {app} определённые папки ("мусорные", которые установит инсталлятор из пункта 1).
3. выполнить копирование (установку) файлов уже посредством основного inno-инсталлятора

Заранее спасибо.

Nightwishh 09-11-2012 19:21 2022497

Помогите подалуйста объединить 2 срипта:
Код:

const
  BASS_ACTIVE_PLAYING = 1;
  BASS_ACTIVE_STALLED = 2;
  BASS_ACTIVE_PAUSED = 3;
  BASS_SAMPLE_LOOP = 4;

var
  SoundTimer: LongWord;
  mp3Handle: HWND;
  mp3Name: String;
  PlayButton: TPanel;
  PauseButton: TPanel;
  PlayImage: TBitmapImage;
  PauseImage: TBitmapImage;
  PlayLabel: TLabel;
  PauseLabel: TLabel;
  MouseLabel: Tlabel;

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): DWORD;
  external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

function BASS_Start(): Boolean;
  external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
  external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function BASS_ChannelIsActive(handle: DWORD): Integer;
  external 'BASS_ChannelIsActive@files:BASS.dll stdcall delayload';

function BASS_ChannelPause(handle: DWORD): Boolean;
  external 'BASS_ChannelPause@files:BASS.dll stdcall delayload';

function BASS_Pause(): Boolean;
  external 'BASS_Pause@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
  external 'BASS_Free@files:BASS.dll stdcall delayload';

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd, nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

procedure PlayMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PlayImage.Left := -64;
end;

procedure PlayMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PlayImage.Left := 0;
end;

procedure PlayMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if PlayImage.Left <> -64 then PlayImage.Left := -128;
end;

procedure PauseMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PauseImage.Left := -96;
end;

procedure PauseMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PauseImage.Left := -32;
end;

procedure PauseMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if PauseImage.Left <> -96 then PauseImage.Left := -160;
end;

procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  PlayImage.Left := 0;
  PauseImage.Left := -32;
end;

procedure PlaySound();
begin
  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('music.mp3');
  KillTimer(WizardForm.Handle, SoundTimer);
  mp3Name := ExpandConstant('{tmp}\music.mp3');
  BASS_Init(-1, 44100, 0, 0, 0);
  mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
  BASS_Start();
  BASS_ChannelPlay(mp3Handle, False);
end;

procedure PlayButtonOnClick(Sender: TObject);
begin
  case BASS_ChannelIsActive(mp3Handle) of
    BASS_ACTIVE_PAUSED:
      begin
        BASS_ChannelPlay(mp3Handle, False);
        PlayButton.Hide
        PauseButton.Show
      end;
  end;
end;

procedure PauseButtonOnClick(Sender: TObject);
begin
  BASS_ChannelPause(mp3Handle);
  PauseButton.Hide
  PlayButton.Show
end;

procedure InitializeWizard();
begin
  SoundTimer := SetTimer(WizardForm.Handle, 5, 8000, CallbackAddr('PlaySound'));
  ExtractTemporaryFile('MusicButton.bmp')

  { MouseLabel }
  MouseLabel := TLabel.Create(WizardForm);
  with MouseLabel do
  begin
    Width := WizardForm.Width;
    Height := WizardForm.Height;
    Autosize := False;
    Transparent := True;
    OnMouseMove := @MouseMove;
    Parent := WizardForm.MainPanel;
  end;

  { PlayButton }
  PlayButton := TPanel.Create(WizardForm);
  with PlayButton do
  begin
    Left := ScaleX(21);
    Top := ScaleY(544);
    Width := ScaleX(32);
    Height := ScaleY(47);
    Cursor := crHand;
    ShowHint := True;
    Hint := 'Воспроизведение музыки';
    OnClick := @PlayButtonOnClick;
    Parent := WizardForm.InnerPage;
  end;

  { PlayImage }
  PlayImage := TBitmapImage.Create(WizardForm);
  with PlayImage do
  begin
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(192);
    Height := ScaleX(47);
    Enabled := False;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'));
    Parent := PlayButton;
    ReplaceColor:=$E2E2E2;
    ReplaceWithColor:=clBtnFace;
  end;

  { PlayLabel }
  PlayLabel := TLabel.Create(WizardForm);
  with PlayLabel do
  begin
    Width := PlayButton.Width;
    Height := PlayButton.Height;
    Autosize := False;
    Transparent := True;
    OnClick := @PlayButtonOnClick;
    OnMouseDown := @PlayMouseDown;
    OnMouseUp := @PlayMouseUp;
    OnMouseMove := @PlayMouseMove;
    Parent := PlayButton;
  end;

  { PauseButton }
  PauseButton := TPanel.Create(WizardForm);
  with PauseButton do
  begin
    Left := ScaleX(21);
    Top := ScaleY(544);
    Width := ScaleX(32);
    Height := ScaleY(47);
    Cursor := crHand;
    ShowHint := True;
    Hint := 'Остановить музыку';
    OnClick := @PauseButtonOnClick;
    Parent := WizardForm.InnerPage;
  end;

  { PauseImage }
  PauseImage := TBitmapImage.Create(WizardForm);
  with PauseImage do
  begin
    Left := ScaleX(-32);
    Top := ScaleY(0);
    Width := ScaleX(192);
    Height := ScaleY(47);
    Enabled := False;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'));
    Parent := PauseButton;
    ReplaceColor:=$E2E2E2;
    ReplaceWithColor:=clBtnFace;
  end;

  { PauseLabel }
  PauseLabel := TLabel.Create(WizardForm);
    with PauseLabel do
    begin
    Width := PauseButton.Width;
    Height := PauseButton.Height;
    Autosize := False;
    Transparent := True;
    OnClick := @PauseButtonOnClick;
    OnMouseDown := @PauseMouseDown;
    OnMouseUp := @PauseMouseUp;
    OnMouseMove := @PauseMouseMove;
    Parent := PauseButton;
  end;
end;

procedure DeinitializeSetup();
begin
  BASS_Free();
end;

и
Код:

const
n=3; //количество слайдов
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TRandNumbers = array[1..N] of byte;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
  external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';

function get_unique_random_number(X:byte):TRandNumbers;
  var
    A,b,c: string;
    i,j,k:byte;
      begin
        For i:=1 to X do A:=A+chr(i);
          B:='';
          For i:=1 to X do
            begin
              j:=Random(Length(A)-1)+1;
              C:='';
              B:=B + A[j];
              for k:=1 to Length(A) do
              if k<>j then C:=C+A[k];
              A:=C;
            end;
          for i:=1 to X do Result[i]:=ord(B[i]);
end;

var
  TimerID: LongWord;
  currTime: Integer;
  SplashImage: TBitmapImage;
  bmp: TRandNumbers;
  z:byte;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
  currTime := currTime + 1;
  if (currTime mod {#TIME_FOR_VIEW} = 0)
  then begin
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[currTime/{#TIME_FOR_VIEW}])+'.bmp'));
  if (currTime/{#TIME_FOR_VIEW} = N) then currTime:=0;
  end;
end;

procedure InitializeWizard();
begin
  bmp:=get_unique_random_number(N);
  ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp');
  currTime := 0;

  { SplashImage }
  SplashImage := TBitmapImage.Create(WizardForm);
  with SplashImage do
  begin
    Top := ScaleY(0);
    Left := ScaleX(0);
    Width := WizardForm.MainPanel.Width;
    Height := WizardForm.Bevel.Top;
    Parent := WizardForm.InstallingPage;
    Stretch := True;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[1])+'.bmp'));
    end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
    WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
    for z:=2 to N do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp');
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
  begin
    if (CurPageID = wpInstalling) then
    begin
      pfunc := WrapTimerProc(@OnTimer, 5);
      TimerID := SetTimer(0, 0, 1000, pfunc);
    end else
  if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
  If CurPageID = wpFinished then
end;

procedure DeInitializeSetup();
begin
  KillTimer(0, TimerID);
end;

а именно меня волнуют 2 одинаковые функции:
Код:

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd, nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';
1- ый скрипт

Код:

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
  external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
  external 'KillTimer@user32.dll stdcall';
2- ой скрипт


alert30 09-11-2012 19:37 2022506

elChoopacabra, вроде никак, но где-то в репаков игр видел...

Nightwishh, Inno Setup Script Joiner

Nightwishh 09-11-2012 19:45 2022511

alert30, он не объединяет такие функции, я пробЫвал!

alert30 09-11-2012 19:52 2022516

Nightwishh, интересно, а у меня получилось. Держите.

Nightwishh 09-11-2012 20:01 2022525

alert30,
За проделанную спасибо, на нет...неполучится через него. Ошибка вылетает: Duplicat identifier "SETTIMER", ну а потом и "KillTimer". :)

alert30 09-11-2012 20:07 2022528

Nightwishh, ответ у меня большой и подробный. Но тут там тоже самое (вот только скобки влияют?), как InitializeWizard.

Johny777 09-11-2012 20:38 2022547

Nightwishh, модифицировал показ слайдов (рандомный), много удалил и заменил InnoCallback.dll на CallbackAddr
библиотека не нужна. Только картинки
читать дальше »
Код:

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

[Files]
Source: Image_1.bmp; Flags: dontcopy solidbreak sortfilesbyextension nocompression
Source: Image_2.bmp; Flags: dontcopy solidbreak sortfilesbyextension nocompression
Source: Image_3.bmp; Flags: dontcopy solidbreak sortfilesbyextension nocompression

Source: {fonts}\*; DestDir: {app}; Flags: external

[code]
const
  SlidesNumber=3; //количество слайдов
  SlideRenewTine=2; // задержка показа слаидов в секундах
 
var
  SplashImage: TBitmapImage;
  SlidesTimer: LongWord;
  Pic: Byte;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure ShowRandomPics;
begin
  Pic := Random(SlidesNumber);
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_' + IntToStr(Pic+1) + '.bmp'));
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  z: Byte;
begin
  case CurStep of
    ssInstall:
    begin
      { SplashImage }
      SplashImage := TBitmapImage.Create(nil);
      with SplashImage do
      begin
        SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.Bevel.Top)
        Parent := WizardForm.InstallingPage;
        Stretch := True;
        Pic := Random(SlidesNumber);
        ExtractTemporaryFile('Image_' + IntToStr(Pic+1) + '.bmp');
        Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_' + IntToStr(Pic+1) + '.bmp'));
      end;
      WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
      for z := 1 to SlidesNumber do if not FileExists(ExpandConstant('{tmp}\Image_' + IntToStr(z) + '.bmp')) then ExtractTemporaryFile('Image_'+inttostr(z)+'.bmp');
      SlidesTimer := SetTimer(WizardForm.Handle, 7, SlideRenewTine*1000, CallbackAddr('ShowRandomPics'));
    end;
   
    ssPostInstall:
    begin
      KillTimer(WizardForm.Handle, SlidesTimer);
      SplashImage.Free;
    end;
  end;
end;

procedure DeInitializeSetup();
begin
  KillTimer(WizardForm.Handle, SlidesTimer);
end;



Цитата:

Цитата Nightwishh
а именно меня волнуют 2 одинаковые функции »

и правильно волнуют. Достаточно записать по одному экземпляру заголовка

теперь тебе будет легче объединить 2 кода в ручную :)

El Sanchez 09-11-2012 21:23 2022581

Цитата:

Цитата elChoopacabra
При выборе определённого компонента:
1. запустить (до копирования файлов) сторонний (дополнительный) инсталлятор из {tmp} с заданными ключами установки.
2. удалить в {app} определённые папки ("мусорные", которые установит инсталлятор из пункта 1).
3. выполнить копирование (установку) файлов уже посредством основного inno-инсталлятора »

elChoopacabra, первые 2 пункта нужно делать на этапе ssInstall, как раз перед отработкой секции Run (3 пункт):
Код:

[Files]
Source: setup.exe; Flags: dontcopy nocompression; Components: mycomponent

[code]
procedure CurStepChanged(CurStep: TSetupStep);
var
    ResCode: Integer;
begin
    case CurStep of
        ssInstall: begin
            if IsComponentSelected('mycomponent') then
            begin
                ExtractTemporaryFile('setup.exe');
                if FileExists(ExpandConstant('{tmp}\setup.exe') then
                begin
                    Exec(ExpandConstant('{tmp}\setup.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResCode);
                    DelTree(ExpandConstant('{app}\MyFolder'), True, True, True);
                end;
            end;
        end;
    end;
end;

P.S. Дополнительный установщик может состоять из оболочки и основного установщика, например, связка InstallShield - Windows Installer. В таком случае возможен вариант, когда команда Exec вернет управление, дождавшись кода возврата от оболочки, а основной установщик еще только начал свою работу. Тогда и команде DelTree нечего будет удалять - мусор появится позже, когда отработает основной установщик. Поэтому рекомендую разобрать дополнительный установщик до его составляющих.


UPD
ой, опередили

Nightwishh 09-11-2012 22:22 2022616

Johny777,
Спасибо, всё работает, но есть одна пакость! Дело в том что у меня архивы фриарк, которые распаковываются перед inno (ssInstall), а
здесь слайды начинают работать после распаковки. Пробывал в скрипте исправлять в процедуре: procedure CurStepChanged(CurStep: TSetupStep); непомогает! :cry:

Johny777 09-11-2012 22:42 2022625

Nightwishh, ну помести код распаковки архивов после извлечения картинок и запуска таймера. Убиение таймера оставь где стоит. Те до этапа(ssPostInstall) где таймер убивается не дойдёт пока не выполнится код распаковки. А значит до тех пор он, таймер, будет с частотой 2сек. выполнять процедуру ShowRandomPics; Расценивай таймер не иначе как параллельный поток(процесс)
короче:
читать дальше »
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  z: Byte;
begin
  case CurStep of
    ssInstall:
    begin
      { SplashImage }
      SplashImage := TBitmapImage.Create(nil);
      with SplashImage do
      begin
        SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.Bevel.Top)
        Parent := WizardForm.InstallingPage;
        Stretch := True;
        Pic := Random(SlidesNumber);
        ExtractTemporaryFile('Image_' + IntToStr(Pic+1) + '.bmp');
        Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_' + IntToStr(Pic+1) + '.bmp'));
      end;
      WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
      for z := 1 to SlidesNumber do if not FileExists(ExpandConstant('{tmp}\Image_' + IntToStr(z) + '.bmp')) then ExtractTemporaryFile('Image_'+inttostr(z)+'.bmp');
      SlidesTimer := SetTimer(WizardForm.Handle, 7, SlideRenewTine*1000, CallbackAddr('ShowRandomPics'));

      /// здесь код распаковки архивов

    end;
   
    ssPostInstall:
    begin
      KillTimer(WizardForm.Handle, SlidesTimer);
      SplashImage.Free;
    end;
  end;
end;



===========================

Цитата:

Цитата El Sanchez
ой, опередили »

уже нет! :) У меня не хватало "if IsComponentSelected('mycomponent') then..."

Nightwishh 10-11-2012 00:22 2022664

Не... для меня сложно, накуралесю что-нить, тем более там скрипт ISDone 0.6, придётся убирать таймер из музыки и всё по старому делать, зря только вопросами грузил!

Johny777 10-11-2012 00:56 2022681

Nightwishh, вот скажи мне. Нафига тебе этот исдан. Почти все реапки какие вижу с ним. может дело и не в нём, но они по большей части глючные. Кто тебе по ушам настучал его использовать. Забей и всё будет нормално. я б не променял коды ваше на возможность сильнее сжать(и эта возможность под вопросом)

Nightwishh 10-11-2012 01:57 2022700

Johny777, да всё пока нормально, взял для слайдов другой скрипт, насчёт глюков ISDone- вроде норм с ним, спасибо за таймер для музыки и за скрипт слайшоу! :yes:

Mailchik 10-11-2012 12:48 2022805

Цитата:

Цитата Johny777
Нафига тебе этот исдан. Почти все реапки какие вижу с ним. может дело и не в нём, но они по большей части глючные. Кто тебе по ушам настучал его использовать.

Хм. Странно. Встречный вопрос, а кто настучал его не использовать? Баги присутствуют, куда же без них, хотя я ни одного не замечал за этой библиотекой. Очень удобная библиотека, я бы даже сказал нужная для репакера. Очень много нужных функций. Дак если есть такая библиотека, зачем придумывать велосипед, и собирать заново. Лично моё мнение.
Цитата:

Цитата R.i.m.s.k.y.
это какие нужные в ней функции?

Распаковка архивов созданных разными алгоритмами (precomp, srep, zip, xdelta + подключение конфиг файла, для распаковки внешними компрессорами), запуск сторонних exe, с плавным отображением прогрессбара.

R.i.m.s.k.y. 10-11-2012 12:55 2022810

Цитата:

Цитата Mailchik
Очень много нужных функций »

это какие нужные в ней функции?

Johny777 10-11-2012 15:28 2022874

Mailchik, использовать или не использовать исдан - личное решение каждого. Здесь на форуме видел людей, которые не зная возможностей инно, обходя их начинают пользоваться исданом. Оттого и мнение, что кто-то (форум, человек, репакер) прошелся по ушам и доверчивости новичка. Меня это печалит. Поэтому я не выдержав заявил Nightwishh-у чтоб он не зацикливался на методах этой библиотеки. Базара нет "Распаковка архивов созданных разными алгоритмами (precomp, srep, zip, xdelta + подключение конфиг файла, для распаковки внешними компрессорами), запуск сторонних exe, с плавным отображением прогрессбара." - несомненный плюс, но у медали две стороны
давай взвесим стороны:
начнём с того что времена, когда выгодно и удобно купить/скачать однослойную болванку с пятью играми на ней давно прошли(не для всех, но меньшинством я позволю себе пренебречь). Ожидания от современного репака(перепаковки):
- удобство проистекающее из ненадобности в ручную ставить патч, копировать правленные файлы, файлы локализации, настраивать ини файлы эмулятора для стим-игр и прочее
- качество. Те правильный и грамотный код, в котором:
1. Описаны все необходимые действия для правильной установки и удаления продукта
2. Сам инсатлл должен быть удобен по отношению к пользователю.
3. Время установки должно быть приемлемым
4. И самое главное - нужно уметь ценить ресурсы чужого компа!
Что мы получаем (говорю как бывший пользователь репаков):
1. Не все, но это ввиду того что "готовый" продукт можно получить обходя возможности инно через исдан сделало из будущего, без будущего, репакера обезьяну
2. Многое уделяется не удобству, а оформлению, хотя иногда оно из него и проистекает. Я сам фанат крутого оформления, но уважая чужое мнение не меньше своего, отдаю полуготовый продукт на тест и (внимание) на "общее впечатление" (там же и удобство) от продукта с будущим учётом пожеланий будущих пользователей. Не спрашивай примера. У меня пока один такой инсталл и он не доступен широкой общественности
3. Время установки не приемлемо, а без прекомпа возможности библиотеки аннулируются (+-500-300мб после фри арка можно пренебречь) кодом несколькими страницами назад и родным ужимателем инно
4. Дополнительное место на харде для распаковки и уйма оперативки - наглое отношение к пользователю, тк он не ценит ресурсы сколько бы их не было

Теперь о возможностях исдана- разнообразная распаковка. Вот и всё. О фагах секции файлов можно забыть. Ровно как и о функциях AfterInstall, BeforeInstall
запуск сторонних exe - может и инно.
Короче. Кто хочет пусть юзает исдан. Мне с этого момента пофиг. Я лишь буду указывать на альтернативные возможности или возможноти(которых в исдане нен) в инно :)

PS:
Цитата:

Цитата Mailchik
если есть такая библиотека, зачем придумывать велосипед, и собирать заново »

инно была раньше, так что ей и быть великом
а целесообразность исдана без прекомпа и сильного сжатия из которого проистекают некоторые из вышеописанных проблем(3, 4) я ставлю под большой вопрос

PSS:
ничего личного по отношению к автору библиотеки. Если он её придумал, значит было зачем

R.i.m.s.k.y. 10-11-2012 15:56 2022883

Цитата:

Цитата Mailchik
Распаковка архивов созданных разными алгоритмами (precomp, srep, zip, xdelta + подключение конфиг файла, для распаковки внешними компрессорами), запуск сторонних exe, с плавным отображением прогрессбара »

Очень "полезные" фишки для правильной установки софта и работоспособности установщика.

И вообще отвечать на пост ниже постом выше - моветон

Mailchik 10-11-2012 17:54 2022951

Johny777, Вы всё красиво расписали. Споры бессмысленны, так как я указал:
Цитата:

Цитата Mailchik
Лично моё мнение

Цитата:

Цитата R.i.m.s.k.y.
Очень "полезные" фишки для правильной установки софта и работоспособности установщика.

ваши мысли не могут являться единственно верными, я считаю по другому и высказал свою мысль.
Цитата:

И вообще отвечать на пост ниже постом выше - моветон
не хочется засорять форум.

Gnom_aka_Lexander 10-11-2012 18:24 2022969

к слову об установке приложений с помощью IsDone;
читать дальше »
Код:

#define NeedMem 512

#define records

[Setup]
AppName=SisMin
AppVerName=SisMin
OutputBaseFilename=SisMin
VersionInfoCopyright=ProFrager
SolidCompression=true
CreateAppDir=false
Compression=none
ShowLanguageDialog=no
LanguageDetectionMethod=locale
ShowComponentSizes=false
FlatComponentsList=false
UsePreviousTasks=false
ShowTasksTreeLines=true
ShowUndisplayableLanguages=true
Uninstallable=false
DisableProgramGroupPage=yes
UsePreviousGroup=false
AppendDefaultGroupName=false
AlwaysRestart=true

[CustomMessages]
otherGroup=Прочее:
pointDesc=Создать системную контрольную точку (рекомендуется)
pointMsg=Создание контрольной точки...

[Tasks]
Name: restorepoint; Description: {cm:pointDesc}; GroupDescription: {cm:otherGroup}; MinVersion: 0,5.1
[Types]
Name: full; Description: "Полная установка"; Flags: IsCustom;
Name: compact; Description: "Компактная установка";
Name: custom; Description: "Выборочная установка";

[Components]
Name: dllsfox; Description: Набор библиотек Visual Fox Pro 3, 5, 6, 7, 8 и 9 версий;Types: full;
Name: dllsfull; Description: Набор Runtime библиотек, необходимых для работы различных программ.;Types: full;
Name: DirectX; Description: Набор библиотек DirectX;Types: full;
Name: Java; Description: Расширенный набор Oracle Java.;Types: full;
Name: stdu; Description: Программа для просмотра, файлов DjVu, TIFF, PDF.; Types: full;
Name: msxml4; Description: MSXML 4 SP3 - обновленная версия XML-парсера; Types: full;
Name: Flash; Description: Adobe Flash Player ActiveX и Adobe Flash Player Plugin; Types: full;
Name: RuntimePack; Description: Расширенный набор библиотек Microsoft Visual C++; Types: full;
Name: dotNet; Description: Microsoft .NET Framework 3.5.1- 4.0 Full; Types: full;
Name: PhysX; Description: NVIDIA® PhysX®; Types: full;
Name: R262; Description: Аудиодрайвер Realtek.;Types: full;
Name: Lan; Description: Сетевой драйвер Realtek;Types: full;

[Files]
Source: Include\*; Flags: dontcopy
Source: exe\*; DestDir: {tmp}

#ifdef records
Source: records.inf; Flags: dontcopy
#endif


[CustomMessages]
russian.ExtractedFile=Устанавливается:
russian.Extracted=Установка системных компонентов...
russian.Error=Ошибка!
russian.ElapsedTime=Прошло:
russian.RemainingTime=Осталось времени:
russian.EstimatedTime=Всего:
russian.AllElapsedTime=Время установки:

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

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

[*Code]
const
  APPLICATION_INSTALL = 0;
  APPLICATION_UNINSTALL = 1;
  DEVICE_DRIVER_INSTALL = 10;
  MODIFY_SETTINGS = 12;
  CANCELLED_OPERATION = 13;
  BEGIN_SYSTEM_CHANGE = 100;
  END_SYSTEM_CHANGE = 101;
  BEGIN_NESTED_SYSTEM_CHANGE = 102;
  END_NESTED_SYSTEM_CHANGE = 103;

var
  LblPct, LblTime : array[0..1]of TLabel;
  ISDonePB : array[0..1]of TNewProgressBar;
  ISDoneCancel:integer;
  ISDoneError:boolean;

type
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

function SetRestorePoint(const PointName: string): Boolean;
var
  vObj, SR: Variant;
begin
  vObj := CreateOleObject('ScriptControl');
  vObj.Language := 'VBScript';
  SR := vObj.eval('GetObject("winmgmts:\\.\root\default:SystemRestore")');
  Result := SR.CreateRestorePoint(PointName, APPLICATION_INSTALL, BEGIN_SYSTEM_CHANGE) = 0;
end;

function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';
function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';

function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:string):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';
function GetModuleHandle(ModuleName:PAnsiChar):Cardinal; external 'GetModuleHandleA@kernel32.dll stdcall';
function FreeLibrary(Handle:cardinal):bool; external 'FreeLibrary@kernel32.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
  if OveralPct<=1000 then ISDonePB[0].Position := OveralPct;
  if CurrentPct<=1000 then ISDonePB[1].Position := CurrentPct;
 
  LblPct[0].Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
  LblPct[1].Caption := IntToStr(CurrentPct div 10)+'.'+chr(48 + CurrentPct mod 10)+'%';
 
  LblTime[0].Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
  LblTime[1].Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;

  WizardForm.FilenameLabel.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, WizardForm.FilenameLabel.Font, WizardForm.FilenameLabel.Width-ScaleX(100));
  Result := ISDoneCancel;
end;

procedure CreateControls;
var
  i : integer;
begin
  for i := 0 to 1 do
  begin
    ISDonePB[i] := TNewProgressBar.Create(WizardForm);
    with ISDonePB[i] do begin
      Parent  := WizardForm.InstallingPage;
      SetBounds(ScaleX(0), ScaleY(80+i*40), ScaleX(417), ScaleY(21));
      Max      := 1000;
    end;
    LblTime[i] := TLabel.Create(WizardForm);
    with LblTime[i] do begin
      Parent    := ISDonePB[i];
      Transparent := True;
      AutoSize  := False;
      SetBounds(ScaleX(5), ScaleY(3), ScaleX(412), ScaleY(14));
    end;
    LblPct[i] := TLabel.Create(WizardForm);
    with LblPct[i] do begin
      Parent    := ISDonePB[i];
      Transparent := True;
      Alignment := taRightJustify;
      AutoSize  := False;
      SetBounds(ScaleX(0), ScaleY(3), ScaleX(412), ScaleY(14));
    end;
  end;

  with WizardForm do
  begin
    StatusLabel.SetBounds(ScaleX(0), ScaleY(63), ScaleX(417), ScaleY(21));
    FilenameLabel.SetBounds(ScaleX(0), ScaleY(103), ScaleX(417), ScaleY(21));
    FilenameLabel.Show;
  end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  if (CurPageID = wpFinished) and ISDoneError then
  begin
    with WizardForm do
    begin
      Caption:= ExpandConstant('{cm:Error}');
      FinishedLabel.Font.Color:= clRed;
      FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
    end;
  end;
end;

function CheckError:boolean;
begin
  result:= not ISDoneError;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  msg: string;
  Comps1, Comps2, Comps3, TmpValue  :cardinal;
begin
  if CurStep = ssInstall then
  begin
    WizardForm.StatusLabel.SetBounds(ScaleX(0), ScaleY(27), ScaleX(417), ScaleY(21));
    WizardForm.FilenameLabel.Hide;
    if IsTaskSelected('restorepoint') then
    begin
      try
        msg := WizardForm.StatusLabel.Caption;
        WizardForm.StatusLabel.Caption := ExpandConstant('{cm:pointMsg}');
        WizardForm.Repaint;
        // создаём контрольную точку
        SetRestorePoint('Установка {#SetupSetting("AppName")}');
        WizardForm.StatusLabel.Caption := msg;
      finally
        SetLength(msg, 0);
      end;
    end;
  end;
  if CurStep = ssPostInstall then
  begin 
    #ifdef records
    ExtractTemporaryFile('records.inf');
    #endif
    Comps1:=0; Comps2:=0; Comps3:=0;
    TmpValue:=1;
    if IsComponentSelected('msxml4') then Comps1:=Comps1+TmpValue;    //компонент 1
    TmpValue:=TmpValue*2;
    if IsComponentSelected('dllsfox') then Comps1:=Comps1+TmpValue;    //компонент 2
    TmpValue:=TmpValue*2;
    if IsComponentSelected('dllsfull') then Comps1:=Comps1+TmpValue;    //компонент 3
    TmpValue:=TmpValue*2;
    if IsComponentSelected('Flash') then Comps1:=Comps1+TmpValue;    //компонент 4
    TmpValue:=TmpValue*2;
    if IsComponentSelected('Java') then Comps1:=Comps1+TmpValue;    //компонент 5
    TmpValue:=TmpValue*2;
    if IsComponentSelected('DirectX') then Comps1:=Comps1+TmpValue;    //компонент 6
    TmpValue:=TmpValue*2;
    if IsComponentSelected('RuntimePack') then Comps1:=Comps1+TmpValue;    //компонент 7
    TmpValue:=TmpValue*2;
    if IsComponentSelected('stdu') then Comps1:=Comps1+TmpValue;    //компонент 8
    TmpValue:=TmpValue*2;
    if IsComponentSelected('dotNet') then Comps1:=Comps1+TmpValue;    //компонент 9
    TmpValue:=TmpValue*2;
    if IsComponentSelected('PhysX') then Comps1:=Comps1+TmpValue;    //компонент 10
    TmpValue:=TmpValue*2;
    if IsComponentSelected('R262') then Comps1:=Comps1+TmpValue;    //компонент 11
    TmpValue:=TmpValue*2;
    if IsComponentSelected('Lan') then Comps1:=Comps1+TmpValue;    //компонент 12
    CreateControls;
    WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
    ISDoneCancel:=0;

    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then
    begin
      repeat
        if not ISExec          ( 1, 0, 0, ExpandConstant('{tmp}\dllsfox.exe'), ' -y -gm2 -fm0', ExpandConstant('{tmp}'), 'Набор DLL Visual Fox Pro',false) then break;
        if not ISExec          ( 2, 0, 0, ExpandConstant('{tmp}\dllsfull.exe'), ' -y -gm2 -fm0', ExpandConstant('{tmp}'), 'Набор Runtime  DLL',false) then break;
        if not ISExec          ( 3, 0, 0, ExpandConstant('{tmp}\DirectX.exe'), ' /S', ExpandConstant('{tmp}'), 'Набор библиотек DirectX',false) then break;
        if not ISExec          ( 4, 0, 0, ExpandConstant('{tmp}\Java.exe'), ' /S', ExpandConstant('{tmp}'), 'Расширенный набор Oracle Java',false) then break;
        if not ISExec          ( 5, 0, 0, ExpandConstant('{tmp}\stdu.exe'), ' /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-', ExpandConstant('{tmp}'), 'Программа для просмотра, файлов DjVu, TIFF, PDF',false) then break;
        if not ISExec          ( 6, 0, 0, ExpandConstant('{tmp}\msxml4.exe'),' /passive', ExpandConstant('{tmp}'), 'MSXML 4 SP3',false) then break;
        if not ISExec          ( 7, 0, 0, ExpandConstant('{tmp}\Flash.exe'),'', ExpandConstant('{tmp}'), 'Adobe Flash Player ActiveX и Adobe Flash Player Plugin',false) then break;
        if not ISExec          ( 8, 0, 0, ExpandConstant('{tmp}\VCRedist.exe'), ' /S', ExpandConstant('{tmp}'), 'Расширенный набор библиотек Microsoft Visual C++',false) then break;
        if not ISExec          ( 9, 0, 0, ExpandConstant('{tmp}\dotNet.exe'), ' -aiqlku', ExpandConstant('{tmp}'), 'Microsoft .NET Framework 3.5.1- 4.0 Full',false) then break;
        if not ISExec          ( 10, 0, 0, ExpandConstant('{tmp}\PhysX.exe'), ' /Q', ExpandConstant('{tmp}'), 'NVIDIA® PhysX®',false) then break;
        if not ISExec          ( 11, 0, 0, ExpandConstant('{tmp}\R262.exe'), '', ExpandConstant('{tmp}'), 'Аудиодрайвер Realtek',false) then break;
        if not ISExec          ( 12, 0, 0, ExpandConstant('{tmp}\Lan.exe'), '', ExpandConstant('{tmp}'), 'Сетевой драйвер Realtek',false) then break;

        ISDoneError:=false;
      until true;
      ISDoneStop;
    end;
  end;
end;

R.i.m.s.k.y., Johny777, а сколько кода (приплюсуем сюда тормоза, которые внесет виртуальная машина Inno) займет у Вас установка десятка приложений, с отображением установки каждого на отдельном прогрессбаре, и всех выбранных на общем?

Limonica 10-11-2012 18:29 2022972

Можно ли запустить готовый инсталлятор, в тихом режиме без параметра /VERYSILENT ?

Gnom_aka_Lexander 10-11-2012 18:33 2022975

Limonica, нельзя. но можно скрыть окно инсталла насовсем, без вариантов, в шапке видел пример.

R.i.m.s.k.y. 10-11-2012 18:35 2022976

Gnom_aka_Lexander, какая виртуальная машина Inno? первый раз про такую слышу
У меня есть подобие твоего примера, называется InstallAll, ставит в систему все от граблей до кораблей без участия человека (системные компоненты vcredistы, дирексы, фреймворки, тоталы/ворды и т.д), всего 20 компонентов для джентльменского набора.
Я вообще на заморачиваюсь на прогрессбар, все запускается оригинальными установщиками через AfterInstall или Run, в зависимости от порядка установки.
Ибо заморачиваться на прогрессбар в ущерб стабильности установщика считаю нецелесообразным.

Gnom_aka_Lexander 10-11-2012 18:47 2022985

Цитата:

Цитата R.i.m.s.k.y.
в ущерб стабильности установщика »

нестабильным его делают косорукие кулрепацкеры, совмещая несовместимое. в чистом дефолте библиотека полностью стабильна. С брызгами изо рта доказывать ничего не буду, смысла нет, и убедиться не проверив невозможно в принципе.
А насчет инно - уж тебе-ли не знать, в чем разница между средами(или как это правильно обозвать?) компилируемым и интерпретируемыми?

Johny777 10-11-2012 18:50 2022987

Цитата:

Цитата Mailchik
Споры бессмысленны »

я и не спорю. Лишь ответил на твой вопрос :)
Цитата:

Цитата Mailchik
Встречный вопрос, а кто настучал его не использовать? »

==========================================================================
Цитата:

Цитата Gnom_aka_Lexander
а сколько кода (приплюсуем сюда тормоза, которые внесет виртуальная машина Inno) займет у Вас установка десятка приложений »

12 строк = 12 вызовов функции Exec под каждый компонент (говорю на основе твоего кода-примера)
Цитата:

Цитата R.i.m.s.k.y.
Ибо заморачиваться на прогрессбар »

Цитата:

Цитата Gnom_aka_Lexander
с отображением установки каждого на отдельном прогрессбаре »

пардон уважаемые. О чём речь? Какой прогрессбар без циклов или таймеров может отобразить установку например Директ Икса?

Gnom_aka_Lexander 10-11-2012 18:58 2023001

Цитата:

Цитата Johny777
Какой прогрессбар без циклов или таймеров может отобразить установку например Директ Икса? »

функция, вызываемая из библиотеки, довольно точно воспроизводит прогресс на прогрессбаре инсталла. И там не таймеры с циклами, там потоки.
оффтоп завершил.

Nightwishh 10-11-2012 21:38 2023106

А можно что-бы при извлечении временных файлов в папку Temp показывался прогрессбар, т.е запускается инсталл, извлекаются файлы и в это время была полоска прогрессбара?
P.S. Файлы извлекаются через InitializeWizard, а у временных файлов убрано в секции [Files] кат. назначения: DestDir: {tmp}.

Gnom_aka_Lexander 10-11-2012 21:45 2023114

Цитата:

Цитата Nightwishh
кат. назначения: DestDir: {tmp}. »

DestDir: {tmp}работает при установке. причем, независимо от того, распаковал ты эти файлы уже или нет, посему, раз распаковываешь раньше, то стоит заменить на Flags : dontcopy;
прогрессбар - создаешь прогрессбар, на котором покажешь распаковку, задаешь свойству max - количество файлов, которые будешь распаковывать, и после распаковки каждого пишешь - твой прогрессбар.Position := твой прогрессбар.Position + 1 ;
Вуаля.

Tco 03 10-11-2012 21:49 2023118

Здравствуйте. Подскажите, пожалуйста, как в файл (например .ini) записать только значение (без секции "[]" и равно "=").

Gnom_aka_Lexander 10-11-2012 21:56 2023130

никак, секция неизбежно указывается. можно записать текстом, с помощью стринглиста:
Код:

procedure InitializeWizard();
var
  sr : TStringList;
begin
  sr := TStringList.Create; //создаем TStringList
  with sr do
  begin
    LoadFromFile('твой файл')  // грузим из файла, если файл пустой, то можно этого не делать
    Add('равно "="');  // строку, которую нужно записать
    SaveToFile('твой файл');    // сохраняем в файл(файл будет очищен
    Free;              // удаляем TStringList за ненадобностью
  end;
end;


woland0789 11-11-2012 11:58 2023367

Доброго времени суток, подскажите, где найти скрипт, который проверяет при удалении не запущена ли программа, и если да, то убивает этот процесс.

Gnom_aka_Lexander 11-11-2012 16:31 2023521

woland0789, Inno Setup начиная с версии 5.5.0 уже делает это сама.

R.i.m.s.k.y. 11-11-2012 16:59 2023541

Gnom_aka_Lexander, какой командой? просто у меня древний инно 5,3 какой-то

Gnom_aka_Lexander 11-11-2012 17:09 2023547

Цитата:

Цитата R.i.m.s.k.y.
какой командой? »

никакой, это поведение по умолчанию. единственное - в версии 5.5.1 на ХР не работало, может в 5.5.2 исправили? нет ХР под рукой, чтоб проверить.
если правильно понял, то при обнаружении процессов, работающих из папки установки/удаления, она выводит список процессов, которые мешают и предлагает их закрыть в необязательном порядке. В необязательном - можно выбрать не закрывать процессы и продолжить установку-удаление

Johny777 11-11-2012 19:41 2023654

ради интереса портировал отсюда http://delphiguru.xm6.ru/lessons/18-...na-delphi.html создание круглой формы. Кому надо забирайте! :)
читать дальше »
Код:

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

[code]
type
  HRGN = LongWord;
  HGDIOBJ = LongWord;
 
function GetWindowRgn(hWnd: HWND; hRgn: HRGN): Integer; external 'GetWindowRgn@user32.dll stdcall';
function DeleteObject(p1: HGDIOBJ): BOOL; external 'DeleteObject@gdi32.dll stdcall';
function CreateRoundRectRgn(X1, Y1, X2, Y2, X3, Y3: Integer): HRgn; external 'CreateRoundRectRgn@gdi32.dll stdcall';
function SetWindowRgn(hWnd: HWND; hRgn: HRGN; bRedraw: BOOL): Integer; external 'SetWindowRgn@user32.dll stdcall';

procedure InitializeWizard;
var
  FormRgn: hRgn;
begin
  WizardForm.Brush.Style := bsSolid; //bsclear;
  GetWindowRgn(WizardForm.Handle, FormRgn);
  DeleteObject(FormRgn);
  WizardForm.Height := 500;
  WizardForm.Width := WizardForm.Height;
  FormRgn := CreateRoundRectRgn(1, 1, WizardForm.Width - 1,WizardForm.height - 1, WizardForm.width, WizardForm.height);
  SetWindowRgn(WizardForm.Handle, FormRgn, TRUE);
end;


nik1967 11-11-2012 21:40 2023735

Johny777, на юникоде выдаёт ошибку ран тайм.
На анси компилится.

Gnom_aka_Lexander 11-11-2012 21:42 2023736

nik1967, с GDI всегда так, то на анси не хочет работать, то на юникоде...

SoulSide 11-11-2012 21:45 2023738

Цитата:

Цитата woland0789
Доброго времени суток, подскажите, где найти скрипт, который проверяет при удалении не запущена ли программа, и если да, то убивает этот процесс. »

Вот код
Код:

[Setup]
AppName=ISTask UnInstall
AppVersion=1.5
DefaultDirName={pf}\ISTask UnInstall
DefaultGroupName=ISTask UnInstall
OutputDir=.
OutputBaseFilename=setupuninstallkill

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

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion

[Code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';
function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  if RunTask('notepad.exe', False) then
    begin
      // прячем форму
      UninstallProgressForm.Visible:= False;
      if MsgBox('Программа Блокнот используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
        begin
          KillTask('notepad.exe');
          UnloadDll(ExpandConstant('{app}\ISTask.dll'));
          // показываем форму
          UninstallProgressForm.Visible:= True;
        end
      else
        begin
          MsgBox('Завершите работу Блокнот, затем снова запустите программу удаления.', mbInformation, MB_OK);
          UnloadDll(ExpandConstant('{app}\ISTask.dll'));
          Abort;
        end;
    end;
end;


Mailchik 11-11-2012 22:28 2023753

nik1967, компилится, но при запуске ошибка.
решение: закоментируйте WizardForm.Brush.Style := bsSolid;. работает, не знаю правильно или нет, так как на юникоде сижу.

nik1967 11-11-2012 23:03 2023772

Цитата:

Цитата Mailchik
компилится, но при запуске ошибка.»

Да, всё так. Неправильно выразился.

alexkush 12-11-2012 18:33 2024235

Устал читать... Просто спрошу.
Инсталлятор распаковывает некоторые файлы и после этого надо установить две софтинки (инсталятора) с ожиданием установки.
Как ?
Пробовал ExecAndWait.iss ни чего не выходит.
И можно ли установить с помощью Inno Setup шрифты?

Gnom_aka_Lexander 12-11-2012 22:10 2024420

Цитата:

Цитата Johny777
можно, читай »

Гораздо проще - flags : fontinstall; Этот флаг черт-те знает с какой версии есть. и никакой левой хрени не нужно, когда инно сама может сделать.

Mailchik 12-11-2012 22:25 2024426

Цитата:

Цитата Johny777
Как вариант можно нарисовать круг вручную
просто задать координаты круга
но что-то у меня функция CreatePolygonRgn не работает.
в оригинале она такая
function CreatePolygonRgn(const Points; Count, FillMode: Integer): HRGN; stdcall;
где Points это массив TPoint
короче массив координат x, y
заполнить массив можно функцией рисования круга из геометрии
таким макаром можно создавать формы любой формы

из вашего кода звезда получается)
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
type
  HRGN = LongWord;

const
  WINDING = $2;

function SetWindowRgn(hWnd: HWND; hRgn: HRGN; bRedraw: BOOL): Integer; external 'SetWindowRgn@user32.dll stdcall';
function CreatePolygonRgn(const Points: array of TPoint; Count, FillMode: Integer): HRGN; external 'CreatePolygonRgn@gdi32.dll stdcall';
function DeleteObject(hObject : HRGN): BOOL; external 'DeleteObject@gdi32.dll stdcall';

procedure InitializeWizard;
var
 ap: array of TPoint;
 r: hRGN;
begin
  with WizardForm do
  begin
    SetArrayLength(ap, 5);
    ap[0].x := Width div 2;
    ap[0].y := 0;

    ap[1].x := Width div 3 * 2;
    ap[1].y := Height;

    ap[2].x := 0;
    ap[2].y := Height div 3;

    ap[3].x := Width;
    ap[3].y := Height div 3

    ap[4].x := Width div 3;
    ap[4].y := Height;

    r := CreatePolygonRgn(ap, 5, WINDING);
    try
      SetWindowRgn(WizardForm.Handle, r, TRUE);
    finally
      DeleteObject(r);
    end;
  end;
end;

на юникоде тестил.

YURSHAT 13-11-2012 04:23 2024548

Цитата:

Цитата Johny777
юникодной инно не пользуюсь как исправить не знаю »

Скрипт
Код:

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

[Code_]
function CreateRoundRectRgn(p1, p2, p3, p4, p5, p6: Integer): THandle; external 'CreateRoundRectRgn@gdi32 stdcall';
function SetWindowRgn(hWnd: HWND; hRgn: THandle; bRedraw: Boolean): Integer; external 'SetWindowRgn@user32 stdcall';

procedure InitializeWizard;
var
  FormRegion: LongWord;
begin
  WizardForm.Height := WizardForm.Width;
 
  FormRegion := CreateRoundRectRgn(1, 1, WizardForm.Width - 1, WizardForm.Height - 1, WizardForm.Width, WizardForm.Height);
  SetWindowRgn(WizardForm.Handle, FormRegion, True);
end;


Gnom_aka_Lexander 13-11-2012 15:18 2024818

Цитата:

Цитата Mailchik
из вашего кода звезда получается) »

Дык, раскинь массив на координаты - там звезда и есть :)

ChVL 13-11-2012 23:54 2025196

Как прописать путь к папке System32 в Win 7 х64?
Любой способ записи через секцию [Files] приводит к тому, что файлы попадают в папку SysWOW64, а надо именно System32.

Johny777 14-11-2012 02:51 2025278

раньше под свои нужды использовал код ...\Inno Setup 5\Scripts\Dobrov\DisksInfoBox.iss
а именно:
читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
EnableDirDoesntExistWarning=true

[CustomMessages]
Ru.SysDirSelect=Выбранный путь включает в себя системную папку!%nВы уверены, что необходимо продолжать установку?

[Languages]
Name: Ru; MessagesFile: compiler:Languages\Russian.isl

[Icons]
Name: {group}\Notepad; Filename: notepad.exe

[code]
var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
        if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
                if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
                        if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
                                If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
                                        If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
                                                Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
        StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
        Begin        while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
        Begin
                if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
                else Result:= String;
        End;

Procedure GetDiskInfo(Disk: String);
        Begin
                FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
                        GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
                FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
        End;

Procedure ListBoxRefresh;        var FreeB, TotalB: Cardinal; Path, String: string; Begin
        ListBox.Items.Clear
for n:= 1 to 31 do        // диск 'А' пропустить
        if (GetLogicalDrives and (1 shl n)) > 0 then
                if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
                        if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
        Path:= Copy(ListBox.Items[n],1,2) +'\'                { если в накопителе нет диска, пропустить обновление }
        if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
                if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
                if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего| '+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
        ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
        ListBox:        for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
        StartMenuTreeView:        if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
        WizardForm.NoIconsCheck:        begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Function NextButtonClick(CurPageID: Integer): Boolean; Begin
        Result:= True
        if (CurPageID = wpSelectDir) and (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'), 'Установка в системную папку', MB_YESNO or $30) = idYes;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
        if CurPageID = wpSelectDir then ListBoxRefresh
End;

Procedure InitializeWizard;
Begin
        ListBox:= TListBox.Create(WizardForm)
                ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
                ListBox.Font.Size:= 9
                ListBox.Font.Style:= [fsBold]
                ListBox.Font.Name:= 'Courier New';
                ListBox.OnClick:= @ObjectOnClick;
                ListBox.Parent:= WizardForm.SelectDirPage;
        WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1, WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height)
                WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick
                WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage
                WizardForm.NoIconsCheck.Show
        StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm)
                StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
                StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height)
                StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage
                StartMenuTreeView.Cursor:= crHand
                StartMenuTreeView.OnChange:=@ObjectOnClick
End;


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

Добрые люди, у меня 3 просьбы:
1: Поздравить меня :)
2: Проверить код (да да как в школе училка проверяла) и по возможности исправить/улучшить
3: хоть оно мне и не нужно, но если получится исправить косяк с юникодной инно, то скрипт может пригодиться ещё кое-кому (хотя там при желании можно заюзать родной GetSpaceOnDisk)

вот ранняя версия (только заполнение листбокса):
читать дальше »
Код:

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

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
type
  PDWORD = DWORD;
 
const
  DRIVE_REMOVABLE = $2;
  DRIVE_FIXED = $3;
  DRIVE_REMOTE = $4;
  DRIVE_CDROM = $5;
  DRIVE_RAMDISK = $6;
  MAX_PATH = 260;
   
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName: String; lpVolumeNameBuffer: String; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetDiskFreeSpace(lpRootPathName: String; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; external 'GetDiskFreeSpace{#A}@kernel32.dll stdcall';
//function GetLogicalDriveStrings(nBufferLength: DWORD; lpBuffer: String): DWORD; external 'GetLogicalDriveStrings{#A}@kernel32.dll stdcall';


function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;

function GetDrivesInfo: array of string;
var
  i: Integer;
  UndefDriveLetter: String;
  DriveType: UINT;
  DriveSpecFullString: String;
  DrivePath: string;
  VolumeName, FileSystemName : string;
  ComponentLength, SerialNumber, FileSystemFlags: DWORD;
  Sec_Cluster, Bytes_Sec, Free_Clusters, Total_Clusters : DWORD;
begin
  for i := 65 to 90 do // Loop from A..Z to determine available drives
  begin
    UndefDriveLetter := chr(i) + ':\';
    DriveType := GetDriveType(UndefDriveLetter);
    case DriveType of
//      0: DriveSpecFullString := UndefDriveLetter + ' Тип накопителя не может быть определен.';
//      1: DriveSpecFullString := UndefDriveLetter + ' Корневая директория не существует.';
      DRIVE_REMOVABLE:
      begin
        VolumeName := StringOfChar(#32, MAX_PATH);
        FileSystemName := StringOfChar(#32, MAX_PATH);
        GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
        GetDiskFreeSpace(UndefDriveLetter, Sec_Cluster, Bytes_Sec, Free_Clusters, Total_Clusters);
        if Trim(VolumeName) = '' then VolumeName := 'Без имени';
        DriveSpecFullString :=
          'Внешний диск: ' + UndefDriveLetter + ' // ' +
          'Имя: ' + Trim(VolumeName) + ' // ' +
          'Файловая система: ' + Trim(FileSystemName) + ' // ' +
          'Общий размер: ' + BytesToSize(Bytes_Sec * Sec_Cluster * Total_Clusters) + ' // ' +
          'Доступно: ' + BytesToSize(Bytes_Sec * Sec_Cluster * Free_Clusters);
        SetArrayLength(Result, GetArrayLength(Result)+1);
        Result[GetArrayLength(Result)-1] := DriveSpecFullString;
      end;
      DRIVE_FIXED:                                         
      begin
        VolumeName := StringOfChar(#32, MAX_PATH);
        FileSystemName := StringOfChar(#32, MAX_PATH);
        GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
        GetDiskFreeSpace(UndefDriveLetter, Sec_Cluster, Bytes_Sec, Free_Clusters, Total_Clusters);
        if Trim(VolumeName) = '' then VolumeName := 'Без имени';
        DriveSpecFullString :=
          'Внутренний диск: ' + UndefDriveLetter + ' // ' +
          'Имя: ' + Trim(VolumeName) + ' // ' +
          'Файловая система: ' + Trim(FileSystemName) + ' // ' +
          'Общий размер: ' + BytesToSize(Bytes_Sec * Sec_Cluster * Total_Clusters) + ' // ' +
          'Доступно: ' + BytesToSize(Bytes_Sec * Sec_Cluster * Free_Clusters);
        SetArrayLength(Result, GetArrayLength(Result)+1);
        Result[GetArrayLength(Result)-1] := DriveSpecFullString;
      end;
//      DRIVE_REMOTE: DriveSpecFullString := UndefDriveLetter+ ' Удаленный (сетевой) диск: ';
//      DRIVE_CDROM: DriveSpecFullString := UndefDriveLetter + ' Устройство - CD-ROM: ';
//      DRIVE_RAMDISK: DriveSpecFullString := UndefDriveLetter + ' Устройство - RAM диск: ';
    end;
  end;
end;


procedure InitializeWizard;
var
  ReadyArray: array of string;
  DriveListBox: TListBox;
  i: Integer;
begin
  ReadyArray := GetDrivesInfo;
  WizardForm.OuterNotebook.Hide;
  WizardForm.Width := 600;
  DriveListBox := TListBox.Create(nil)
  with DriveListBox do
  begin
    Parent := WizardForm;
    SetBounds(0, 0, WizardForm.Width, WizardForm.Height - 100);
    for i := 0 to GetArrayLength(ReadyArray)-1 do Items.Add(ReadyArray[i]);
  end;
end;



PS: и меня смущает как я поступил с указателем
Код:


type
  PDWORD = DWORD;


Mailchik 14-11-2012 17:09 2025577

ChVL, так не пойдёт?
Код:

ExpandConstant('{win}\system32')

Gnom_aka_Lexander 14-11-2012 17:50 2025605

Johny777, CD-ром-то зачем? С сд-ромом, инно и сама довольно красиво с помощью драйвтривива в одну строчку делает. дополнительные ухищрения как раз были нужны, чтоб исключить его, поскольку попытка установить туда что-либо приводит как минимум к ошибке и является маразмом.
ByteOrTB - несколько месяцев назад уважаемый Serega давал гораздо более корректный код. примерно в тех-же краях есть решение проблемы с определением размеров. Правда там с файлами, но по сути своей любой элемент системы является файлом, так что решение наверняка неподалеку. И не нужно копи ровать манеру форматирования кода Виктора Доброва, читать невозможно, чесслово.

ChVL 14-11-2012 18:40 2025647

Mailchik,
А какую использовать функцию или процедуру?

Gnom_aka_Lexander 14-11-2012 18:45 2025649

ChVL, если секция файлов, то именно так и указывать : {win}\system32, Mailchik, дал пример для секции кода.
но есть у меня сомнения, что прокатит, правда мизерные - теоретически должно.

ChVL 14-11-2012 19:55 2025675

Gnom_aka_Lexander,
Понял. Это я пробовал, и даже начиная с С:\ не проходит.
Похоже, дохлый номер... На ru-board'e молчат. Задал вопрос на сайте inno в Newsgroups, вдруг кто-то знает - это уже последняя инстанция.
А жаль... Очень надо.

Gnom_aka_Lexander 14-11-2012 22:07 2025724

Я подозревал такое дело. от имени админа с путем {win}\system32 тоже никак?
Стандартные папки из шапки с флагом CSIDL_SYSTEM не пробовал?

El Sanchez 14-11-2012 22:42 2025741

Цитата:

Цитата ChVL
Как прописать путь к папке System32 в Win 7 х64?
Любой способ записи через секцию [Files] приводит к тому, что файлы попадают в папку SysWOW64, а надо именно System32. »

ChVL, нужно использовать флаг 64bit для отключения перенаправления.
Код:

[Files]
Source: file.txt; DestDir: {sys}; Flags: 64bit; Check: IsWin64


ChVL 14-11-2012 23:52 2025776

El Sanchez,
Yes-s!! Работает. Спасибо!
Дык, об этом флаге надо знать. Задача, видимо, достаточно редкая, раз о её решении мало кто знает.
Я уж пытался решить левым путём: скопировать из папки SysWOW64 в папку System32, так тоже перенаправляет.

Snoopak96 15-11-2012 08:42 2025866

ChVL,
Есть такая функция Wow64EnableWow64FsRedirection, отрубает всё перенапровленние в винде x64, но в неопытных руках она опасна, так что лучше юзай как предложил Эль Санчез :cool

RodionSabitov 15-11-2012 13:58 2026043

Ребята, простой вопрос:

в inno setup делаю инсталлятор с сохранением setup на жесткий диск. как сделать установочный диск DVD\CD с автозапуском?

Gnom_aka_Lexander 15-11-2012 14:08 2026050

RodionSabitov, autorun.inf

RodionSabitov 15-11-2012 14:41 2026074

Gnom_aka_Lexander, а в inno setup нет такой встроенной функции? в install shield'e была...

Gnom_aka_Lexander 15-11-2012 14:53 2026085

RodionSabitov, файл autorun.inf совершенно несложно заполнить вручную, для написания пары слов в текстовом файле нет нужды встраивать целый механизм его создания. К тому-же install shield - инструмент платный, и разработчикам необходимо оправдывать его платность. В том числе и ненужными опциями.

Johny777 17-11-2012 14:33 2027274

Цитата:

Цитата Gnom_aka_Lexander
CD-ром-то зачем? С сд-ромом, инно и сама довольно красиво с помощью драйвтривива в одну строчку делает. дополнительные ухищрения как раз были нужны, чтоб исключить его, поскольку попытка установить туда что-либо приводит как минимум к ошибке и является маразмом. »

не собирался его добавлять. Закоментировал а сейчас и подавно удалил. Остались только
DRIVE_REMOVABLE = $2;
DRIVE_FIXED = $3;
Цитата:

Цитата Gnom_aka_Lexander
ByteOrTB - несколько месяцев назад уважаемый Serega давал гораздо более корректный код. примерно в тех-же краях есть решение проблемы с определением размеров. Правда там с файлами, но по сути своей любой элемент системы является файлом, так что решение наверняка неподалеку. И не нужно копи ровать манеру форматирования кода Виктора Доброва, читать невозможно, чесслово. »

есть 2 функции на перевод байтов в удобочитаемую форму
1. http://forum.oszone.net/post-1882481-1175.html (юзаю в основном инсталле, тк он у меня двухязычный)
2. http://forum.oszone.net/post-1882594-1184.html (юзаю в остальных случаях. В том числе и для кода ниже)
и у меня нет размер файлов. Он не нужен. А размер дисков и инфа о них
короче вот допилил код
скрин:


в отличии от передыдущего кода это процедура которая пишет инфу в входную переменнную
свой тип
Код:

type
  DriveInfo = record
    DriveLetter: String; // буква
    DriveName: String; // имя
    DriveFileSystemName: String; // файловая система
    DriveSize: Extended; // объём
    DriveFreeSize: array [0..1] of Extended; // 0) свободно и 1) в неокруглённом виде проценты
    DriveType: String; // тип диска (локальный или съёмный)
  end;

используется массив DriveInfo
длина массива - кол-во хардов
каждый элемент массива содржит7 свойств

всё это выводится в TListView
код:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
BitmapResource=Drive:img_small.bmp

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

type
  PDWORD = DWORD;
 

  DriveInfo = record
    DriveLetter: String;
    DriveName: String;
    DriveFileSystemName: String;
    DriveSize: Extended;
    DriveFreeSize: array [0..1] of Extended;
    DriveType: String;
  end;
 
const
  DRIVE_REMOVABLE = $2;
  DRIVE_FIXED = $3;
  MAX_PATH = 260;
   
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName: String; lpVolumeNameBuffer: String; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetDiskFreeSpace(lpRootPathName: String; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; external 'GetDiskFreeSpace{#A}@kernel32.dll stdcall';

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;

procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
  i, e: Integer;
  UndefDriveLetter: String;
  DriveType: UINT;
  DriveSpecFullString: String;
  DrivePath: string;
  VolumeName, FileSystemName : string;
  ComponentLength, SerialNumber, FileSystemFlags: DWORD;
  Sec_Cluster, Bytes_Sec, Free_Clusters, Total_Clusters : DWORD;
  WinDrive: String;
begin
  WinDrive := Copy(ExpandConstant('{win}'),0,3);
  for i := 66 to 90 do // Loop from B..Z to determine available drives  (not A (65 to 90))
  begin
    UndefDriveLetter := chr(i) + ':\';
    DriveType := GetDriveType(UndefDriveLetter);
    case DriveType of
      DRIVE_REMOVABLE:
      begin
        VolumeName := StringOfChar(#32, MAX_PATH);
        FileSystemName := StringOfChar(#32, MAX_PATH);
        GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
        GetDiskFreeSpace(UndefDriveLetter, Sec_Cluster, Bytes_Sec, Free_Clusters, Total_Clusters);
        VolumeName := Trim(VolumeName)
        if VolumeName = '' then VolumeName := 'Без имени';
        SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
        e := GetArrayLength(DriveArray)-1;
        DriveArray[e].DriveLetter := UndefDriveLetter;
        DriveArray[e].DriveName := VolumeName;                                             
        DriveArray[e].DriveFileSystemName := FileSystemName;
        DriveArray[e].DriveSize := Bytes_Sec * Sec_Cluster * Total_Clusters;
        DriveArray[e].DriveFreeSize[0] := Bytes_Sec * Sec_Cluster * Free_Clusters;
        DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]/DriveArray[e].DriveSize*100;
        DriveArray[e].DriveType := 'Съёмный диск';
      end;
      DRIVE_FIXED:                                         
      begin
        VolumeName := StringOfChar(#32, MAX_PATH);
        FileSystemName := StringOfChar(#32, MAX_PATH);
        GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
        GetDiskFreeSpace(UndefDriveLetter, Sec_Cluster, Bytes_Sec, Free_Clusters, Total_Clusters);   
        VolumeName := Trim(VolumeName)
        if VolumeName = '' then VolumeName := 'Без имени';
        SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
        e := GetArrayLength(DriveArray)-1;
        DriveArray[e].DriveLetter := UndefDriveLetter;
        DriveArray[e].DriveName := VolumeName;
        DriveArray[e].DriveFileSystemName := FileSystemName;
        DriveArray[e].DriveSize := Bytes_Sec * Sec_Cluster * Total_Clusters;
        DriveArray[e].DriveFreeSize[0] := Bytes_Sec * Sec_Cluster * Free_Clusters;
        DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]/DriveArray[e].DriveSize*100;
        if UndefDriveLetter = WinDrive then DriveArray[e].DriveType := 'Локальный диск(сис.)' else DriveArray[e].DriveType := 'Локальный диск';
      end;
    end;
  end;
end;


procedure DriveListViewOnClick(Sender: TObject);
begin
  if Assigned(TListView(Sender).Selected) then WizardForm.DirEdit.Text := Copy(TListView(Sender).Selected.Caption,0,1) + Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
end;


procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
  If Column = TListView(Sender).Column[1] then
end;


procedure InitializeWizard;
var
  ReadyArray: array of DriveInfo;
  DriveListView: TListView;
  NewColumn: TListColumn;
  ListItem: TListItem;
  ImgList: TImageList;
  bmp: TBitmap;
  i: Integer;
begin
  GetDrivesInfo(ReadyArray);
  WizardForm.OuterNotebook.Hide;
  WizardForm.Width := ScaleX(700);
  WizardForm.Bevel.Hide;
  WizardForm.DirEdit.Parent := WizardForm;
  WizardForm.DirEdit.SetBounds(ScaleX(27), ScaleY(27), WizardForm.Width-ScaleX(71), ScaleY(21));


  DriveListView := TListView.Create(nil);
  with DriveListView do
  begin
    Parent := WizardForm;
    ViewStyle := vsReport;
   
    ReadOnly := True;
    SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + ScaleY(40),  WizardForm.DirEdit.Width, ScaleY(200));
    OnClick := @DriveListViewOnClick;
    OnColumnClick := @DriveListViewColumnClick;

    ImgList := TImageList.Create(DriveListView);
    bmp := TBitmap.Create;
    bmp.LoadFromResourceName(HInstance, '_IS_DRIVE');
    ImgList.AddMasked(bmp, clFuchsia);
    bmp.Free;
    SmallImages := ImgList;

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Диск';
    NewColumn.Width := ScaleX(65);

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Имя';
    NewColumn.Width := ScaleX(90);

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Файловая система';
    NewColumn.Width := ScaleX(65);

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Ёмкость';
    NewColumn.Width := ScaleX(65);

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Свободно';
    NewColumn.Width := ScaleX(90);

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Тип';
    NewColumn.Width := ScaleX(110);

    for i := 0 to GetArrayLength(ReadyArray)-1 do
    begin
      ListItem := Items.Add;
      with ListItem do
      begin
        Caption := ReadyArray[i].DriveLetter;
        SubItems.Add(ReadyArray[i].DriveName);
        SubItems.Add(ReadyArray[i].DriveFileSystemName);
        SubItems.Add(BytesToSize(ReadyArray[i].DriveSize));       
        SubItems.Add(BytesToSize(ReadyArray[i].DriveFreeSize[0]) + ' ' + '(' + IntToStr(Round(ReadyArray[i].DriveFreeSize[1])) + '%' + ')');
        SubItems.Add(ReadyArray[i].DriveType);
        case ReadyArray[i].DriveType of
            'Локальный диск': ImageIndex := 2
            'Локальный диск(сис.)': ImageIndex := 0
        else ImageIndex := 1;
        end;
      end;
    end;
  end;
  for i := 0 to DriveListView.Items.Count-1 do if Copy(WizardForm.DirEdit.Text, 0, 3) = DriveListView.Items.Item[i].Caption then DriveListView.Items.Item[i].Selected := True;// Focused := True;
end;



пацаны помогите пожалуйста
не знаю как сортировать элементы например по размеру свободному или полному
работает это метод метод CustomSort( @имя_каллбэк_функции, 0);
как здесь http://www.az-design.ru/index.shtml?.../SB58OnCompare
но прототип в инно TLVCompare = function(lParam1, lParam2, lParamSort: Integer): Integer;
и как им пользоваться фиг знает

и вторая просьба (не такая важная)
как правильно портировать функцию
function GetDiskFreeSpaceEx(lpDirectoryName: PWideChar;
var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes; lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;

function GetDiskFreeSpaceExA(lpDirectoryName: PAnsiChar;
var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes; lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;

function GetDiskFreeSpaceExW(lpDirectoryName: PWideChar;
var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes; lpTotalNumberOfFreeBytes: PLargeInteger): BOOL; stdcall;

я без понятия что такое PLargeInteger

буквы в ListView кликабельны

вот текстура для кода выше

Gnom_aka_Lexander 17-11-2012 14:37 2027276

Цитата:

Цитата Johny777
я без понятия что такое PLargeInteger »

Int64 я в ней использовал, когда в листвив делал.

Johny777 17-11-2012 17:44 2027340

Gnom_aka_Lexander,
спасибо добрый человек :) ! понял
читать дальше »
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

type
  Int64 = record
    Lo, Hi: Integer;
  end;
   
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: PAnsiChar; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: Int64): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';


function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;


function Size64(Hi, Lo: Integer): Extended;
begin
  Result := Lo;
  if Lo < 0 then  Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
  for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
end;


procedure InitializeWizard;
var
  A, B, C : Int64;
begin
  GetDiskFreeSpaceEx('C:\', A, B, C);
  MsgBox('диск C:' + #13#10 +
        'Свободно' + ' ' + BytesToSize(Size64(A.Hi, A.Lo)) + #13#10 +
        'Общий размер' + ' ' + BytesToSize(Size64(B.Hi, B.Lo)) + #13#10 +
        'Ещё раз свободно:' + ' ' +  BytesToSize(Size64(C.Hi, C.Lo)), mbError, MB_OK);
end;



обновлённый код инфы о хардах:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
BitmapResource=Drive:img_small.bmp

[  Code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

type
  PDWORD = DWORD;

  Int64 = record
    Lo, Hi: Integer;
  end;

  DriveInfo = record
    DriveLetter: String;
    DriveName: String;
    DriveFileSystemName: String;
    DriveSize: Extended;
    DriveFreeSize: array [0..1] of Extended;
    DriveType: String;
  end;
 
const
  DRIVE_REMOVABLE = $2;
  DRIVE_FIXED = $3;
  MAX_PATH = 260;
   
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName: String; lpVolumeNameBuffer: String; nVolumeNameSize: DWORD; lpVolumeSerialNumber: PDWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
//function GetDiskFreeSpace(lpRootPathName: String; var lpSectorsPerCluster, lpBytesPerSector, lpNumberOfFreeClusters, lpTotalNumberOfClusters: DWORD): BOOL; external 'GetDiskFreeSpace{#A}@kernel32.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: PAnsiChar; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: Int64): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';



function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;


function Size64(Hi, Lo: Integer): Extended;
begin
  Result := Lo;
  if Lo < 0 then  Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
  for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
end;


procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
  i, e: Integer;
  UndefDriveLetter: String;
  DriveType: UINT;
  DriveSpecFullString: String;
  DrivePath: string;
  VolumeName, FileSystemName : string;
  ComponentLength, SerialNumber, FileSystemFlags: DWORD;
  FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes : Int64;
  WinDrive: String;
begin
  WinDrive := Copy(ExpandConstant('{win}'),0,3);
  for i := 66 to 90 do // Loop from B..Z to determine available drives  (not A (65 to 90))
  begin
    UndefDriveLetter := chr(i) + ':\';
    DriveType := GetDriveType(UndefDriveLetter);
    case DriveType of
      DRIVE_REMOVABLE:
      begin
        VolumeName := StringOfChar(#32, MAX_PATH);
        FileSystemName := StringOfChar(#32, MAX_PATH);
        GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
        GetDiskFreeSpaceEx(UndefDriveLetter, FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes);
        VolumeName := Trim(VolumeName)
        if VolumeName = '' then VolumeName := 'Без имени';
        SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
        e := GetArrayLength(DriveArray)-1;
        DriveArray[e].DriveLetter := UndefDriveLetter;
        DriveArray[e].DriveName := VolumeName;                                             
        DriveArray[e].DriveFileSystemName := FileSystemName;
        DriveArray[e].DriveSize := Size64(TotalNumberOfBytes.Hi, TotalNumberOfBytes.Lo);
        DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes.Hi, TotalNumberOfFreeBytes.Lo);
        DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]/DriveArray[e].DriveSize*100;
        DriveArray[e].DriveType := 'Съёмный диск';
      end;
      DRIVE_FIXED:                                         
      begin
        VolumeName := StringOfChar(#32, MAX_PATH);
        FileSystemName := StringOfChar(#32, MAX_PATH);
        GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
        GetDiskFreeSpaceEx(UndefDriveLetter, FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes);
        VolumeName := Trim(VolumeName)
        if VolumeName = '' then VolumeName := 'Без имени';
        SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
        e := GetArrayLength(DriveArray)-1;
        DriveArray[e].DriveLetter := UndefDriveLetter;
        DriveArray[e].DriveName := VolumeName;
        DriveArray[e].DriveFileSystemName := FileSystemName;
        DriveArray[e].DriveSize := Size64(TotalNumberOfBytes.Hi, TotalNumberOfBytes.Lo);
        DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes.Hi, TotalNumberOfFreeBytes.Lo);
        DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]/DriveArray[e].DriveSize*100;
        if UndefDriveLetter = WinDrive then DriveArray[e].DriveType := 'Локальный диск(сис.)' else DriveArray[e].DriveType := 'Локальный диск';
      end;
    end;
  end;
end;


procedure DriveListViewOnClick(Sender: TObject);
begin
  if Assigned(TListView(Sender).Selected) then WizardForm.DirEdit.Text := Copy(TListView(Sender).Selected.Caption,0,1) + Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
end;


procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
  If Column = TListView(Sender).Column[1] then
end;


procedure InitializeWizard;
var
  ReadyArray: array of DriveInfo;
  DriveListView: TListView;
  NewColumn: TListColumn;
  ListItem: TListItem;
  ImgList: TImageList;
  bmp: TBitmap;
  i: Integer;
begin
  GetDrivesInfo(ReadyArray);
  WizardForm.OuterNotebook.Hide;
  WizardForm.Width := ScaleX(700);
  WizardForm.Bevel.Hide;
  WizardForm.DirEdit.Parent := WizardForm;
  WizardForm.DirEdit.SetBounds(ScaleX(27), ScaleY(27), WizardForm.Width-ScaleX(71), ScaleY(21));


  DriveListView := TListView.Create(nil);
  with DriveListView do
  begin
    Parent := WizardForm;
    ViewStyle := vsReport;
   
    ReadOnly := True;
    SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + ScaleY(40),  WizardForm.DirEdit.Width, ScaleY(200));
    OnClick := @DriveListViewOnClick;
    OnColumnClick := @DriveListViewColumnClick;

    ImgList := TImageList.Create(DriveListView);
    bmp := TBitmap.Create;
    bmp.LoadFromResourceName(HInstance, '_IS_DRIVE');
    ImgList.AddMasked(bmp, clFuchsia);
    bmp.Free;
    SmallImages := ImgList;

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Диск';
    NewColumn.Width := ScaleX(65);

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Имя';
    NewColumn.Width := ScaleX(90);

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Файловая система';
    NewColumn.Width := ScaleX(65);

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Ёмкость';
    NewColumn.Width := ScaleX(65);

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Свободно';
    NewColumn.Width := ScaleX(90);

    NewColumn := Columns.Add;
    NewColumn.Caption := 'Тип';
    NewColumn.Width := ScaleX(110);

    for i := 0 to GetArrayLength(ReadyArray)-1 do
    begin
      ListItem := Items.Add;
      with ListItem do
      begin
        Caption := ReadyArray[i].DriveLetter;
        SubItems.Add(ReadyArray[i].DriveName);
        SubItems.Add(ReadyArray[i].DriveFileSystemName);
        SubItems.Add(BytesToSize(ReadyArray[i].DriveSize));       
        SubItems.Add(BytesToSize(ReadyArray[i].DriveFreeSize[0]) + ' ' + '(' + IntToStr(Round(ReadyArray[i].DriveFreeSize[1])) + '%' + ')');
        SubItems.Add(ReadyArray[i].DriveType);
        case ReadyArray[i].DriveType of
            'Локальный диск': ImageIndex := 2
            'Локальный диск(сис.)': ImageIndex := 0
        else ImageIndex := 1;
        end;
      end;
    end;
  end;
  for i := 0 to DriveListView.Items.Count-1 do if Copy(WizardForm.DirEdit.Text, 0, 3) = DriveListView.Items.Item[i].Caption then DriveListView.Items.Item[i].Selected := True;// Focused := True;
end;


проверьте пожалуйста у кого юникодная инно под рукой. Всё ли правильно работает. Чисто для статистики :)

теперь осталось только соритровать элементы. Не знаю как :(

nik1967 18-11-2012 08:56 2027582

Цитата:

Цитата Johny777
проверьте пожалуйста у кого юникодная инно под рукой. Всё ли правильно работает. Чисто для статистики»

Добавил пару точек с запятой, но в результате пишет, что

Gnom_aka_Lexander 18-11-2012 10:08 2027596

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

Gnom_aka_Lexander 18-11-2012 14:11 2027687

Цитата:

Цитата Johny777
BitmapResource »

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

Johny777 18-11-2012 14:20 2027693

Gnom_aka_Lexander, как системные иконки прикрутить?
можешь пожалуйста подправить код?
меня например замки не устраивают. Но картинки такие маленькие, что ничего лучше не нашёл :(
на юникоде тестил? У тебя работает?

El Sanchez 18-11-2012 18:49 2027777

Цитата:

Цитата Johny777
как системные иконки прикрутить? »

Johny777, держи. На основе твоего предыдущего кода.
читать дальше »

Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
;BitmapResource=Drive:img_small.bmp

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

type
    _ULARGE_INTEGER = record
        LowPart: DWORD;
        HighPart: DWORD;
    end;

    DriveInfo = record
        DriveLetter: String;
        DriveName: String;
        DriveFileSystemName: String;
        DriveSize: Extended;
        DriveFreeSize: array [0..1] of Extended;
        DriveType: String;
    end;

const
    DRIVE_NO_ROOT_DIR = 1;
    DRIVE_REMOVABLE = $2;
    DRIVE_FIXED = $3;
    MAX_PATH = 260;

function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _ULARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';
function ExtractIcon(hInst: THandle; lpszExeFileName: String; nIconIndex: UINT): HICON; external 'ExtractIcon{#A}@shell32.dll stdcall';

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
    except end;
end;


function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
    Result := $7FFFFFFF;
    Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;


procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
    i, e: Integer;
    UndefDriveLetter: String;
    DriveType: UINT;
    DrivePath: String;
    VolumeName, FileSystemName: String;
    ComponentLength, SerialNumber, FileSystemFlags: DWORD;
    FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _ULARGE_INTEGER;
begin
    for i := 67 to 90 do // Loop from C..Z to determine available drives
    begin
        UndefDriveLetter := Chr(i) + ':\';
        DriveType := GetDriveType(UndefDriveLetter);
        case DriveType of
            DRIVE_REMOVABLE, DRIVE_FIXED: begin
                VolumeName := StringOfChar(#32, MAX_PATH);
                FileSystemName := StringOfChar(#32, MAX_PATH);
                GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
                GetDiskFreeSpaceEx(UndefDriveLetter, FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes);
                if Trim(VolumeName) = '' then VolumeName := 'Без имени';
                SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
                e := GetArrayLength(DriveArray)-1;
                DriveArray[e].DriveLetter := UndefDriveLetter;
                DriveArray[e].DriveName := VolumeName;
                DriveArray[e].DriveFileSystemName := FileSystemName;
                DriveArray[e].DriveSize := Size64(TotalNumberOfBytes);
                DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes);
                if DriveArray[e].DriveSize > 0 then DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]*100/DriveArray[e].DriveSize;
                if DriveType = DRIVE_REMOVABLE then DriveArray[e].DriveType := 'Съёмный диск';
                if DriveType = DRIVE_FIXED then if CompareText(UndefDriveLetter, ExpandConstant('{drive:{win}}\')) = 0 then DriveArray[e].DriveType := 'Локальный диск (сис.)' else DriveArray[e].DriveType := 'Локальный диск';
            end;
            DRIVE_NO_ROOT_DIR: Continue;
        end;
    end;
end;


procedure DriveListViewOnClick(Sender: TObject);
begin
    if Assigned(TListView(Sender).Selected) then
        WizardForm.DirEdit.Text := TListView(Sender).Selected.Caption + Copy(WizardForm.DirEdit.Text, 4, Length(WizardForm.DirEdit.Text));
end;

procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
    TListView(Sender).Tag := Column.Index;
    with TListView(Sender) do
    begin
        if DesignInfo = 0 then DesignInfo := 1 else DesignInfo := -DesignInfo;
        AlphaSort;
    end;
end;

procedure DriveListViewOnCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
begin
    with TListView(Sender) do
    begin
        if Tag = 0 then
            Compare := DesignInfo*CompareText(Item1.Caption, Item2.Caption)
        else
            Compare := DesignInfo*CompareText(Item1.SubItems[Tag-1], Item2.SubItems[Tag-1]);
    end;
end;

procedure InitializeWizard;
var
    ReadyArray: array of DriveInfo;
    DriveListView: TListView;
    NewColumn: TListColumn;
    ListItem: TListItem;
    ImgList: TImageList;
    i: Integer;
    ico: TIcon;
begin
    WizardForm.OuterNotebook.Hide;
    WizardForm.Width := ScaleX(700);
    WizardForm.Bevel.Hide;
    WizardForm.DirEdit.Parent := WizardForm;
    WizardForm.DirEdit.SetBounds(ScaleX(27), ScaleY(27), WizardForm.Width-ScaleX(71), ScaleY(21));

    GetDrivesInfo(ReadyArray);

    DriveListView := TListView.Create(nil);
    with DriveListView do
    begin
        Parent := WizardForm;
        ViewStyle := vsReport;
        ReadOnly := True;
        SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + ScaleY(40), WizardForm.DirEdit.Width, ScaleY(200));
        OnClick := @DriveListViewOnClick;
        OnColumnClick := @DriveListViewColumnClick;
        OnCompare := @DriveListViewOnCompare;

        ImgList := TImageList.Create(DriveListView);
        ico := TIcon.Create;
        ico.Handle := ExtractIcon(HInstance, ExpandConstant('{sys}\shell32.dll'), 8);
        ImgList.AddIcon(ico);
        ico.Handle := ExtractIcon(HInstance, ExpandConstant('{sys}\shell32.dll'), 7);
        ImgList.AddIcon(ico);
        ico.Free;
        SmallImages := ImgList;

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Диск';
        NewColumn.Width := ScaleX(65);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Имя';
        NewColumn.Width := ScaleX(90);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Файловая система';
        NewColumn.Width := ScaleX(105);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Ёмкость';
        NewColumn.Width := ScaleX(65);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Свободно';
        NewColumn.Width := ScaleX(90);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Тип';
        NewColumn.Width := ScaleX(130);

        for i := 0 to GetArrayLength(ReadyArray)-1 do
        begin
            ListItem := Items.Add;
            with ListItem do
            begin
                Caption := ReadyArray[i].DriveLetter;
                SubItems.Add(ReadyArray[i].DriveName);
                SubItems.Add(ReadyArray[i].DriveFileSystemName);
                SubItems.Add(BytesToSize(ReadyArray[i].DriveSize));
                SubItems.Add(Format('%s (%d%%)', [BytesToSize(ReadyArray[i].DriveFreeSize[0]), Round(ReadyArray[i].DriveFreeSize[1])]));
                SubItems.Add(ReadyArray[i].DriveType);
                case ReadyArray[i].DriveType of
                    'Локальный диск', 'Локальный диск (сис.)': ImageIndex := 0;
                    'Съёмный диск': ImageIndex := 1;
                else
                    ImageIndex := 1;
                end;
            end;
        end;
    end;
end;


ToBeLife 19-11-2012 18:44 2028433

Доброго времени суток.
Не хотел отрывать вас от более продвинутых ситуаций, но буду признателен за помощь.

задача такова:
необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения.
или как это реализовать через [Run], что бы первоначально запускался именно батник.

Спасибо

R.i.m.s.k.y. 19-11-2012 19:02 2028443

ToBeLife, нихао
В справке читай installation order, RUN выполняется самой последней секцией.

Так что через код

Код:

[Files]
Source: cmd.cmd; DestDir: {tmp}; Flags: ignoreversion noencryption solidbreak dontcopy

[CODE]
var
res : integer;

procedure InitializeWizard();
begin
  ExtractTemporaryFile(ExpandConstant('cmd.cmd'));
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
  if FileExists(ExpandConstant('{tmp}\cmd.cmd')) then begin
    res := -1;
    Exec('cmd.exe', ' /C ' + ExpandConstant('{tmp}\cmd.cmd'),ExpandConstant('{tmp}'),SW_HIDE,ewWaitUntilTerminated,res);
    if (res > 0) then MsgBox('упс, ошибка выполнения батника' + ExpandConstant('{tmp}\cmd.cmd') + #13#10 + SysErrorMessage(res), mbInformation, MB_OK);
  end
  else
    MsgBox('упс, файлика ' + ExpandConstant('{tmp}\cmd.cmd') + ' нет', mbInformation, MB_OK);
end; //if CurStep=ssInstall then begin
end;

end. //секции Code

могут быть орфографические ошибки, скобки или запятой не хватать.

Но вообще если батник мелкий лучше его в код инно перенести, а то может быть нестыковка, инно работает в кодировке СР1251, а батник - СР866. Привет ДОСу

ToBeLife 20-11-2012 06:24 2028712

R.i.m.s.k.y.,
Спасибо за помощь.
Воспользуюсь вашим советом.

pritoreanic 20-11-2012 07:01 2028719

Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.

Johny777 20-11-2012 14:04 2028903

pritoreanic,
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
DirExistsWarning=no

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

[CustomMessages]
russian.ComponentsDescription0=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения. или как это реализовать через [Run], что бы первоначально запускался именно батник. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.
russian.ComponentsDescription2=В справке читай installation order, RUN выполняется самой последней секцией.
russian.ComponentsDescription3=Но вообще если батник мелкий лучше его в код инно перенести, а то может быть нестыковка, инно работает в кодировке СР1251, а батник - СР866. Привет ДОСу
russian.ComponentsDescription4=Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;

[code]
var
  DescRTV: TRichEditViewer;

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
  DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

procedure InitializeWizard;
begin
  WizardForm.ComponentsList.Width := ScaleX(209);
  WizardForm.ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;

  DescRTV := TRichEditViewer.Create(nil)
  with DescRTV do
  begin
    SetBounds(ScaleX(216), WizardForm.ComponentsList.Top, ScaleX(201), WizardForm.ComponentsList.Height);
    Parent := WizardForm.SelectComponentsPage;
    ReadOnly := True;
    ScrollBars := ssVertical;
  end;
end;


JHeavy 20-11-2012 14:12 2028908

Приветствую, может быть вопрос задавался, но все же может кто нибудь ответит как в описании компонентов (как в примере выше), перенести строку описания на новую (ниже), 'описание' + 'описание' не помогает, хотя может не так что то делаю.
Спасибо.

pritoreanic 20-11-2012 14:24 2028915

Цитата:

Цитата Johny777
pritoreanic,
читать дальше » »

Спасибо тебе за код, но возникла проблема при попытке компиляции, выдает ошибку, можешь помочь с проблемой ?


Johny777 20-11-2012 14:34 2028924

pritoreanic, скачай и поставь расширенную версию инно из шапки (ANSI)

JHeavy, так что-ли? описание начинается со слова "описание"
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
DirExistsWarning=no

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

[CustomMessages]
russian.Desc=описание:
russian.ComponentsDescription0=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=необходимо запустить батник и дождаться его полного выполнения, и только потом начиналась бы основная установка приложения. или как это реализовать через [Run], что бы первоначально запускался именно батник. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе. Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.
russian.ComponentsDescription2=В справке читай installation order, RUN выполняется самой последней секцией.
russian.ComponentsDescription3=Но вообще если батник мелкий лучше его в код инно перенести, а то может быть нестыковка, инно работает в кодировке СР1251, а батник - СР866. Привет ДОСу
russian.ComponentsDescription4=Может кто пожалуйста подсказать как сделать такой же раздел в инсталляторе.

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;

[  Code]
var
  DescRTV: TRichEditViewer;

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
  if Index = -1 then DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1)) else DescRTV.Text := CustomMessage('Desc') + ' ' + CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

procedure InitializeWizard;
begin
  WizardForm.ComponentsList.Width := ScaleX(209);
  WizardForm.ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;

  DescRTV := TRichEditViewer.Create(nil)
  with DescRTV do
  begin
    SetBounds(ScaleX(216), WizardForm.ComponentsList.Top, ScaleX(201), WizardForm.ComponentsList.Height);
    Parent := WizardForm.SelectComponentsPage;
    ReadOnly := True;
    ScrollBars := ssVertical;
  end;
end;


JHeavy 20-11-2012 14:56 2028942

Johny777, спасибо за ответ, а как сделать чтобы все что после "описание:" начиналось с новой строки типа-
Описание:
1. бла
2. блабла
3. блаблабла
Спасибо.

pritoreanic 20-11-2012 15:25 2028965

Johny777

А как сделать выбор из двух одно, например выбор языка как на картинке

R.i.m.s.k.y. 20-11-2012 15:56 2028984

pritoreanic, дык ответ в примере выше
Код:

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;


pritoreanic 20-11-2012 16:21 2029003

Цитата:

Цитата R.i.m.s.k.y.
pritoreanic, дык ответ в примере выше »
Код:

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3;
Name: c\2; Description: 4;


Там ведь только обычные разделы и под разделы я же говорю про те "кругляшки" из двух кругляшков можно выбрать только один. как это сделать ?

R.i.m.s.k.y. 20-11-2012 16:25 2029005

pritoreanic, или может ты флаг exclusive имел ввиду?
Код:

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: c\1; Description: 3; Flags: exclusive
Name: c\2; Description: 4; Flags: exclusive

чтение справки облегчает понимание, да

Johny777 20-11-2012 19:25 2029122

JHeavy,
Код:

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
  if Index = -1 then DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1)) else
  DescRTV.Text := CustomMessage('Desc') + #13#10 + '  ' + CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

#13#10 - переход на новую строку
' ' - отступ. Неплохо ведь начать описание с абзаца :)

al70 21-11-2012 00:16 2029275

Друзья, может кто сталкивался?
Нужно на самой последней странице инсталлятора, когда пользователю предлогают например:

[x] запустить приложение
[x] прочитать какой-либо файл
[x] посетить сайт

Можно ли в коде скрипта, когда во время установки что-то произойдет не так менять адрес урла который нужно пользователю посетить?

SoulSide 21-11-2012 02:44 2029323

Цитата:

Цитата pritoreanic
А как сделать выбор из двух одно, например выбор языка как на картинке »

Цитата:

Цитата pritoreanic
Там ведь только обычные разделы и под разделы я же говорю про те "кругляшки" из двух кругляшков »

Используйте флаг (flags) в конце

Например у вас идёт что-то вроде:
Код:

[Components]
Name: a; Description: A

то, для того чтобы добавить флаг, нужно после Description: A сначала добавить точку с запятой ; а потом Flags: exclusive или Flags: fixed и.т.д. чтоб получилось примерно так Name: a; Description: A; Flags: exclusive

Исключительно


Код:

Flags: exclusive
Пример:
Код:

Name: a; Description: A; Flags: exclusive

Фиксированный


Код:

Flags: fixed
Пример:
Код:

Name: a; Description: A; Flags: fixed

Выбрать без дочерних


Код:

Flags: checkablealone
Пример:
Код:

Name: a; Description: A; Flags: checkablealone


Цитата:

Цитата R.i.m.s.k.y.
чтение справки облегчает понимание, да »

Ни разу в руки не брал. Тут всего без справок хватает.

SoulSide 21-11-2012 03:10 2029333

Цитата:

Цитата al70
Нужно на самой последней странице инсталлятора, когда пользователю предлогают например:
[x] запустить приложение
[x] прочитать какой-либо файл
[x] посетить сайт »

Если совсем без заморочек, например через секцию [RUN]:
читать дальше »
Запустить приложение
Код:

Filename: {app}\MyProg.exe; Description: запустить приложение; Flags: nowait postinstall skipifsilent
Прочитать какой-либо файл
Код:

Filename: {app}\readme.txt; Description: прочитать какой-либо файл; Flags: nowait postinstall skipifsilent
или
Код:

Filename: {src}\readme.txt; Description: прочитать какой-либо файл 2; Flags: nowait postinstall skipifsilent
Посетить сайт
Код:

Filename: {app}\site.url; Description: посетить сайт; Flags: nowait postinstall skipifsilent
или
Код:

Filename: {pf}\Internet Explorer\iexplore.exe; Description: посетить сайт; Parameters: http://www.google.com/; Flags: nowait postinstall skipifsilent
или
Код:

Filename: {pf}\Mozilla Firefox\firefox.exe; Description: посетить сайт; Parameters: http://www.google.com/; Flags: nowait postinstall skipifsilent
или
Код:

Filename: {pf}\Opera\opera.exe; Description: посетить сайт; Parameters: http://www.google.com/; Flags: nowait postinstall skipifsilent

JHeavy 21-11-2012 11:30 2029508

Здравствуйте, подскажите как сделать чтобы в списке компонентов (чекбоксы) можно было выбрать только один из компонентов?

R.i.m.s.k.y. 21-11-2012 11:41 2029514

JHeavy, проще пристрелить
на прошлой странице два раза ответили

________________

Цитата:

Цитата SoftLine
чтение справки облегчает понимание, да »
Ни разу в руки не брал. Тут всего без справок хватает. »

Я за инно взялся просто: из шапки качнул простых примеров, почитал в справке про что непонятно.
Именно тот случай когда Лучше день потерять, потом за пять минут долететь!

________________

al70 SoftLine

Посетить сайт можно проще
Код:

[RUN]
Filename: http://www.svp-team.com/wiki/Main_Page/ru; Description: посетить сайт; Flags: shellexec skipifsilent postinstall

Для открытия файла нужно добавлять shellexec для запуска приложения, привязанного к этому типу файлов
Код:

[RUN]
Filename: {app}\readme.txt; Description: прочитать какой-либо файл; Flags: shellexec postinstall skipifsilent


al70 21-11-2012 13:31 2029594

Цитата:

Цитата R.i.m.s.k.y.
Цитировать »


Вы не поняли. Поставить на последнюю страницу URL или файл я могу и в этом сложного ничего нет. Мне надо после того как прошла установка в зависимости от результата показать чекбокс "порейти на сайт", а вот урл должен иметь возможность измениться в зависимости от результатов установки.

R.i.m.s.k.y. 21-11-2012 13:37 2029596

al70, использовать Check не вариант?

Код:

[CODE]
Function Check1():boolean;
begin
//твоя проверка
end;
Function Check2():boolean;
begin
//твоя проверка нумер 2
end;

[RUN]
Check: Check1; Filename: http://www.svp-team.com/wiki/Main_Page/ru; Description: посетить сайт; Flags: shellexec skipifsilent postinstall
Check: not Check1; Filename: http://microsoft.com; Description: посетить другой сайт; Flags: shellexec skipifsilent postinstall


Если подчековая функция возвращает ТРУ - строчка скрипта выполняется, если фолсе - строчка пропускается и следов от нее нет.
Или опять не то?

al70 21-11-2012 14:08 2029616

Цитата:

Цитата R.i.m.s.k.y.
Цитировать »


В точку, спасибо!

Johny777 22-11-2012 11:57 2030203

El Sanchez, я заметил, что в TFolderTreeView иконки другие (покрасивее). Судя по исходному коду инно там используется функция ShellAPI:
function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall';
твой код вывода данных о хардах у меня в 2-х видах:
1: малость упрощённый для инсталла халфы (без процентов и инфы о файловой системе)
2: оригинал как есть
я портировал вот этот код http://delphiworld.narod.ru/base/get_filetype_ico.html в свою модифицированную версию
работает, но код стал медленнее
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
;BitmapResource=Drive:img_small.bmp

[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
    DRIVE_NO_ROOT_DIR = 1;
    DRIVE_REMOVABLE = 2;
    DRIVE_FIXED = 3;
    MAX_PATH = 260;
    SHGFI_SYSICONINDEX = 16384;
    SHGFI_SMALLICON = 1;
    SHGFI_LARGEICON = 0;
    SFGAO_SHARE = 131072;

type
    _SHFILEINFO = record
        hIcon: HICON;                      { out: icon }
        iIcon: Integer;                    { out: icon index }
        dwAttributes: DWORD;              { out: SFGAO_ flags }
        szDisplayName: array [0..MAX_PATH-1] of Char; { out: display name (or path) }
        szTypeName: array [0..79] of Char;            { out: type name }
    end;
   
    TIconType = (itSmall, itLarge);

    _ULARGE_INTEGER = record
        LowPart: DWORD;
        HighPart: DWORD;
    end;

    DriveInfo = record
        DriveLetter: String;
        DriveName: String;
        DriveSize: Extended;
        DriveFreeSize: Extended;
        DriveType: String;
    end;


function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _ULARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';
function ExtractIcon(hInst: THandle; lpszExeFileName: String; nIconIndex: UINT): HICON; external 'ExtractIcon{#A}@shell32.dll stdcall';

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
    except end;
end;


function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
    Result := $7FFFFFFF;
    Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;


procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
    i, e: Integer;
    UndefDriveLetter: String;
    DriveType: UINT;
    DrivePath: String;
    VolumeName, FileSystemName: String;
    ComponentLength, SerialNumber, FileSystemFlags: DWORD;
    FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _ULARGE_INTEGER;
begin
    for i := 67 to 90 do // Loop from C..Z to determine available drives
    begin
        UndefDriveLetter := Chr(i) + ':\';
        DriveType := GetDriveType(UndefDriveLetter);
        case DriveType of
            DRIVE_REMOVABLE, DRIVE_FIXED: begin
                VolumeName := StringOfChar(#32, MAX_PATH);
                FileSystemName := StringOfChar(#32, MAX_PATH);
                GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
                GetDiskFreeSpaceEx(UndefDriveLetter, FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes);
                if Trim(VolumeName) = '' then VolumeName := 'Без имени';
                SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
                e := GetArrayLength(DriveArray)-1;
                DriveArray[e].DriveLetter := UndefDriveLetter;
                DriveArray[e].DriveName := VolumeName;
                DriveArray[e].DriveSize := Size64(TotalNumberOfBytes);
                DriveArray[e].DriveFreeSize := Size64(TotalNumberOfFreeBytes);
                if DriveType = DRIVE_REMOVABLE then DriveArray[e].DriveType := 'Съёмный диск';
                if DriveType = DRIVE_FIXED then if CompareText(UndefDriveLetter, ExpandConstant('{drive:{win}}\')) = 0 then DriveArray[e].DriveType := 'Локальный диск (сис.)' else DriveArray[e].DriveType := 'Локальный диск';
            end;
            DRIVE_NO_ROOT_DIR: Continue;
        end;
    end;
end;


procedure DriveListViewOnClick(Sender: TObject);
begin
    if Assigned(TListView(Sender).Selected) then
        WizardForm.DirEdit.Text := TListView(Sender).Selected.Caption + Copy(WizardForm.DirEdit.Text, 4, Length(WizardForm.DirEdit.Text));
end;

procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
    TListView(Sender).Tag := Column.Index;
    with TListView(Sender) do
    begin
        if DesignInfo = 0 then DesignInfo := 1 else DesignInfo := -DesignInfo;
        AlphaSort;
    end;
end;

procedure DriveListViewOnCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
begin
    with TListView(Sender) do
    begin
        if Tag = 0 then
            Compare := DesignInfo*CompareText(Item1.Caption, Item2.Caption)
        else
            Compare := DesignInfo*CompareText(Item1.SubItems[Tag-1], Item2.SubItems[Tag-1]);
    end;
end;

function GetIcon(const FileName: string): TIcon;
var
  FileInfo: _SHFILEINFO;
  ImageList: TImageList;
  IT: DWORD;
begin
  IT := SHGFI_SMALLICON;
  Result := TIcon.Create;
  ImageList := TImageList.Create(nil);
//  FillChar(FileInfo, Sizeof(FileInfo), #0);
  ImageList.ShareImages := true;
  ImageList.Handle := SHGetFileInfo(
    PChar(FileName),
    SFGAO_SHARE,
    FileInfo,
    sizeof(FileInfo),
    IT or SHGFI_SYSICONINDEX
    );
  ImageList.GetIcon(FileInfo.iIcon, Result);
  ImageList.Free;
end;

procedure InitializeWizard;
var
    ReadyArray: array of DriveInfo;
    DriveListView: TListView;
    NewColumn: TListColumn;
    ListItem: TListItem;
    ImgList: TImageList;
    i: Integer;
    ico: TIcon;
begin
    WizardForm.OuterNotebook.Hide;
    WizardForm.Width := ScaleX(700);
    WizardForm.Bevel.Hide;
    WizardForm.DirEdit.Parent := WizardForm;
    WizardForm.DirEdit.SetBounds(ScaleX(27), ScaleY(27), WizardForm.Width-ScaleX(71), ScaleY(21));

    GetDrivesInfo(ReadyArray);

    DriveListView := TListView.Create(nil);
    with DriveListView do
    begin
        Parent := WizardForm;
        ViewStyle := vsReport;
        ReadOnly := True;
        SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + ScaleY(40), WizardForm.DirEdit.Width, ScaleY(200));
        OnClick := @DriveListViewOnClick;
        OnColumnClick := @DriveListViewColumnClick;
        OnCompare := @DriveListViewOnCompare;

        ImgList := TImageList.Create(DriveListView);
        for i := 0 to GetArrayLength(ReadyArray)-1 do ImgList.AddIcon(GetIcon(ReadyArray[i].DriveLetter));
        SmallImages := ImgList;

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Диск';
        NewColumn.Width := ScaleX(65);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Имя';
        NewColumn.Width := ScaleX(90);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Ёмкость';
        NewColumn.Width := ScaleX(65);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Свободно';
        NewColumn.Width := ScaleX(90);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Тип';
        NewColumn.Width := ScaleX(130);

        for i := 0 to GetArrayLength(ReadyArray)-1 do
        begin
            ListItem := Items.Add;
            with ListItem do
            begin
                Caption := ReadyArray[i].DriveLetter;
                SubItems.Add(ReadyArray[i].DriveName);
                SubItems.Add(BytesToSize(ReadyArray[i].DriveSize));
                SubItems.Add(BytesToSize(ReadyArray[i].DriveFreeSize));
                SubItems.Add(ReadyArray[i].DriveType);
                ImageIndex := i;
            end;
        end;
    end;
end;


решил улучшить
и заметил что в структуре
Код:

type
    _SHFILEINFO = record
        hIcon: HICON;                      { out: icon }
        iIcon: Integer;                    { out: icon index }
        dwAttributes: DWORD;              { out: SFGAO_ flags }
        szDisplayName: array [0..MAX_PATH-1] of Char; { out: display name (or path) }
        szTypeName: array [0..79] of Char;            { out: type name }
    end;

есть инфа о икинке hIcon: HICON;
а это как я понимаю тоже самое что в твоей функции загрузки иконки
function ExtractIcon(hInst: THandle; lpszExeFileName: String; nIconIndex: UINT): HICON; external 'ExtractIcon{#A}@shell32.dll stdcall';
получился такой код, но иконки не отобржаются (не пойму что не так сделал)
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
;BitmapResource=Drive:img_small.bmp

[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
    DRIVE_NO_ROOT_DIR = 1;
    DRIVE_REMOVABLE = 2;
    DRIVE_FIXED = 3;
    MAX_PATH = 260;
    SHGFI_SYSICONINDEX = 16384;
    SHGFI_SMALLICON = 1;
    SHGFI_LARGEICON = 0;
    SFGAO_SHARE = 131072;

type
    _ULARGE_INTEGER = record
        LowPart: DWORD;
        HighPart: DWORD;
    end;
   
    _SHFILEINFO = record
        hIcon: HICON;                      { out: icon }
        iIcon: Integer;                    { out: icon index }
        dwAttributes: DWORD;              { out: SFGAO_ flags }
        szDisplayName: array [0..MAX_PATH-1] of Char; { out: display name (or path) }
        szTypeName: array [0..79] of Char;            { out: type name }
    end;

    TIconType = (itSmall, itLarge);

    DriveInfo = record
        DriveLetter: String;
        DriveName: String;
        DriveFileSystemName: String;
        DriveSize: Extended;
        DriveFreeSize: array [0..1] of Extended;
        DriveType: String;
        DriveIcon: _SHFILEINFO;
    end;

function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _ULARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';
function ExtractIcon(hInst: THandle; lpszExeFileName: String; nIconIndex: UINT): HICON; external 'ExtractIcon{#A}@shell32.dll stdcall';

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
    except end;
end;


function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
    Result := $7FFFFFFF;
    Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;


procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
    i, e: Integer;
    UndefDriveLetter: String;
    DriveType: UINT;
    DrivePath: String;
    VolumeName, FileSystemName: String;
    ComponentLength, SerialNumber, FileSystemFlags: DWORD;
    FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _ULARGE_INTEGER;
    FileInfo: _SHFILEINFO;
    ImageList: TImageList;
    IT: DWORD;
begin
    for i := 67 to 90 do // Loop from C..Z to determine available drives
    begin
        UndefDriveLetter := Chr(i) + ':\';
        DriveType := GetDriveType(UndefDriveLetter);
        case DriveType of
            DRIVE_REMOVABLE, DRIVE_FIXED: begin
                VolumeName := StringOfChar(#32, MAX_PATH);
                FileSystemName := StringOfChar(#32, MAX_PATH);
                GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
                GetDiskFreeSpaceEx(UndefDriveLetter, FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes);
                if Trim(VolumeName) = '' then VolumeName := 'Без имени';
                SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
                e := GetArrayLength(DriveArray)-1;
                DriveArray[e].DriveLetter := UndefDriveLetter;
                DriveArray[e].DriveName := VolumeName;
                DriveArray[e].DriveFileSystemName := FileSystemName;
                DriveArray[e].DriveSize := Size64(TotalNumberOfBytes);
                DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes);
                if DriveArray[e].DriveSize > 0 then DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]*100/DriveArray[e].DriveSize;
                if DriveType = DRIVE_REMOVABLE then DriveArray[e].DriveType := 'Съёмный диск';
                if DriveType = DRIVE_FIXED then if CompareText(UndefDriveLetter, ExpandConstant('{drive:{win}}\')) = 0 then DriveArray[e].DriveType := 'Локальный диск (сис.)' else DriveArray[e].DriveType := 'Локальный диск';
                SHGetFileInfo(UndefDriveLetter, SFGAO_SHARE, DriveArray[e].DriveIcon, sizeof(DriveArray[e].DriveIcon), IT or SHGFI_SYSICONINDEX );
            end;
            DRIVE_NO_ROOT_DIR: Continue;
        end;
    end;
end;


procedure DriveListViewOnClick(Sender: TObject);
begin
    if Assigned(TListView(Sender).Selected) then
        WizardForm.DirEdit.Text := TListView(Sender).Selected.Caption + Copy(WizardForm.DirEdit.Text, 4, Length(WizardForm.DirEdit.Text));
end;

procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
    TListView(Sender).Tag := Column.Index;
    with TListView(Sender) do
    begin
        if DesignInfo = 0 then DesignInfo := 1 else DesignInfo := -DesignInfo;
        AlphaSort;
    end;
end;

procedure DriveListViewOnCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
begin
    with TListView(Sender) do
    begin
        if Tag = 0 then
            Compare := DesignInfo*CompareText(Item1.Caption, Item2.Caption)
        else
            Compare := DesignInfo*CompareText(Item1.SubItems[Tag-1], Item2.SubItems[Tag-1]);
    end;
end;

procedure InitializeWizard;
var
    ReadyArray: array of DriveInfo;
    DriveListView: TListView;
    NewColumn: TListColumn;
    ListItem: TListItem;
    ImgList: TImageList;
    i, e: Integer;
    ico: TIcon;
begin
    WizardForm.OuterNotebook.Hide;
    WizardForm.Width := ScaleX(700);
    WizardForm.Bevel.Hide;
    WizardForm.DirEdit.Parent := WizardForm;
    WizardForm.DirEdit.SetBounds(ScaleX(27), ScaleY(27), WizardForm.Width-ScaleX(71), ScaleY(21));

    GetDrivesInfo(ReadyArray);
    e := GetArrayLength(ReadyArray)-1;

    DriveListView := TListView.Create(nil);
    with DriveListView do
    begin
        Parent := WizardForm;
        ViewStyle := vsReport;
        ReadOnly := True;
        SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + ScaleY(40), WizardForm.DirEdit.Width, ScaleY(200));
        OnClick := @DriveListViewOnClick;
        OnColumnClick := @DriveListViewColumnClick;
        OnCompare := @DriveListViewOnCompare;

        ImgList := TImageList.Create(DriveListView);
        for i := 0 to e do
        begin
            ico := TIcon.Create;
            ico.Handle := ReadyArray[0].DriveIcon.hIcon;
            ImgList.AddIcon(ico);
            ico.Free;
        end;
        SmallImages := ImgList;

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Диск';
        NewColumn.Width := ScaleX(65);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Имя';
        NewColumn.Width := ScaleX(90);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Файловая система';
        NewColumn.Width := ScaleX(105);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Ёмкость';
        NewColumn.Width := ScaleX(65);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Свободно';
        NewColumn.Width := ScaleX(90);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Тип';
        NewColumn.Width := ScaleX(130);

        for i := 0 to e do
        begin
            ListItem := Items.Add;
            with ListItem do
            begin
                Caption := ReadyArray[i].DriveLetter;
                SubItems.Add(ReadyArray[i].DriveName);
                SubItems.Add(ReadyArray[i].DriveFileSystemName);
                SubItems.Add(BytesToSize(ReadyArray[i].DriveSize));
                SubItems.Add(Format('%s (%d%%)', [BytesToSize(ReadyArray[i].DriveFreeSize[0]), Round(ReadyArray[i].DriveFreeSize[1])]));
                SubItems.Add(ReadyArray[i].DriveType);
//                case ReadyArray[i].DriveType of
//                    'Локальный диск', 'Локальный диск (сис.)': ImageIndex := 0;
//                    'Съёмный диск': ImageIndex := 1;
//                else
                    ImageIndex := i;
//                end;
            end;
        end;
    end;
end;


в общем прошу по возможности помочь, тк иконки хороши (есть диск, сис, диск, флэшка)

PS: можно б было их и напрямую грузить, но не знаю где они лижат :(

pritoreanic 22-11-2012 12:15 2030219

Помогите пожалуйста убрать "выбор установки", затемнить правую половинку окна где описание к компонентам и еще почему то не работает строка "russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание." когда курсор не наведен с право в окне пусто.


читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

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

[CustomMessages]
russian.Desc=Описание:
russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание.
russian.ComponentsDescription1=Minecraft 1.4.5
russian.ComponentsDescription2=1.
russian.ComponentsDescription3=12.
russian.ComponentsDescription4=123.
russian.ComponentsDescription5=1234.
russian.ComponentsDescription6=12345.
russian.ComponentsDescription7=123456.
russian.ComponentsDescription8=1234567.
russian.ComponentsDescription9=12345678.
russian.ComponentsDescription10=123456789.
russian.ComponentsDescription11=SMP-123.

[Components]
Name: main; Description: Minecraft; Flags: fixed; Types: custom compact full
Name: c\1; Description: rus; Flags: exclusive
Name: c\2; Description: eng; Flags: exclusive
Name: Component1; Description: kom;
Name: c\1; Description: AudioMod; Flags: fixed; Types: custom compact full
Name: c\2; Description: ModLoader; Flags: fixed; Types: custom compact full
Name: c\3; Description: Optifine;
Name: c\4; Description: TooManyItem;
Name: c\5; Description: Rei's Minimap;
Name: Component2; Description: s;
Name: c\1; Description: SMP-s;

[Files]
Source: "C:\InstallFiles\main\Minecraft.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: C:\InstallFiles\main\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: main
Source: C:\InstallFiles\comp1\*; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: C:\InstallFiles\comp2\*; DestDir: {app}; Flags: ignoreversion; Components: Component2

[.code]
procedure RedesignWizardForm;
begin
end;

var
  DescRTV: TRichEditViewer;

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
  DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
  WizardForm.ComponentsList.Width := ScaleX(209);
  WizardForm.ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;

  DescRTV := TRichEditViewer.Create(nil)
  with DescRTV do
  begin
    SetBounds(ScaleX(216), WizardForm.ComponentsList.Top, ScaleX(201), WizardForm.ComponentsList.Height);
    Parent := WizardForm.SelectComponentsPage;
    ReadOnly := True;
    ScrollBars := ssVertical;
  end;
end;




InnoQuest 22-11-2012 12:17 2030224

Добрый день! Имеется следующая конструкция

читать дальше »


Код:


#define MyAppName "KMBD"
#define MyAppVerName "KMBD Setup"
#define MyAppPublisher "NIC MVD"
#define MyAppExeName "ModelApp.exe"
#define MyFrameWorkName "dotNetFx40_Full_x86_x64.exe"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=C:\OutPUt
OutputBaseFilename=setup
SetupIconFile=C:\Users\NIC\Desktop\Install\res\KMBD1311\RunApp\tank.ico
Compression=lzma
SolidCompression=yes

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

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

[Components]
Name: KMBD; Description: Пакет KMBD; Types: full custom;
Name: MAP; Description:  Карта; Types: full custom;
Name: Framework; Description:  .NET Framework 4.0; Types:custom;

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

[Files]
;Source: "C:\Users\NIC\Desktop\Install\res\KMBD1311\RunApp\ModelApp.exe"; DestDir: "{app}"; Flags: ignoreversion
Source:  "C:\Users\NIC\Desktop\Install\res\KMBD1311\*"; DestDir: "{app}"; Components: KMBD; Flags: ignoreversion recursesubdirs createallsubdirs
;Source: "C:\Users\NIC\Desktop\Install\res\100_BL_G v4\*"; DestDir: "{app}\Map";Components: MAP; Flags: ignoreversion recursesubdirs createallsubdirs
Source:  "C:\Users\NIC\Desktop\Install\res\.NET Framework 4.0\dotNetFx40_Full_x86_x64.exe*"; DestDir: "{app}\.NET Framework 4.0"; Components:Framework ; Flags: ignoreversion recursesubdirs createallsubdirs


[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\RunApp\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: nowait postinstall skipifsilent
Filename: "{app}\.NET Framework 4.0\{#MyFrameWorkName}"; Description: "{cm:LaunchProgram,{#MyFrameWorkName}}"; Flags: nowait postinstall skipifsilent



3 компонента которые можно устанавливать по выбору. 1 главный компонент с exe файлом, с возможностью создания ярлыка на рабочем столе запуске приложения после установки. 2 компонент это просто папка с файлами там нет exe 3 компонент фрейворк (один экзешник).
Подскажите как сделать чтобы, например, когда мы хотим установить только компонент два, не было пункта (чекбоксов) хотите ли вы поместить ярлык на рабочих стол или запуск после установки(так как будет высыпаться ошибка, оно и понятно там нет исполняемых файлов). Эти пункты должны быть только для первого приложения.
Как сделать чтобы при выборе компонента 1 с компонентом 3(фрейворк) они ставились по очереди(те поставилось приложение, а далее идет установка фрейворка). Сейчас, у меня происходит просто распаковка файла фрейворка в директорию, но он не запускается.
Спасибо.

R.i.m.s.k.y. 22-11-2012 12:40 2030242

InnoQuest, а ответ один - добавлять к строчкам параметр Components: 1 2 3
1.
Код:

[Files]
Components:KMBD; Source:  "C:\Users\NIC\Desktop\Install\res\KMBD1311\*"; DestDir: "{app}"; Components: KMBD; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Components:KMBD; Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"

2.
Код:

[Tasks]
Components: MAP and not (KMBD and Framework); Name: desktopicon; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Components: MAP and not (KMBD and Framework); Name: quicklaunchicon; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Tasks: desktopicon; Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}";
Tasks: quicklaunchicon; Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}";

3. не надо было ставить флаг nowait, вот установщик и nowait. Флаг postinstall формирует галочку на последней странице установщика с описанием Description
Код:

[Run]
Components: KMBD; Filename: "{app}\RunApp\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags: postinstall skipifsilent
Components: Framework; Filename: "{app}\.NET Framework 4.0\{#MyFrameWorkName}"; Description: "{cm:LaunchProgram,{#MyFrameWorkName}}"; Flags: skipifsilent


Johny777 22-11-2012 13:47 2030282

pritoreanic, пардон за недоработку. Исправил!
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

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

[CustomMessages]
russian.Desc=Описание:
russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание.
russian.ComponentsDescription1=Minecraft 1.4.5
russian.ComponentsDescription2=1.
russian.ComponentsDescription3=12.
russian.ComponentsDescription4=123.
russian.ComponentsDescription5=1234.
russian.ComponentsDescription6=12345.
russian.ComponentsDescription7=123456.
russian.ComponentsDescription8=1234567.
russian.ComponentsDescription9=12345678.
russian.ComponentsDescription10=123456789.
russian.ComponentsDescription11=SMP-123.

[Components]
Name: main; Description: Minecraft; Flags: fixed; Types: custom compact full
Name: c\1; Description: rus; Flags: exclusive
Name: c\2; Description: eng; Flags: exclusive
Name: Component1; Description: kom;
Name: c\1; Description: AudioMod; Flags: fixed; Types: custom compact full
Name: c\2; Description: ModLoader; Flags: fixed; Types: custom compact full
Name: c\3; Description: Optifine;
Name: c\4; Description: TooManyItem;
Name: c\5; Description: Rei's Minimap;
Name: Component2; Description: s;
Name: c\1; Description: SMP-s;

[Files]
Source: "C:\InstallFiles\main\Minecraft.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: C:\InstallFiles\main\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: main
Source: C:\InstallFiles\comp1\*; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: C:\InstallFiles\comp2\*; DestDir: {app}; Flags: ignoreversion; Components: Component2

[code]
var
  DescRTV: TRichEditViewer;

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
  DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

procedure InitializeWizard;
begin
  with WizardForm do
  begin
    ComponentsList.SetBounds(ScaleX(0), SelectComponentsLabel.Top + SelectComponentsLabel.Height + ScaleY(5), (SelectComponentsPage.Width - ScaleX(5)) div 2, ScaleY(165));
    ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;
    TypesCombo.Hide;
 

    DescRTV := TRichEditViewer.Create(nil)
    with DescRTV do
    begin
      Parent := SelectComponentsPage;
      SetBounds(ComponentsList.Left + ComponentsList.Width + ScaleX(5), ComponentsList.Top, ComponentsList.Width, ComponentsList.Height);
      ReadOnly := True;
      ScrollBars := ssVertical;
      Color := clBtnFace;
      RTFText := CustomMessage('ComponentsDescription0');
    end;
  end;
end;


и убирай пожалуйста крупные коды и скрины под спойлер!

InnoQuest 22-11-2012 14:40 2030324

R.i.m.s.k.y. Спасибо.

Еще 3 проблемы возникло, если не трудно дайте наводку куда копать

1) При обычной установки (те когда выбран 1и/или второй компонент), вылазит ошибка, что мол не могу запустить 3компонент(хотя он и не был выбран для установки), установка проходит нормально, но не пойму почему он пытается выполнить 3 компонент?
2) Если устанавливать только второй компонент(это простая папка с файлами без экзешника, по сути нужно е просто распаковать), в конце тоже появляется окно предлагающее запустить KMBD, ну и естественно ошибка из вопроса номер 1 вылазит.
3) Если устанавливаем только 3 компонент(фрейворк- простой экзешник), все проходит нормально(тут кстати нет ошибки что не удается запустить 1 компонент), но в конце опять тоже окошко о запуске KMBD(хоть мы его и не выбирали) .

Я так понимаю нужно какую-то проверку написать в тегах[code] на то какие компоненты выбраны и какой из [Run] запускать в завимости от выбранного
В принципе если закомментить все Source вы можете посмотреть логику работы установщика
Буду благодарен за помощь, а то завтра нужно проект показывать уже, а установщик сырой
Сейчас выглядит так
читать дальше »

Код:


#define MyAppName "KMBD"
#define MyAppVerName "KMBD Setup"
#define MyAppPublisher "NIC MVD"
#define MyAppExeName "ModelApp.exe"
#define MyFrameWorkName "dotNetFx40_Full_x86_x64.exe"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=C:\OutPUt
OutputBaseFilename=setup
SetupIconFile=C:\Users\NIC\Desktop\Install\res\KMBD1311\RunApp\tank.ico
Compression=lzma
SolidCompression=yes

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

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

[Components]
Name: KMBD; Description: Пакет KMBD; Types: full custom;
Name: MAP; Description:  Карта; Types: full custom;
Name: Framework; Description:  .NET Framework 4.0; Types:custom;

[Tasks]
Components: KMBD and not (MAP and Framework);Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Components: KMBD and not (MAP and Framework);Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
;Source: "C:\Users\NIC\Desktop\Install\res\KMBD1311\RunApp\ModelApp.exe"; DestDir: "{app}"; Flags: ignoreversion
 Source:  "C:\Users\NIC\Desktop\Install\res\KMBD1311\*"; DestDir: "{app}"; Components: KMBD; Flags: ignoreversion recursesubdirs createallsubdirs
 ;Source:  "C:\Users\NIC\Desktop\Install\res\100_BL_G v4\*"; DestDir: "{app}\Map";Components: MAP; Flags: ignoreversion recursesubdirs createallsubdirs
 Source:  "C:\Users\NIC\Desktop\Install\res\.NET Framework 4.0\dotNetFx40_Full_x86_x64.exe*"; DestDir: "{app}\.NET Framework 4.0"; Components:Framework ; Flags: ignoreversion recursesubdirs createallsubdirs


[Icons]
Name: "{group}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\RunApp\{#MyAppExeName}"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\RunApp\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#MyAppName}}"; Flags:  postinstall skipifsilent
Filename: "{app}\.NET Framework 4.0\{#MyFrameWorkName}"; Description: "{cm:LaunchProgram,{#MyFrameWorkName}}"; Flags: skipifsilent


R.i.m.s.k.y. 22-11-2012 14:49 2030332

Цитата:

Цитата InnoQuest
Еще 3 проблемы возникло, если не трудно дайте наводку куда копать
1) При обычной установки (те когда выбран 1и/или второй компонент), вылазит ошибка, что мол не могу запустить 3компонент(хотя он и не был выбран для установки), установка проходит нормально, но не пойму почему он пытается выполнить 3 компонент?
2) Если устанавливать только второй компонент(это простая папка с файлами без экзешника, по сути нужно е просто распаковать), в конце тоже появляется окно предлагающее запустить KMBD, ну и естественно ошибка из вопроса номер 1 вылазит.
3) Если устанавливаем только 3 компонент(фрейворк- простой экзешник), все проходит нормально(тут кстати нет ошибки что не удается запустить 1 компонент), но в конце опять тоже окошко о запуске KMBD(хоть мы его и не выбирали) . »

потому что ты его запускаешь в секции Run второй строчкой, ты
а) не понял что я писал в прошлом посте для тебя и
б) недокопировал что я писал в прошлом посте для тебя

Цитата:

Цитата InnoQuest
Я так понимаю нужно какую-то проверку написать в тегах[code] на то какие компоненты выбраны и какой из [Run] запускать в завимости от выбранного »

не нужно

El Sanchez 22-11-2012 14:53 2030337

Цитата:

Цитата Johny777
Судя по исходному коду инно там используется функция ShellAPI:
function SHGetFileInfo(pszPath: PAnsiChar; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall'; »

Johny777, хорошая функция, пригодится.

Цитата:

Цитата Johny777
получился такой код, но иконки не отобржаются (не пойму что не так сделал) »

Johny777, функция SHGetFileInfo с флагом SHGFI_SYSICONINDEX не возвращала хэндл иконки, плюс ошибка в строке ico.Handle := ReadyArray[0].DriveIcon.hIcon;. Предлагаю так:
читать дальше »

Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
;BitmapResource=Drive:img_small.bmp

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
    DRIVE_NO_ROOT_DIR = 1;
    DRIVE_REMOVABLE = 2;
    DRIVE_FIXED = 3;
    MAX_PATH = 260;
    SHGFI_ICON = $100;
    SHGFI_SMALLICON = $1;
    SHGFI_DISPLAYNAME = $200;
    SHGFI_TYPENAME = $400;

type
    _SHFILEINFO = record
        hIcon: HICON;
        iIcon: Integer;
        dwAttributes: DWORD;
        szDisplayName: array [0..MAX_PATH-1] of Char;
        szTypeName: array [0..79] of Char;
    end;

    _ULARGE_INTEGER = record
        LowPart: DWORD;
        HighPart: DWORD;
    end;

    DriveInfo = record
        DriveName: String;
        DriveFileSystemName: String;
        DriveSize: Extended;
        DriveFreeSize: array [0..1] of Extended;
        DriveType: String;
        DriveIcon: _SHFILEINFO;
    end;


function SHGetFileInfo(pszPath: String; dwFileAttributes: DWORD; var psfi: _SHFILEINFO; cbFileInfo, uFlags: UINT): DWORD; external 'SHGetFileInfo{#A}@shell32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: DWORD; var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _ULARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';


function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
    except end;
end;

function CharArrayToString(cArray: array of Char): String;
begin
    Result := '';
    while cArray[Length(Result)] <> #0 do Insert(cArray[Length(Result)], Result, Length(Result)+1);
end;

function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
    Result := $7FFFFFFF;
    Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;


procedure GetDrivesInfo(var DriveArray: array of DriveInfo);
var
    i, e: Integer;
    iIcon: WORD;
    UndefDriveLetter: String;
    DriveType: UINT;
    DrivePath: String;
    VolumeName, FileSystemName: String;
    ComponentLength, SerialNumber, FileSystemFlags: DWORD;
    FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _ULARGE_INTEGER;
begin
    for i := 67 to 90 do // Loop from C..Z to determine available drives
    begin
        UndefDriveLetter := Chr(i) + ':\';
        DriveType := GetDriveType(UndefDriveLetter);
        case DriveType of
            DRIVE_REMOVABLE, DRIVE_FIXED: begin
                VolumeName := StringOfChar(#32, MAX_PATH);
                FileSystemName := StringOfChar(#32, MAX_PATH);
                GetVolumeInformation(UndefDriveLetter, VolumeName, MAX_PATH, SerialNumber, ComponentLength, FileSystemFlags, FileSystemName, MAX_PATH);
                GetDiskFreeSpaceEx(UndefDriveLetter, FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes);
                SetArrayLength(DriveArray, GetArrayLength(DriveArray)+1);
                e := GetArrayLength(DriveArray)-1;
                SHGetFileInfo(UndefDriveLetter, FILE_ATTRIBUTE_DIRECTORY, DriveArray[e].DriveIcon, sizeof(DriveArray[e].DriveIcon), SHGFI_ICON or SHGFI_SMALLICON or SHGFI_TYPENAME or SHGFI_DISPLAYNAME);
                DriveArray[e].DriveName := CharArrayToString(DriveArray[e].DriveIcon.szDisplayName);
                DriveArray[e].DriveFileSystemName := FileSystemName;
                DriveArray[e].DriveSize := Size64(TotalNumberOfBytes);
                DriveArray[e].DriveFreeSize[0] := Size64(TotalNumberOfFreeBytes);
                if DriveArray[e].DriveSize > 0 then DriveArray[e].DriveFreeSize[1] := DriveArray[e].DriveFreeSize[0]*100/DriveArray[e].DriveSize;
                DriveArray[e].DriveType := CharArrayToString(DriveArray[e].DriveIcon.szTypeName);
            end;
            DRIVE_NO_ROOT_DIR: Continue;
        end;
    end;
end;


procedure DriveListViewOnClick(Sender: TObject);
begin
    if Assigned(TListView(Sender).Selected) then
        WizardForm.DirEdit.Text := AddBackSlash(Copy(TListView(Sender).Selected.Caption, Pos('(', TListView(Sender).Selected.Caption)+1, 2)) + Copy(WizardForm.DirEdit.Text, 4, Length(WizardForm.DirEdit.Text));
end;

procedure DriveListViewColumnClick(Sender: TObject; Column: TListColumn);
begin
    TListView(Sender).Tag := Column.Index;
    with TListView(Sender) do
    begin
        if DesignInfo = 0 then DesignInfo := 1 else DesignInfo := -DesignInfo;
        AlphaSort;
    end;
end;

procedure DriveListViewOnCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer);
begin
    with TListView(Sender) do
    begin
        if Tag = 0 then
            Compare := DesignInfo*CompareText(Item1.Caption, Item2.Caption)
        else
            Compare := DesignInfo*CompareText(Item1.SubItems[Tag-1], Item2.SubItems[Tag-1]);
    end;
end;

procedure InitializeWizard;
var
    ReadyArray: array of DriveInfo;
    DriveListView: TListView;
    NewColumn: TListColumn;
    ListItem: TListItem;
    ImgList: TImageList;
    i, e: Integer;
    ico: TIcon;
begin
    WizardForm.OuterNotebook.Hide;
    WizardForm.Width := ScaleX(700);
    WizardForm.Bevel.Hide;
    WizardForm.DirEdit.Parent := WizardForm;
    WizardForm.DirEdit.SetBounds(ScaleX(27), ScaleY(27), WizardForm.Width-ScaleX(71), ScaleY(21));

    GetDrivesInfo(ReadyArray);
    e := GetArrayLength(ReadyArray)-1;

    DriveListView := TListView.Create(nil);
    with DriveListView do
    begin
        Parent := WizardForm;
        ViewStyle := vsReport;
        ReadOnly := True;

        SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + ScaleY(40), WizardForm.DirEdit.Width, ScaleY(200));
        OnClick := @DriveListViewOnClick;
        OnColumnClick := @DriveListViewColumnClick;
        OnCompare := @DriveListViewOnCompare;

        ImgList := TImageList.Create(DriveListView);
        ImgList.BkColor := Color;
        for i := 0 to e do
        begin
            ico := TIcon.Create;
            ico.Handle := ReadyArray[i].DriveIcon.hIcon;
            ImgList.AddIcon(ico);
            ico.Free;
        end;
        SmallImages := ImgList;

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Имя';
        NewColumn.Width := ScaleX(130);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Файловая система';
        NewColumn.Width := ScaleX(105);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Ёмкость';
        NewColumn.Width := ScaleX(65);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Свободно';
        NewColumn.Width := ScaleX(90);

        NewColumn := Columns.Add;
        NewColumn.Caption := 'Тип';
        NewColumn.Width := ScaleX(130);

        for i := 0 to e do
        begin
            ListItem := Items.Add;
            with ListItem do
            begin
                Caption := ReadyArray[i].DriveName;
                SubItems.Add(ReadyArray[i].DriveFileSystemName);
                SubItems.Add(BytesToSize(ReadyArray[i].DriveSize));
                SubItems.Add(Format('%s (%d%%)', [BytesToSize(ReadyArray[i].DriveFreeSize[0]), Round(ReadyArray[i].DriveFreeSize[1])]));
                SubItems.Add(ReadyArray[i].DriveType);
                ImageIndex := i;
            end;
        end;
    end;
end;


InnoQuest 22-11-2012 15:31 2030385

R.i.m.s.k.y.
Спасибо понял где ошибся

pritoreanic 23-11-2012 03:22 2030935

Цитата:

Цитата Johny777
pritoreanic, пардон за недоработку. Исправил!

читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

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

[CustomMessages]
russian.Desc=Описание:
russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание.
russian.ComponentsDescription1=Minecraft 1.4.5
russian.ComponentsDescription2=1.
russian.ComponentsDescription3=12.
russian.ComponentsDescription4=123.
russian.ComponentsDescription5=1234.
russian.ComponentsDescription6=12345.
russian.ComponentsDescription7=123456.
russian.ComponentsDescription8=1234567.
russian.ComponentsDescription9=12345678.
russian.ComponentsDescription10=123456789.
russian.ComponentsDescription11=SMP-123.

[Components]
Name: main; Description: Minecraft; Flags: fixed; Types: custom compact full
Name: c\1; Description: rus; Flags: exclusive
Name: c\2; Description: eng; Flags: exclusive
Name: Component1; Description: kom;
Name: c\1; Description: AudioMod; Flags: fixed; Types: custom compact full
Name: c\2; Description: ModLoader; Flags: fixed; Types: custom compact full
Name: c\3; Description: Optifine;
Name: c\4; Description: TooManyItem;
Name: c\5; Description: Rei's Minimap;
Name: Component2; Description: s;
Name: c\1; Description: SMP-s;

[Files]
Source: "C:\InstallFiles\main\Minecraft.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: C:\InstallFiles\main\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: main
Source: C:\InstallFiles\comp1\*; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: C:\InstallFiles\comp2\*; DestDir: {app}; Flags: ignoreversion; Components: Component2

[.code]
var
  DescRTV: TRichEditViewer;

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
  DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

procedure InitializeWizard;
begin
  with WizardForm do
  begin
    ComponentsList.SetBounds(ScaleX(0), SelectComponentsLabel.Top + SelectComponentsLabel.Height + ScaleY(5), (SelectComponentsPage.Width - ScaleX(5)) div 2, ScaleY(165));
    ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;
    TypesCombo.Hide;
 

    DescRTV := TRichEditViewer.Create(nil)
    with DescRTV do
    begin
      Parent := SelectComponentsPage;
      SetBounds(ComponentsList.Left + ComponentsList.Width + ScaleX(5), ComponentsList.Top, ComponentsList.Width, ComponentsList.Height);
      ReadOnly := True;
      ScrollBars := ssVertical;
      Color := clBtnFace;
      RTFText := CustomMessage('ComponentsDescription0');
    end;
  end;
end;


Спасибо тебе за помощь.
Есть еще проблема с появлением сообщения на скриншоте.
Еще когда наводишь на все компоненты кроме SMP-s сообщение "russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание." не показывает.


R.i.m.s.k.y. 23-11-2012 08:32 2030973

Цитата:

Цитата pritoreanic
Есть еще проблема с появлением сообщения на скриншоте. »

Используй флаг disablenouninstallwarning в секции [Components]

По второму вопросу, не знаю поможет или нет, я бы в конце процедуры ComponentsListOnItemMouseMove добавил WizardForm.ComponentsList.Repaint.

JHeavy 23-11-2012 11:49 2031068

R.i.m.s.k.y.,
Цитата:

Цитата R.i.m.s.k.y.
проще пристрелить
на прошлой странице два раза ответили »

Ну вообще то, меня интересовало как сделать такой выбор чекбоксами, т.е. если выбрать один чекбокс выбор с другого снимается, а не флагом exclusive, но все равно спасибо.

R.i.m.s.k.y. 23-11-2012 11:51 2031070

Цитата:

Цитата JHeavy
Ну вообще то, меня интересовало как сделать такой выбор чекбоксами, а не флагом exclusive, но все равно спасибо »

убрать флаг exclusive, или задача сложнее описываемой?

JHeavy 23-11-2012 11:54 2031072

Да я просто не правильно объясняю похоже, если есть группа чекбоксов, как правило можно выбрать несколько, а мне нужно чтобы при выборе одного снималась галка с другого

pritoreanic 23-11-2012 13:50 2031165

R.i.m.s.k.y. спасибо с первой проблемой помог.

У меня тут проблема, сообщение "russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание." не появляется если выводить мышку в стороны красных стрелок и появляется где зеленая стрелка, как сделать что бы это сообщение появлялось в любом случае ?

R.i.m.s.k.y. 23-11-2012 13:55 2031170

pritoreanic, хз

Mailchik 23-11-2012 15:45 2031264

pritoreanic,
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

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

[CustomMessages]
russian.Desc=Описание:
russian.ComponentsDescription0=Наведите курсов мыши на компонент, что бы прочитать его описание.
russian.ComponentsDescription1=Minecraft 1.4.5
russian.ComponentsDescription2=1.
russian.ComponentsDescription3=12.
russian.ComponentsDescription4=123.
russian.ComponentsDescription5=1234.
russian.ComponentsDescription6=12345.
russian.ComponentsDescription7=123456.
russian.ComponentsDescription8=1234567.
russian.ComponentsDescription9=12345678.
russian.ComponentsDescription10=123456789.
russian.ComponentsDescription11=SMP-123.

[Components]
Name: main; Description: Minecraft; Flags: fixed; Types: custom compact full
Name: c\1; Description: rus; Flags: exclusive
Name: c\2; Description: eng; Flags: exclusive
Name: Component1; Description: kom;
Name: c\1; Description: AudioMod; Flags: fixed; Types: custom compact full
Name: c\2; Description: ModLoader; Flags: fixed; Types: custom compact full
Name: c\3; Description: Optifine;
Name: c\4; Description: TooManyItem;
Name: c\5; Description: Rei's Minimap;
Name: Component2; Description: s;
Name: c\1; Description: SMP-s;

[Files]
Source: "C:\InstallFiles\main\Minecraft.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: C:\InstallFiles\main\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Components: main
Source: C:\InstallFiles\comp1\*; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: C:\InstallFiles\comp2\*; DestDir: {app}; Flags: ignoreversion; Components: Component2

[code]
var
  DescRTV: TRichEditViewer;

procedure ComponentsListOnItemMouseMove(Sender: TObject; X, Y: Integer; Index: Integer; Area: TItemArea);
begin
  DescRTV.Text := CustomMessage('ComponentsDescription' + IntToStr(Index+1));
end;

procedure ComponentsListOnMouseLeave(Sender: TObject);
 begin
  DescRTV.Text := CustomMessage('ComponentsDescription0');
end;

procedure InitializeWizard;
begin
  with WizardForm do
  begin
    ComponentsList.SetBounds(ScaleX(0), SelectComponentsLabel.Top + SelectComponentsLabel.Height + ScaleY(5), (SelectComponentsPage.Width - ScaleX(5)) div 2, ScaleY(165));
    ComponentsList.OnItemMouseMove := @ComponentsListOnItemMouseMove;
    ComponentsList.OnMouseLeave := @ComponentsListOnMouseLeave;
    TypesCombo.Hide;


    DescRTV := TRichEditViewer.Create(nil)
    with DescRTV do
    begin
      Parent := SelectComponentsPage;
      SetBounds(ComponentsList.Left + ComponentsList.Width + ScaleX(5), ComponentsList.Top, ComponentsList.Width, ComponentsList.Height);
      ReadOnly := True;
      ScrollBars := ssVertical;
      Color := clBtnFace;
      RTFText := CustomMessage('ComponentsDescription0');
    end;
  end;
end;


JHeavy,
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: Test; Description: Test1; Types: Full;
Name: Test2; Description: Test22;

[Code]
procedure CompOnClick(Sender: TObject);
begin
  with WizardForm.ComponentsList do begin
  case ItemIndex of
    0 : Checked[1] := False;
    1 : Checked[0] := False;
  end;
  end;
end;

procedure InitializeWizard();
begin
  with WizardForm.ComponentsList do begin
    OnClickCheck:= @CompOnClick;
    CompOnClick(nil);
  end;
end;


Johny777 24-11-2012 20:33 2032049

Пацаны! Скажите пожалуйста чем можно заменить указатель в той или иной функции. Те например нужно воспользоваться вин апи функцией, а у неё один из входных параметров указатель
например function CopyFileEx(lpExistingFileName, lpNewFileName: PWideChar; lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool; dwCopyFlags: DWORD): BOOL; stdcall;
очень привлекательная функция которая может отображать прогресс копирования файла (суть не конкретно в ней, тк есть многo других с указателями)
но каким образом использовать её в инно. Как вообще поступать с Pointer-ом. В Windows.pas (Embarcadero RAD Studio/ Delphi 2010) они на каждом углу. Просветите меня пожалуйста на этот счёт!
читать дальше »
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
{ Define possible return codes from the CopyFileEx callback routine }

  PROGRESS_CONTINUE = 0;
  //EXTERNALSYM PROGRESS_CONTINUE
  PROGRESS_CANCEL = 1;
  //EXTERNALSYM PROGRESS_CANCEL
  PROGRESS_STOP = 2;
  //EXTERNALSYM PROGRESS_STOP
  PROGRESS_QUIET = 3;
  //EXTERNALSYM PROGRESS_QUIET
 
{ Define CopyFileEx callback routine state change values }

  CALLBACK_CHUNK_FINISHED = $00000000;
  //EXTERNALSYM CALLBACK_CHUNK_FINISHED
  CALLBACK_STREAM_SWITCH = $00000001;
  //EXTERNALSYM CALLBACK_STREAM_SWITCH


{ Define CopyFileEx option flags }

  COPY_FILE_FAIL_IF_EXISTS = $00000001;
  //EXTERNALSYM COPY_FILE_FAIL_IF_EXISTS
  COPY_FILE_RESTARTABLE = $00000002;
  //EXTERNALSYM COPY_FILE_RESTARTABLE

type
  Pointer = ?;
  TFarProc = Pointer;
  TFNProgressRoutine = TFarProc;
  PBool = BOOL;
 
    _ULARGE_INTEGER = record
        LowPart: DWORD;
        HighPart: DWORD;
    end;
   
   
function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
    Result := $7FFFFFFF;
    Result := ((QuadPart.HighPart + integer(QuadPart.LowPart < 0))*Result + QuadPart.HighPart + integer(QuadPart.LowPart < 0))*2 + QuadPart.LowPart;
end;

function CopyCallBack(TotalFileSize, TotalBytesTransferred, StreamSize, StreamBytesTransferred: _ULARGE_INTEGER;
dwStreamNumber, dwCallbackReason: DWORD; hSourceFile: THandle; hDestinationFile: THandle; ProgressBar : TNewProgressBar): DWORD;
var
  newpos: Integer;
begin
  Result := PROGRESS_CONTINUE;
  if dwCallbackReason = CALLBACK_CHUNK_FINISHED then
  begin
    newpos := Round(Size64(TotalBytesTransferred) / Size64(TotalFileSize) * 100);
    with Progressbar do
      if newpos <> Position then
        Position := newpos;
    Application.ProcessMessages;
  end;
end;

function CopyFileEx(lpExistingFileName, lpNewFileName: String; lpProgressRoutine: TFNProgressRoutine; lpData: Pointer; pbCancel: PBool; dwCopyFlags: DWORD): BOOL; external 'CopyFileEx{#A}@kernel32.dll stdcall';


habib2302 25-11-2012 12:23 2032388

как сделать растяжение wizard small image на деинсталляторе с сокрытием лейбелов и как сделать,чтобы кликабельное лого отображалось в деинсталляторе
вот скрипт на отображение лого в инсталляторе

читать дальше »


[Files]
Source: logo.bmp; Flags: dontcopy

[code]
procedure InitializeWizard;
//Лого
var BtnImage: TBitmapImage;
begin
RedesignWizardForm;
ExtractTemporaryFile('logo.bmp');
BtnImage:= TBitmapImage.Create(WizardForm);
BtnImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp'));
BtnImage.SetBounds(20, 315, 154, 42); {первые 2 параметра - координаты левогого верхнего угла по горизонтали и вертикали, дальше ширина и высота, до которой растянуть}
BtnImage.Parent:= WizardForm;
BtnImage.Stretch:= True;

Mailchik 25-11-2012 12:39 2032399

Цитата:

Цитата habib2302
как сделать растяжение wizard small image на деинсталляторе с сокрытием лейбелов

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
procedure InitializeUninstallProgressForm();
 begin
  with UninstallProgressForm do
  begin
  WizardSmallBitmapImage.SetBounds(MainPanel.Left, MainPanel.Top, ClientWidth, MainPanel.Height);
  PageNameLabel.Hide;
  PageDescriptionLabel.Hide;
  end;
end;

Цитата:

Цитата habib2302
как сделать,чтобы кликабельное лого отображалось в деинсталляторе

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
BitmapResource=logo:logo.bmp

[Code]
procedure InitializeUninstallProgressForm();
 begin
  with TBitmapImage.Create(nil) do begin
    Parent := UninstallProgressForm;
    Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
    Stretch:= true;
    SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
  end;
end;


Johny777, Pointer в Inno не получится использовать, насколько я знаю.

habib2302 25-11-2012 13:20 2032429

Цитата:

Цитата Mailchik
растяжение wizard small image на деинсталляторе с сокрытием лейбелов »

вместо wizard small image на деинсталляторе отображается иконка деинсталлятора

Цитата:

Цитата Mailchik
кликабельное лого отображалось в деинсталляторе »

выдает ошибку

Mailchik 25-11-2012 13:59 2032457

Цитата:

Цитата habib2302
вместо wizard small image на деинсталляторе отображается иконка деинсталлятора

Так я же не знаю какой файл у вас в bitmap. Я лишь пример дал, как сделать то, что вы просите.
Цитата:

Цитата habib2302
выдает ошибку

Нужна расширенная версия от restools. Попробуйте InnoUltra

habib2302 25-11-2012 15:03 2032492

Цитата:

Цитата Mailchik
Так я же не знаю какой файл у вас в bitmap. Я лишь пример дал, как сделать то, что вы просите. »

у меня формат .bmp
Цитата:

Цитата Mailchik
Нужна расширенная версия от restools. Попробуйте Inno Ultra »

у меня как раз и стоит inno setup ultra full ver. Обновлено 2 Октября 2012г

Цитата:

Цитата habib2302
кликабельное лого отображалось в деинсталляторе »

скрипт на лого заработало!!!

El Sanchez 25-11-2012 20:07 2032676

Цитата:

Цитата Johny777
Скажите пожалуйста чем можно заменить указатель в той или иной функции. »

Пример: функция CreateFile параметр lpSecurityAttributes (описание: A pointer to a SECURITY_ATTRIBUTES structure...)
Чем заменить:
  1. Целочисленной переменной типа Integer, Longint, Cardinal, DWORD - CreateFile(..., lpSecurityAttributes: Longint, ...): BOOL;
  2. Переменной типа, на которую указывает указатель - CreateFile(..., lpSecurityAttributes: SECURITY_ATTRIBUTES, ...): BOOL; Имеет смысл, если нужно заполнять самому структуру нужными данными. В функцию передается не указатель, а переменная lpSecurityAttributes, точнее ссылка на объект структурного типа SECURITY_ATTRIBUTES. Т.к. ссылки основаны на указателях, передача ссылки вместо указателя не ошибка.
P.S. Иногда при описании параметра какой-либо функции встречается запись "A pointer to a buffer...". В таком случае нужно использовать символьный (реже - байтовый) массив определенного размера (может указываться при описании параметров функции или вычисляться непосредственно при отработке функции).

Johny777, без остановок, пауз, с отменой операции, тупо копирование:
читать дальше »

Код:

[code]
#define A = (Defined UNICODE) ? "W" : "A"

const
    PROGRESS_CONTINUE = 0;
    PROGRESS_CANCEL = 1;
    CALLBACK_CHUNK_FINISHED = $0;
   
var
    ProgressPage: TOutputProgressWizardPage;
    CancelButton: TButton;
    bCancel: BOOL;

function CopyFileEx(lpExistingFileName, lpNewFileName: String; lpProgressRoutine, lpData: Longint; var pbCancel: BOOL; dwCopyFlags: DWORD): BOOL; external 'CopyFileEx{#A}@kernel32.dll stdcall';
function PathIsDirectory(pszPath: String): BOOL; external 'PathIsDirectory{#A}@shlwapi.dll stdcall';

/////////////////////////////////////////////////////////////
function Size64(LowPart: Longint; HighPart: DWORD): Extended;
begin
    Result := (HighPart + integer(LowPart < 0))*4.294967296E9 + LowPart;
end;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function CopyProgressRoutine(TotalFileSizeLo, TotalFileSizeHi, TotalBytesTransferredLo, TotalBytesTransferredHi, StreamSizeLo, StreamSizeHi, StreamBytesTransferredLo, StreamBytesTransferredHi: Longint; dwStreamNumber, dwCallbackReason: DWORD; hSourceFile, hDestinationFile: THandle; lpData: Longint): DWORD;
begin
    if bCancel then Result := PROGRESS_CANCEL else Result := PROGRESS_CONTINUE;
    case dwCallbackReason of
        CALLBACK_CHUNK_FINISHED: begin
            ProgressPage.SetText(Format('%s: %s', ['Файл', CastIntegerToString(lpData)]), Format('%s: %d %%', ['Прогресс', Round(100*Size64(TotalBytesTransferredLo, TotalBytesTransferredHi)/Size64(TotalFileSizeLo, TotalFileSizeHi))]));
            ProgressPage.SetProgress(Round(100*Size64(TotalBytesTransferredLo, TotalBytesTransferredHi)/Size64(TotalFileSizeLo, TotalFileSizeHi)), 100);
        end;
    end;
end;

///////////////////////////////////////////////
procedure CancelButtonOnClick(Sender: TObject);
begin
    bCancel := True;
end;

/////////////////////////////////
procedure CreateCopyProgressPage;
begin
    ProgressPage := CreateOutputProgressPage('Копирование файлов', '');
    CancelButton := TButton.Create(ProgressPage);
    with CancelButton do
    begin
        Parent := ProgressPage.Surface;
        SetBounds(ProgressPage.ProgressBar.Width - WizardForm.CancelButton.Width, ProgressPage.ProgressBar.Top + ProgressPage.ProgressBar.Height + ScaleY(10), WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
        Caption := SetupMessage(msgButtonCancel);
        OnClick := @CancelButtonOnClick;
    end;
end;

///////////////////////////////////////////////////////////////////////////////////////////////////////
function FindFiles(const pFrom, pTo: String; const Recurse: Boolean; const szRootDir: String): Integer;
var
    FR: TFindRec;
    szFileName: String;
begin
    if FindFirst(pFrom, FR) then
    try
        repeat
            if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
            begin
                if not DirExists(Format('%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom))])) then ForceDirectories(Format('%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom))]));
                szFileName := MinimizePathName(Format('%s\%s', [ExtractFileDir(pFrom), FR.Name]), WizardForm.Font, WizardForm.OuterNotebook.ClientWidth - ScaleX(50));
                CopyFileEx(Format('%s\%s', [ExtractFileDir(pFrom), FR.Name]), Format('%s\%s\%s', [pTo, ExtractRelativePath(szRootDir, ExtractFilePath(pFrom)), FR.Name]), CallbackAddr('CopyProgressRoutine'), CastStringToInteger(szFileName), bCancel, 0);
                Result := DLLGetLastError;
                if bCancel then Exit;
            end;
        until not FindNext(FR);
    finally
        FindClose(FR);
    end;
    //
    if not Recurse then Exit;
    if FindFirst(Format('%s\*', [ExtractFileDir(pFrom)]), FR) then
    try
        repeat
            if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and (FR.Name <> '.') and (FR.Name <> '..') then
                FindFiles(Format('%s\%s\%s', [ExtractFileDir(pFrom), FR.Name, ExtractFileName(pFrom)]), pTo, Recurse, szRootDir);
        until not FindNext(FR);
    finally
        FindClose(FR);
    end;
end;

//////////////////////////////////////////////////////////////////////////
function xcopy(const pFrom, pTo: String; const Recurse: Boolean): Integer;
// pFrom - source path. wildcard allowed
// pTo - destination path
// Recurse - recursion flag
begin
    if PathIsDirectory(pFrom) then
    begin
        if not DirExists(pFrom) then Exit;
        pFrom := Format('%s\*', [pFrom]);
    end else if not DirExists(ExtractFileDir(pFrom)) then Exit;
    Result := FindFiles(pFrom, pTo, Recurse, ExtractFilePath(pFrom));
end;


/////////////////////////////
procedure InitializeWizard();
begin
    CreateCopyProgressPage;
end;


//////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
    if CurPageID = wpWelcome then
    begin
        ProgressPage.Show;
        xcopy('c:\Temp', 'd:\test', True);
        //xcopy('c:\temp\te st\*.dll', 'd:\test', True);
        //xcopy('c:\Temp\ffc\FileFormatConverters.7z', 'c:\Temp\FileFormatConverters.7z', False);
        //xcopy('c:\temp\t est\123', 'c:\temp\t est\1234', True);
        ProgressPage.Hide;
        Result := True;
    end;
    Result := True;
end;


Johny777 26-11-2012 03:03 2032889

El Sanchez, спасибо, кажись догоняю:
Если значение/значения из переменной, на которую указывает указатель не нужно можно заменять в функциях/процедурах указатели на целочисленные Integer, Longint, Cardinal, DWORD... чтоб компилятор не ругался на неизвестный тип. Это делается когда из переменной или из переменной ссылающейся на структурный тип, на которую указывает указатель брать ничего не нужно

Если значение/значения нужно, то:
- если указатель на какую-то простую переменную (например type PInteger = ^Integer - указатель на целое число), то в заголовке функции можно заменить PInteger на Integer. Например:
function GetVolumeInformation(lpRootPathName, lpVolumeNameBuffer: String; nVolumeNameSize, lpVolumeSerialNumber: PDWORD(меняем на DWORD); var lpMaximumComponentLength, lpFileSystemFlags: DWORD; lpFileSystemNameBuffer: String; nFileSystemNameSize: DWORD): BOOL; external 'GetVolumeInformation{#A}@kernel32.dll stdcall';
- если указатель на переменную структуры (var MyVariable :SECURITY_ATTRIBUTES), то нужно описать SECURITY_ATTRIBUTES в разделе type и присвоить этот тип соответствующим переменным (в заголовке ф-ции и в разделе var)
короче суть в том что указатель можно заменить на переменную,
если указатель на буфер то методом проб и ошибок подставляем array [0..число] of Char или array [0..число] of Byte

Цитата:

Цитата El Sanchez
без остановок, пауз, тупо копирование »

Спасибо! :)

R.i.m.s.k.y. 26-11-2012 09:35 2032947

как в начале установщика получать права "от администратора"?
и запускать из установщика экзешники с такими же правами

Johny777 26-11-2012 14:42 2033143

R.i.m.s.k.y., по умолчанию ты инсталл без прав админа не запустишь, а чтобы отключить нужно настраивать директиву секции [Setup] PrivilegesRequired=не админ
если запускаешь не как админ, то получаешь вот такое окно от винды

Цитата:

Цитата R.i.m.s.k.y.
запускать из установщика экзешники с такими же правами »

через встроенную функцию
function ExecAsOriginalUser(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
хотя уверен достаточно и обычных
function Exec(const Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ResultCode: Integer): Boolean;
function ShellExec(const Verb, Filename, Params, WorkingDir: String; const ShowCmd: Integer; const Wait: TExecWait; var ErrorCode: Integer): Boolean;
или секции [RUN]
ведь если инсталл запущен и работает, то мы уже зашли под админом и по дефолту запускается все с его правами

R.i.m.s.k.y. 26-11-2012 14:43 2033145

Johny777
ненене
я не зря привел скриншот, PrivilegesRequired проверка на входимость пользователя в системную локальную/доменную группу Администраторы
А на моем скрине выше - запуск от root-администратора (в лине это root, в винде не знаю как называется, причем пользователь Администратор и вот этот root-администратор - разные вещи, у последнего ВСЕ права на ВСЁ, в тч на реестр)
Вот такой запуск мне и нужен, от root'a

El Sanchez 26-11-2012 17:53 2033331

Цитата:

Цитата Johny777
если указатель на переменную структуры (var MyVariable :SECURITY_ATTRIBUTES), то нужно описать SECURITY_ATTRIBUTES в разделе type и присвоить этот тип соответствующим переменным (в заголовке ф-ции и в разделе var)
короче суть в том что указатель можно заменить на переменную »

Johny777, указатель и есть переменная, хранящая адрес переменной, на которую указывает указатель. Адрес - число из диапазона целых чисел от 0 до 2^31-1 (диапазон адресов памяти, доступных 32-разрядному процессу). За неимением указателей в Inno последние можно заменить переменными целочисленного типа, доступными хранить числа из вышеуказанного диапазона.
Теперь опять про CreateFile с параметром lpSecurityAttributes. Можно объявить как lpSecurityAttributes: SECURITY_ATTRIBUTES, заполнить самому структуру и в функцию передать объявленную переменную типа SECURITY_ATTRIBUTES, а можно объявить как lpSecurityAttributes: Longint, вычислить адрес объявленной переменной самому (сам понимаешь, что в Inno адрес такой переменной не получить. Исключение: для переменной строкового типа можно получить ее адрес при помощи ф-ии CastStringToInteger) и передать в функцию. Но 0 передать можно (This parameter can be NULL).
В общем, для просветления кармы почитай http://www.transl-gunsmoker.ru/2009/09/blog-post.html

Цитата:

Цитата R.i.m.s.k.y.
причем пользователь Администратор и вот этот root-администратор - разные вещи, у последнего ВСЕ права на ВСЁ, в тч на реестр »

R.i.m.s.k.y., это один и тот же пользователь. Установщику с дефолтным (admin) значением директивы PrivilegesRequired до лампочки ПКМ Запуск от имени администратора.

Mailchik 26-11-2012 21:29 2033467

Цитата:

Цитата Johny777
Скажите пожалуйста как добавлять цветные строки в TListBox.Items.Add для события OnDrawItem TDrawItemEvent = procedure(Control: TWinControl; Index: Integer; Rect: TRect; State: Byte); не хочет работать

это событие заложено, но видимо еще не реализовано. надо ждать, когда restools реализуют.

R.i.m.s.k.y. 27-11-2012 11:18 2033765

Цитата:

Цитата El Sanchez
R.i.m.s.k.y., это один и тот же пользователь. »

нет, не один и тот же
При запуске от рут-админа (как на скрине выше) доступны локальные ресурсы пользователя, но с админскими правами, а если запустить от имени другого пользователя и ввести "Администратор" - пасс, ресурсы совсем другие
Энивей по вашей логике должен работать скрипт
Код:

[Setup]
AppId={{DACC4133-A178-4B85-842A-58B74AEDE27E}
AppName=My Program
AppVersion=1.5
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
DisableProgramGroupPage=yes
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes
PrivilegesRequired=admin

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TS\UserChoice; ValueType: string; ValueName: ProgId; ValueData: Applications\mpc-hc.exe

однако ошибка доступа
Код:

---------------------------
Ошибка
---------------------------
Ошибка создания ключа реестра:

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TS\UserChoice



RegCreateKeyEx: сбой; код 5.

Access is denied.



Нажмите «Повтор», чтобы повторить попытку, «Пропустить», чтобы пропустить файл, или «Отказ» для отмены установки.
---------------------------
Abort  Retry  Ignore 
---------------------------


TecktonEast 27-11-2012 14:45 2033911

del.

habib2302 27-11-2012 21:28 2034226

люди.помогите мне объединить эти два скрипта

Код:

procedure InitializeUninstallProgressForm();
begin
  with TBitmapImage.Create(nil) do
begin
                Parent := UninstallProgressForm;
                Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
                Stretch:= true;
                SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42)); {первые 2 параметра - координаты левогого верхнего угла по горизонтали и вертикали, дальше ширина и высота, до которой растянуть}
  end;
end;

Код:

procedure InitializeUninstallProgressForm();
begin
FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
with UninstallProgressForm.WizardSmallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
end;
end;


pritoreanic 28-11-2012 01:32 2034382

Цитата:

Цитата habib2302
habib2302 »

читать дальше »
Код:

procedure InitializeUninstallProgressForm();
begin
  with TBitmapImage.Create(nil) do
begin
  Parent := UninstallProgressForm;
  Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
  Stretch:= true;
  SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
  end;
end;

begin
 FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
with UninstallProgressForm.WizardSmallBitmapImage do
  begin
  Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
  end;
end.


SoulSide 28-11-2012 13:52 2034628

Цитата:

Цитата R.i.m.s.k.y.
как в начале установщика получать права "от администратора"? »

Никак! Inno не умеет этого делать.

На всё про всё пара примеров.
Пример первый

Код:

[Setup]
PrivilegesRequired=admin
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Dirs]
Name: {app}; Permissions: everyone-modify

Код:

Permissions: admins-full
Permissions: authusers-full
Permissions: everyone-full
Permissions: powerusers-full
Permissions: system-full
Permissions: users-full


Пример второй

Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
; программа установки обнаружит работает ли он, как повышенный пользователь администратора и по умолчанию путь установки в Program Files
DefaultDirName={code:DefDirRoot}\AppName
DefaultGroupName=My Program
OutputDir=.

;Это приведет к тому, чтобы запустить программу установки без подъема для не-администратора пользователей из под Windows.
PrivilegesRequired=none

[*Code]
function IsRegularUser(): Boolean;
begin
Result := not (IsAdminLoggedOn or IsPowerUserLoggedOn);
end;

function DefDirRoot(Param: String): String;
begin
if IsRegularUser then
Result := ExpandConstant('{localappdata}')
else
Result := ExpandConstant('{pf}')
end;



Как вы правильно заметили
Цитата:

Цитата R.i.m.s.k.y.
root-администратора »

как в линукс.

Цитата:

Цитата El Sanchez
это один и тот же пользователь. Установщику с дефолтным (admin) значением директивы PrivilegesRequired до лампочки ПКМ Запуск от имени администратора. »

Не путать с Администратором Windows.

Как не пытайтесь. вот это:
Код:

[Registry]
Root: HKLM; Subkey: SYSTEM\CurrentControlSet\Enum\Root\LEGACY_MY_HARDWARE_SERVICE; ValueType: dword; ValueName: NextInstance; ValueData: $00000001; Flags: uninsdeletekeyifempty uninsdeletevalue

Даже из под админа загнать не получится.

Про добавление привилегий папке или файлу, вообще молчу.

Добавлю: Ни разу не пробовал, но уверен что например NSIS способен дать повышенные привилегии, Inno нет.

R.i.m.s.k.y. 28-11-2012 14:03 2034631

Цитата:

Цитата SoftLine
Никак! Inno не умеет этого делать. »

я в курсе что инно этого не сделает, но ведь из под инно можно вызвать что-нибудь чтобы внести изменения? к примеру хитрый запуск reg import
Если можно расширить вопрос не только записью в реестр но запуском приложений от рут-админа

El Sanchez 29-11-2012 23:07 2035603

Цитата:

Цитата R.i.m.s.k.y.
При запуске от рут-админа (как на скрине выше) доступны локальные ресурсы пользователя, но с админскими правами, а если запустить от имени другого пользователя и ввести "Администратор" - пасс, ресурсы совсем другие »

R.i.m.s.k.y., все верно, за исключением рут-админа, ну нет его и все тут. Члены группы Администраторы и сам встроенный Администратор работают с правами обычного пользователя. При входе в систему администраторы получают 2 маркера доступа, регулирующих их права в системе - пользовательский и администраторский. Рабочий стол и Explorer.exe работают с правами обычного пользователя, запущенные процессы будут являться дочерними от своего Explorer-родителя и будут наследовать его права, т.е. запускаться с правами обычного пользователя. Но как только запуск приложения потребует от системы каких-либо привилегий (доступ в системные папки, определенные кусты реестра) наличие администраторского маркера позволяет повысить права в системе. При этом отображается запрос UAC для повышения прав и при согласии приложение начинает работу с администраторскими привилегиями пользователя. Отличие же встроенного Администратора от остальных админских учеток только в том, что для Администратора запрос UAC не появляется, для него в случае необходимости права повышаются автоматически. Также система сама определяет какие из приложений требуют повышения привилегий, делает это она, если не ошибаюсь, через службу Сведения о приложении. Наличие манифеста у исполняемого файла приложения с указанным уровнем привилегий, цифровая подпись помогут корректно определить службе уровень необходимых привилегий для запуска. В Inno Setup манифест подключается через секцию Setup, директива PrivilegesRequired, значение по умолчанию admin. No comments.
Однако есть приложения, уровень доступа которого определить система или не может, или нет необходимости. Это либо какое-нибудь старое, не подготовленное к работе в системе с UAC, приложение (без манифеста, без подписи, от неизвестного издателя), либо, например, та же консоль - cmd.exe. Запуск ее не требует админских прав, запустится она с правами обычного пользователя, но с помощью нее можно пытаться выполнять команды, доступные администраторам, например, копирование в системную директорию system32 или в корень системного диска. Естественно ничего не выйдет, ведь консоль работает с правами обычного пользователя. Вот для таких программ, для которых уровень доступа определить нельзя или нет необходимости, но запустить их с повышенными правами очень хочется и сделана опция в контекстном меню "Запуск от имени администратора". Это не запуск с правами от какого-то мифического супер-пупер администратора, а повышение своих же прав согласно наличию выданного системой администраторского маркера доступа. Microsoft-у следовало бы назвать эту опцию, например, "Запуск с повышенными правами", однако решили, что оттягивающее на себя слово "...администратора" убедит пользователя спать спокойно и не волноваться, что его урезали в правах (IMHO, конечно :)). Вот как-то так.

Цитата:

Цитата R.i.m.s.k.y.
Энивей по вашей логике должен работать скрипт »

Цитата:

Цитата R.i.m.s.k.y.
Ошибка создания ключа реестра:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.TS\UserChoice »

R.i.m.s.k.y., тут у меня один вариант. Этот лог при запуске сетапа от имени учетной записи Администратор с вводом учетных данных (логин - пасс). Администратор активирован, пароль присвоен, но входа в учетку никогда не было, следовательно профиля нет, пользовательского куста реестра нет, писать некуда.

Цитата:

Цитата SoftLine
Как не пытайтесь. вот это:
Код:
[Registry]
Root: HKLM; Subkey: SYSTEM\CurrentControlSet\Enum\Root\LEGACY_MY_HARDWARE_SERVICE; ValueType: dword; ValueName: NextInstance; ValueData: $00000001; Flags: uninsdeletekeyifempty uninsdeletevalue
Даже из под админа загнать не получится. »

SoftLine, верно, не получится. В указанный куст имеет право писать только пользователь SYSTEM, остальные только читают. Хотите туда писать - раздавайте права самостоятельно.

Johny777 30-11-2012 01:04 2035653

Пацаны, помогите пожалуйста создать настоящий генератор случайных чисел!
дело в том, что функция random основана на математике, а потому числа которые она возвращает не хаотичны, много повторов подряд
перевернул форумы и понял, что единственный способ получить настоящее случайное число описан здесь http://habrahabr.ru/post/62237/
за исключением получения их из квантового вакуума http://www.lenta.ru/news/2012/04/16/randomiser/ :)
а именно "запись помех электропитания" звуковой карты в буфер, считывание оттуда значения
грубо говоря мне нужен "более рандомный рандом"
в общем импортировал из MMSystem.pas функции и структуры данных, и перевернул форумы по записи с микофона и вообще записи, но сложновато
прошу помочь по возможности!
код:
читать дальше »
Код:

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

[  Code]
const
  WAVE_FORMAT_PCM = 1;

type
  tWAVEFORMATEX = record
    wFormatTag: Word;        { format type }
    nChannels: Word;          { number of channels (i.e. mono, stereo, etc.) }
    nSamplesPerSec: DWORD;  { sample rate }
    nAvgBytesPerSec: DWORD; { for buffer estimation }
    nBlockAlign: Word;      { block size of data }
    wBitsPerSample: Word;  { number of bits per sample of mono data }
    cbSize: Word;          { the count in bytes of the size of }
  end;
 
  wavehdr_tag = record
    lpData: PAnsiChar;          { pointer to locked data buffer }
    dwBufferLength: DWORD;      { length of data buffer }
    dwBytesRecorded: DWORD;    { used for input only }
    dwUser: DWORD;              { for client's use }
    dwFlags: DWORD;            { assorted flags (see defines) }
    dwLoops: DWORD;            { loop control counter }
    lpNext: Integer;          { reserved for driver }
    reserved: DWORD;            { reserved for driver }
  end;

function waveInOpen(lphWaveIn: Integer; uDeviceID: UINT; lpFormatEx: tWAVEFORMATEX; dwCallback, dwInstance, dwFlags: DWORD): UINT; external 'waveInOpen@winmm.dll stdcall';
function waveInPrepareHeader(hWaveIn: Integer; lpWaveInHdr: wavehdr_tag; uSize: UINT): UINT; external 'waveInPrepareHeader@winmm.dll stdcall';
function waveInAddBuffer(hWaveIn: Integer; lpWaveInHdr: wavehdr_tag; uSize: UINT): UINT; external 'waveInAddBuffer@winmm.dll stdcall';
function waveInUnprepareHeader(hWaveIn: Integer; lpWaveInHdr: wavehdr_tag; uSize: UINT): UINT; external 'waveInUnprepareHeader@winmm.dll stdcall';
function waveInClose(hWaveIn: Integer): UINT; external 'waveInClose@winmm.dll stdcall';
function waveInStart(hWaveIn: Integer): UINT; external 'waveInStart@winmm.dll stdcall';
function waveInReset(hWaveIn: Integer): UINT; external 'waveInReset@winmm.dll stdcall';
function waveInStop(hWaveIn: Integer): UINT; external 'waveInStop@winmm.dll stdcall';



procedure InitializeWizard;
var
  Noise : tWAVEFORMATEX;
begin
  Noise.wFormatTag := WAVE_FORMAT_PCM;
  Noise.nChannels := 1;
  Noise.wBitsPerSample := 16;
  Noise.nSamplesPerSec := 11025;//
  Noise.cbSize:=Noise.wBitsPerSample div 8 * Noise.nChannels;
  Noise.nAvgBytesPerSec:=Noise.nSamplesPerSec * Noise.nBlockAlign;
  Noise.cbSize:=0;
end;



PS: извините, что выношу вам мозг своими злостными потребностями :blush:

RodionSabitov 30-11-2012 11:57 2035818

Доброго времени суток! Как сделать такой серийный номер, который будет зависеть от каких-либо параметров компьютера?
Идея в том, чтобы клиент скидывал мне серийный номер, а я ему отправлял правильный пароль.

есть функция (взята из справки, как просто вводить определенный серийный номер), например по маске:

function CheckSerial(Serial: String): Boolean;
var
mask:string;
i:Integer;
begin
Result:=True;
mask:='####-####-##****';
If Length(Serial)<>Length(mask) then
begin
Result:=False;
exit;
end;
For i:=1 to Length(mask) do
begin
If StrGet(mask, i)='#' then
If not ((Ord(StrGet(Serial, i))>=48) and (Ord(StrGet(Serial, i))<=57)) then
begin
Result:=False;
exit;
end;
If StrGet(mask, i)='*' then
If not ((StrGet(Serial, i)>='A') and (StrGet(Serial, i)<='Z')) then
begin
Result:=False;
exit;
end;
end;
end;

Johny777 01-12-2012 16:41 2036508

RodionSabitov, думаю твой случай WinApi функция http://ru.wikipedia.org/wiki/CryptGenRandom которая выдаёт число собранное из
читать дальше »

ID текущего процесса.
ID текущей нити исполнения.
Число тактов с момента последней загрузки.
Текущее время.
Различные высокоточные счётчики.
Хэш-функции MD4 от персональных данных пользователя, таких как логин, имя компьютера, и др.
Высокоточные внутрипроцессорные счётчиков, таких как RDTSC, RDMSR, RDPMC.
...

только портировать сей код http://www.sql.ru/forum/actualthread.aspx?tid=467265 для меня не намного легче чем из моего предыдущего поста :(

=====================================================================

помню спрашивал http://forum.oszone.net/post-1945197-379.html и El Sanchez дал классный код http://forum.oszone.net/post-1945281-380.html
на определение рабочей папки процесса, после чего я убивал процесс через ком строку Exec('taskkill', '/f /im hl2.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode);
но вот 2 проблемы
1: как узнать, что процесс убит? Можно после команды консоли проверть есть ли этот процесс, но как-то это не очень удобно!
2: Запущено 5 одинаковых процессов из разных директорий, а нужно убить только 1 нли 2 из них, но не все (не мой случай), но всё-таки :)...
намутил код на основе http://forum.oszone.net/post-1945281-380.html под свои нужды
ключевая функция function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
Убиение процесса function KillTaskEx(ExeFileName: String): Boolean;
функция возвращает булев значение (убила, не убила процесс)
входным параметром может быть:
1. Имя процесса - будут завершаться все процессы с этим именем ...if KillTaskEx('calc.exe') then MsgBox('OK', mbInformation, MB_OK);
2. Путь к файлу от которого исходит процесс (рабочая директория) ...if KillTaskEx('C:\calc.exe') then MsgBox('OK', mbInformation, MB_OK);
во втором случае завершится процесс/процессы только из этой директории!
забирайте кому нужно код:
читать дальше »
Код:

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

[code]
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_QUERY_INFORMATION = $400;
    PROCESS_VM_READ = $10;
    MAX_PATH = 260;
    PROCESS_TERMINATE = $0001;

type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of char;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): Boolean; external 'CloseHandle@kernel32.dll stdcall';  /// есть в функциях мутекса в самом верху
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameExA@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';

function CharArrayToString(cArray: array of Char): String;
begin
    Result := '';
    while cArray[Length(Result)] <> #0 do Insert(cArray[Length(Result)], Result, Length(Result)+1);
end;


function KillTaskEx(ExeFileName: String): Boolean;
var
  ContinueLoop: BOOL;
  hProcessSnap, hProc: THandle;
  pe32: TPROCESSENTRY32;
  szExeFile: array [0..MAX_PATH-1] of Char;
begin
  hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
  pe32.dwSize := SizeOf(pe32);
  ContinueLoop := Process32First(hProcessSnap, pe32);
  while ContinueLoop do
  begin
    if ExtractFilePath(ExeFileName) <> '' then
    begin
      hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pe32.th32ProcessID);
      if GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH) > 0 then
        if CompareText(CharArrayToString(szExeFile), ExeFileName) = 0 then
          Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE, False, pe32.th32ProcessID), 0);
      CloseHandle(hProc);
    end else
    if ExtractFilePath(ExeFileName) = '' then
      if (UpperCase(CharArrayToString(pe32.szExeFile)) = UpperCase(ExeFileName)) then
        Result := TerminateProcess(OpenProcess(PROCESS_TERMINATE, False, pe32.th32ProcessID), 0);
    ContinueLoop := Process32Next(hProcessSnap, pe32);
  end;
  CloseHandle(hProcessSnap);
end;


procedure InitializeWizard();
var
  ErrorCode, i: Integer;
begin
  if FileCopy(ExpandConstant('{sys}\calc.exe'), 'C:\calc.exe', False) then
  begin
    MsgBox('для демонстрации скопирован калькулятор в C:\calc.exe', mbInformation, MB_OK);
   
    for i := 0 to 3 do Exec(ExpandConstant('C:\calc.exe'), '', '', SW_SHOW, ewNoWait, ErrorCode);
    for i := 0 to 7 do Exec(ExpandConstant('calc.exe'), '', '', SW_SHOW, ewNoWait, ErrorCode);
   
    MsgBox('запущено 4 калькулятора из C:\ и 8 из папки винды', mbInformation, MB_OK);
   
    if KillTaskEx('C:\calc.exe') then MsgBox('убито 4 калькулятора из C:\', mbInformation, MB_OK);
    if KillTaskEx('calc.exe') then MsgBox('убиты все остальные', mbInformation, MB_OK);
  end;
end;


El Sanchez 01-12-2012 17:54 2036545

Johny777, TerminateProcess стоит применять в крайнем случае, когда другие способы завершения процесса не помогают. Нужно послать окну программы сообщение WM_CLOSE, подождать 5 сек (где-то читал, что приложение считается зависшим, если не отвечает на действия системы в течение 5 сек.) и только потом TerminateProcess, если нужно.

читать дальше »

Код:

const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    WM_CLOSE = $10;
    WAIT_OBJECT_0 = $0;
    TA_FAILED = 0;
    TA_SUCCESS_CLEAN = 1;
    TA_SUCCESS_KILL = 2;
    SYNCHRONIZE = $100000;
    PROCESS_TERMINATE = $1;

type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..MAX_PATH-1] of Char;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

function CharArrayToString(aChar: array of Char): String;
begin
    Result := '';
    while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;

function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
    dwID: DWORD;
begin
    GetWindowThreadProcessId(hwnd, dwID) ;
    if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
    Result := True;
end;

function TerminateApp(const ProcessName: String; dwTimeout: DWORD): DWORD;
var
    hProcessSnap, hProc: THandle;
    pe32: TPROCESSENTRY32;
begin
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    try
        pe32.dwSize := SizeOf(pe32);
        if not Process32First(hProcessSnap, pe32) then Exit;
        while Process32Next(hProcessSnap, pe32) do
        begin
            if CompareText(CharArrayToString(pe32.szExeFile), ProcessName) = 0 then
            begin
                hProc := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, pe32.th32ProcessID);
                if hProc = TA_FAILED then Exit;
                try
                    EnumWindows(CallbackAddr('EnumWindowsProc'), pe32.th32ProcessID);
                    if WaitForSingleObject(hProc, dwTimeout) = WAIT_OBJECT_0 then
                        Result := TA_SUCCESS_CLEAN
                    else if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL else Result := TA_FAILED;
                finally
                    CloseHandle(hProc);
                end;
            end;
        end;
    finally
        CloseHandle(hProcessSnap);
    end;
end;

procedure InitializeWizard();
begin
    TerminateApp('calc.exe', 5000);
end;


R.i.m.s.k.y. 01-12-2012 18:30 2036565

Цитата:

Цитата El Sanchez
где-то читал, что приложение считается зависшим, если не отвечает на действия системы в течение 5 сек. »

в реестре наверное

HKCU\Control Panel\Desktop
"HungAppTimeout"="5000"

так что ждать нужно не 5сек, а значение параметра HungAppTimeout

Johny777 02-12-2012 03:33 2036870

Цитата:

Цитата R.i.m.s.k.y.
значение параметра HungAppTimeout »

вероятнее всего это 5000 миллисекунд = 5 секунд, ваш Кэп.
==========================================================

El Sanchez, Ты можешь пожалуйста научить свою функцию так чтоб она ещё и путь к файлу сравнивала как у меня, ну короче чтоб при необходимости только определённые процессы завершать.
(а то получается грохнули одного Васю, другого, а фамилию не спросили)
Я боюсь это делать, тк когда свою функцию ваял мне показали 2 раза синий экран, и сейчс ещё раз когда твою функцию дополнял :)
Цитата:

Цитата El Sanchez
TerminateProcess стоит применять в крайнем случае, когда другие способы завершения процесса не помогают »

не знал, но ради интереса поискал другие более гуманные способы, других не нашёл. Ну кроме закрытия окна программы:
Цитата:

Цитата El Sanchez
Нужно послать окну программы сообщение WM_CLOSE »

гуманных не нашёл, но наткнулся на более зверский: :)
http://www.delphisources.ru/forum/sh...ad.php?t=21276
хотя там тоже TerminateProcess, но уже для системных процессов, путём поднятия привилегий текущему процессу, как я понимаю

пртировал, не тестил (боюсь)

читать дальше »
Код:

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

[noparse][code][/npparse]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
    TOKEN_ADJUST_PRIVILEGES = $32;
    TOKEN_QUERY = $8;
    SE_PRIVILEGE_ENABLED = $2;
    ERROR_SUCCESS = 0;
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    WM_CLOSE = $10;
    WAIT_OBJECT_0 = $0;
    TA_FAILED = 0;
    SYNCHRONIZE = $100000;
    PROCESS_TERMINATE = $1;
    MAX_PATH = 260;

type
    _ULARGE_INTEGER = record
        LowPart: DWORD;
        HighPart: DWORD;
    end;
   
    _LUID_AND_ATTRIBUTES = record
        Luid: _ULARGE_INTEGER;
        Attributes: DWORD;
    end;

    _TOKEN_PRIVILEGES = record
        PrivilegeCount: DWORD;
        Privileges: array[0..0] of _LUID_AND_ATTRIBUTES;
    end;
   
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..MAX_PATH-1] of Char;
    end;
   
function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function GetCurrentProcess: THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: _ULARGE_INTEGER): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; const NewState: _TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: _TOKEN_PRIVILEGES; var ReturnLength: DWORD): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetLastError: DWORD; external 'GetLastError@kernel32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';

function CharArrayToString(aChar: array of Char): String;
begin
    Result := '';
    while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;

function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
    dwID: DWORD;
begin
    GetWindowThreadProcessId(hwnd, dwID) ;
    if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
    Result := True;
end;

function ProcessTerminate(const ProcessName: String; dwTimeout: DWORD):Boolean;
var
    hToken: THandle;
    SeDebugNameValue: _ULARGE_INTEGER;
    tkp: _TOKEN_PRIVILEGES;
    ReturnLength: Cardinal;
    hProcess: THandle;
    pe32: TPROCESSENTRY32;
    hProcessSnap: THandle;
begin
    Result := False;
    // Добавляем привилегию SeDebugPrivilege
    // Для начала получаем токен нашего процесса
    if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
    // Получаем LUID привилегии
    if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then
    begin
        CloseHandle(hToken);
        Exit;
    end;
    tkp.PrivilegeCount := 1;
    tkp.Privileges[0].Luid := SeDebugNameValue;
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    // Добавляем привилегию к нашему процессу
    AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ReturnLength);
    if GetLastError() <> ERROR_SUCCESS then exit;
    // Завершаем процесс. Если у нас есть SeDebugPrivilege, то мы можем
    // завершить и системный процесс
    // Получаем дескриптор процесса для его завершения
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    try
        pe32.dwSize := SizeOf(pe32);
        if not Process32First(hProcessSnap, pe32) then Exit;
        while Process32Next(hProcessSnap, pe32) do
        begin
            if CompareText(CharArrayToString(pe32.szExeFile), ProcessName) = 0 then
            begin
                hProcess := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, pe32.th32ProcessID);
                if hProcess = TA_FAILED then Exit;
                try
                    Result := WaitForSingleObject(hProcess, dwTimeout) = WAIT_OBJECT_0;
                    if not Result then Result := TerminateProcess(hProcess, 0);
                finally
                    CloseHandle(hProcess);
                end;
            end;
        end;
    finally
        CloseHandle(hProcessSnap);
    end;
    // Удаляем привилегию
    tkp.Privileges[0].Attributes := 0;
    AdjustTokenPrivileges(hToken, FALSE, tkp, SizeOf(tkp), tkp, ReturnLength);
    if GetLastError() <> ERROR_SUCCESS then Exit;
    Result := True;
end;

procedure InitializeWizard();
begin
  ProcessTerminate('calc.exe', 5000);
end;



PS: Халфе 2 в полноэкранном режиме на сообщение PostMessage(hwnd, WM_CLOSE, 0, 0); пофиг, (поставлю dwTimeout в 2 раза меньше)
но в оконном режиме, закрытие окна работает на ура

Gnom_aka_Lexander 02-12-2012 13:37 2037025

Цитата:

Цитата Johny777
гуманных не нашёл, »

по сути WM_CLOSE единственный верный способ закрытия приложения. Привилегии нужны только для работы с системными процессами, поэтому не стоит. антивирь с привилегиями не убьешь, если это нормальный антивирь, а вот систему - запросто. да и в инно давно уже это есть на автомате. правда для систем выше ХР, но тенденция такова, что ХР поддерживает все меньше и меньше приложений.

habib2302 04-12-2012 11:28 2038329

Люди.помогите мне объеденить эти два кода и чтобы они работали одновременно.Здесь один код на работу wizardsmallimage во время удаления и код на работу кликабельного лого во время удаления.Но если их поменять местами допустим код на лого сверху,а на wizardsmallimage внизу.
Код:

procedure InitializeUninstallProgressForm();

begin
 FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
with UninstallProgressForm.WizardSmallBitmapImage do
  begin
  Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
  end;
end;

begin
  with TBitmapImage.Create(nil) do
begin
  Parent := UninstallProgressForm;
  Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
  Stretch:= true;
  SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
  end;
end.

тогда работать будет только лого,а wizardsmallimage нет.

вот коды

Код:

procedure InitializeUninstallProgressForm();

begin
 FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
with UninstallProgressForm.WizardSmallBitmapImage do
  begin
  Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
  end;
end;

Код:

procedure InitializeUninstallProgressForm();

begin
  with TBitmapImage.Create(nil) do
begin
  Parent := UninstallProgressForm;
  Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
  Stretch:= true;
  SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
  end;
end;


Gnom_aka_Lexander 04-12-2012 12:20 2038357

Код:

procedure InitializeUninstallProgressForm();
begin
  FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
  with UninstallProgressForm.WizardSmallBitmapImage do
    Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
  with TBitmapImage.Create(UninstallProgressForm) do
  begin
    Parent := UninstallProgressForm;
    Stretch:= true;
    SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
    Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
  end;
end.

и плюнь в лицо тому, кто учил тебя ТАК объединять код.

habib2302 04-12-2012 12:28 2038361

вот полный скрипт на лого

Код:

[Setup]
BitmapResource=logo:logo.bmp

[Files]
Source: logo.bmp; DestDir: {app}; Flags: dontcopy

[*Code]
procedure InitializeUninstallProgressForm();

begin
  with TBitmapImage.Create(nil) do
begin
  Parent := UninstallProgressForm;
  Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
  Stretch:= true;
  SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
  end;
end;

вот полный скрипт на wizardsmallimage

Код:

[Setup]
WizardSmallImageFile={tmp}\WizardSmallImage.bmp

[Files]
Source: {tmp}\WizardSmallImage.bmp; DestDir: {app}; Flags: ignoreversion; Attribs: Hidden;

[*Code]
procedure InitializeUninstallProgressForm();

begin
 FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
with UninstallProgressForm.WizardSmallBitmapImage do
  begin
  Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
  end;
end;

для работы лого должа быть установленна расширенная версия от Restools т.е Inno Setup Ultra

Цитата:

Цитата Gnom_aka_Lexander
Код:

procedure InitializeUninstallProgressForm();
begin
 FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
 with UninstallProgressForm.WizardSmallBitmapImage do
 Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
 with TBitmapImage.Create(UninstallProgressForm) do
 begin
 Parent := UninstallProgressForm;
 Stretch:= true;
 SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
 Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
 end;
end.

»

огромное спасибо!!!!только вместо точки на конце end. нужно было вставить ; точку с запятой

и как сделать растяжение wizardsmallimage на деинсталляторе с сокрытием лейбелов?

Gnom_aka_Lexander 04-12-2012 14:28 2038470

Цитата:

Цитата habib2302
с сокрытием лейбелов? »

вот все элементы окна деинсталлятора:

Код:

  TUninstallProgressForm = class(TSetupForm)
    property OuterNotebook: TNewNotebook; read;
    property InnerPage: TNewNotebookPage; read;
    property InnerNotebook: TNewNotebook; read;
    property InstallingPage: TNewNotebookPage; read;
    property MainPanel: TPanel; read;
    property PageNameLabel: TNewStaticText; read;
    property PageDescriptionLabel: TNewStaticText; read;
    property WizardSmallBitmapImage: TBitmapImage; read;
    property Bevel1: TBevel; read;
    property StatusLabel: TNewStaticText; read;
    property ProgressBar: TNewProgressBar; read;
    property BeveledLabel: TNewStaticText; read;
    property Bevel: TBevel; read;
    property CancelButton: TNewButton; read;
  end;

Не нашел ни одного лейбела.
Цитата:

Цитата habib2302
т.е Inno Setup Ultra »

и не нужно рекламировать. Во первых моя сборка в рекламе не нуждается, во вторых тут и наказать могут.

habib2302 04-12-2012 16:49 2038588

как сделать инсталлятор без версии т.е убрать версию?
Код:

#define MyAppVersion "1.0.03"
[Setu]
AppVersion={#MyAppVersion}


R.i.m.s.k.y. 04-12-2012 16:56 2038594

habib2302, какой лаконичный скрипт
наверное нужно удалить строчки где встречается MyAppVersion
В общем в секции [Setup] за номер версии отвечают VersionInfoVersion, VersionInfoCompany, VersionInfoDescription, VersionInfoTextVersion

Цитата:

Цитата Gnom_aka_Lexander
Во первых моя сборка в рекламе не нуждается, во вторых тут и наказать могут. »

да ладно. Пока в инно все феньки по ссылкам соберешь - весь моск сморщишь. А так все в одном месте только спинным мозгом Далее дави и все фишки свалятся на диск.
Зер гут.

SoulSide 04-12-2012 17:26 2038603

Цитата:

Цитата habib2302
как сделать инсталлятор без версии т.е убрать версию? »

AppName без AppVersion не пропустит, но директиву AppVersion можно заменить на AppVerName, таким образом если хотите чтоб в журнале деинсталляции записалось совсем без версии а только название, то директиву AppVersion нужно заменить на AppVerName.
Код:

#define MyAppName "Моя программа"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}


habib2302 04-12-2012 18:07 2038629

SoftLine
огромное спасибо!!!

RedBishep 06-12-2012 02:41 2039603

Доброго времени суток.
Нужен пример скрипта....
У меня несколько архивов 7z, мне нужно для каждого архива отдельный прогресс бар в Inno ( Прогресс бар Внутри программы а не снаружи)
Или если можно подскажите как сделать такое в редакторе форм.

Заранее благодарен.
Надеюсь объяснил внятно =)

Johny777 06-12-2012 03:32 2039607

RedBishep, читай страницы 123-125 включительно

RedBishep 06-12-2012 05:28 2039620

Johny777

Спасибки вроде в поиске писал он нечего такого не нашел =))

SoulSide 06-12-2012 08:58 2039651

Johny777, Поправочка: По умолчанию да, страницы 123-125 есть,но например на 30-ти постном отображении, ну никак нет страниц 123 и 125, т.к их всего 48. Так что начинать нужно не со страниц а с постов, ведь у каждого по разному. Получается начинать читать нужно с #1221 по #1250 пост включительно, если считать начало 123 и конец 125 страниц.

P.S
читать дальше »
5-ти постное = 283 страницы
10-ти постное (По умолчанию) = всего 142 страницы
20-ти постное = всего 71 страница
30-ти постное = всего 48 страниц
40-ка постное = всего 36 страниц
на момент этого поста

Gambetto 06-12-2012 16:16 2039984

Озадачился определением версии системы.
В справке нашел пару примеров:
1. Pos('XP Service Pack 2', SystemVersionPanel.Text);
2. Version.NTPlatform and (Version.Major = 5) and (Version.Minor = 1) and (Version.ServicePackMajor = 2).

И появились вопросы.. SystemVersionPanel - это что, объект? Где-то описано вообще?
Во втором случае Version, как я понял, это переменная типа "запись" TWindowsVersion.

И не относящийся к задаче вопрос, касаемый функции MsgBox. Где она и другие подобные описываются? В справке как-то ну очень сжато, лишь на примерах кода. Даже без указания возможных вариантов кнопок или значков в выдаваемых окнах.

El Sanchez 06-12-2012 18:11 2040074

Цитата:

Цитата Johny777
El Sanchez, Ты можешь пожалуйста научить свою функцию так чтоб она ещё и путь к файлу сравнивала как у меня, ну короче чтоб при необходимости только определённые процессы завершать. »

ОК, принцип работы такой:
1. Если указан полный путь, будет завершаться процесс по указанному пути. Если имя файла, то все с таким же именем.
2. При получении дескриптора завершаемого процесса при необходимости права вызывающего процесса (инсталлятора) повышаются до уровня отладчика.
3. Последовательность завершения: 1) Посылаем окну программы сообщение WM_CLOSE; 2) Если окна нет и посылать некому (службы), то в виртуальном адресном пространстве процесса вызываем функцию ExitProcess; 3) Если сопротивляется, то TerminateProcess.
читать дальше »

Код:

#define A = (Defined UNICODE) ? "W" : "A"
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_TERMINATE = $1;
    PROCESS_CREATE_THREAD = $2;
    PROCESS_VM_OPERATION = $8;
    PROCESS_VM_READ = $10;
    PROCESS_VM_WRITE = $20;
    PROCESS_QUERY_INFORMATION = $400;
    SYNCHRONIZE = $100000;
    MEM_COMMIT = $1000;
    MEM_RESERVE = $2000;
    PAGE_EXECUTE_READWRITE = $40;
    TOKEN_QUERY = $8;
    TOKEN_ADJUST_PRIVILEGES = $20;
    SE_PRIVILEGE_ENABLED = $2;
    MAX_PATH = 260;
    TA_FAILED = 0;
    TA_SUCCESS_CLEAN = 1;
    TA_SUCCESS_KILL = 2;
    WM_CLOSE = $10;
    WAIT_OBJECT_0 = $0;
    WAIT_TIMEOUT = $102;

   
type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of Char;
    end;
   
    LUID = record
        LowPart: DWORD;
        HighPart: Longint;
    end;
   
    LUID_AND_ATTRIBUTES = record
        Luid: LUID;
        Attributes: DWORD;
    end;
   
    TOKEN_PRIVILEGES = record
        PrivilegeCount: DWORD;
        Privileges: array [0..0] of LUID_AND_ATTRIBUTES;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
#endif
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetProcessImageFileName(hProcess: THandle; var lpImageFileName: Char; nSize: DWORD): DWORD; external 'GetProcessImageFileName{#A}@psapi.dll stdcall';
function QueryDosDevice(lpDeviceName: String; var lpTargetPath: Char; ucchMax: DWORD): DWORD; external 'QueryDosDevice{#A}@kernel32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function GetProcAddress(hModule: THandle; lpProcName: String): Longint; external 'GetProcAddress@kernel32.dll stdcall';
function GetModuleHandle(lpModuleName: String): THandle; external 'GetModuleHandle{#A}@kernel32.dll stdcall';
function VirtualAllocEx(hProcess: THandle; lpAddress, dwSize: Longint; flAllocationType, flProtect: DWORD): Longint; external 'VirtualAllocEx@kernel32.dll stdcall';
function WriteProcessMemory(hProcess: THandle; lpBaseAddress, lpBuffer, nSize: Longint; var lpNumberOfBytesWritten: Longint): BOOL; external 'WriteProcessMemory@kernel32.dll stdcall';
function CreateRemoteThread(hProcess: THandle; lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; external 'CreateRemoteThread@kernel32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';


/////////////////////////////////////////////////////////
function CharArrayToString(aChar: array of Char): String;
begin
    Result := '';
    while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;

////////////////////////////////////////////////////////////
function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
    dwID: DWORD;
begin
    GetWindowThreadProcessId(hwnd, dwID);
    if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
    Result := True;
end;

////////////////////////////////////////////////////////////////////////
function TerminateApp(const szProcess: String; dwTimeout: DWORD): DWORD;
var
    hProcessSnap, hProc, hToken, hThread, lpProcName: THandle;
    pe32: TPROCESSENTRY32;
    aBuf: array [0..259] of Char;
    szFileName, szDeviceName: String;
    tkp: TOKEN_PRIVILEGES;
    SeDebugNameValue: LUID;
    i, lpMemory, ret: Longint;
    lpThreadId, dwDrives: DWORD;
begin
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    try
        pe32.dwSize := SizeOf(pe32);
        if not Process32First(hProcessSnap, pe32) then Exit;
        while Process32Next(hProcessSnap, pe32) do
        begin
            if CompareText(CharArrayToString(pe32.szExeFile), ExtractFileName(szProcess)) <> 0 then Continue;
            // try open process
            hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
            if hProc = TA_FAILED then
            begin
                // open process token adjust privileges
                if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
                if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then Exit;
                try
                    // fill token privileges struct
                    tkp.PrivilegeCount := 1;
                    tkp.Privileges[0].Luid := SeDebugNameValue;
                    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
                    // set debug privileges
                    if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret) then Exit;
                    // try open process with debug privileges
                    hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_READ or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
                    if hProc = TA_FAILED then Exit;
                finally
                    tkp.Privileges[0].Attributes := 0;
                    AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
                    CloseHandle(hToken);
                end;
            end;
            // if szProcess is full path
            if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then
            begin
                GetProcessImageFileName(hProc, aBuf[0], SizeOf(aBuf));
                szFileName := CharArrayToString(aBuf);
                dwDrives := GetLogicalDrives();
                for i := 2 to 25 do if dwDrives and (1 shl i) <> 0 then
                begin
                    QueryDosDevice(Format('%s:', [Chr(Ord('A') + i)]), aBuf[0], SizeOf(aBuf));
                    szDeviceName := CharArrayToString(aBuf);
                    if Pos(szDeviceName, szFileName) = 0 then Continue;
                    StringChangeEx(szFileName, szDeviceName, Format('%s:', [Chr(Ord('A') + i)]), True);
                    if CompareText(szProcess, szFileName) = 0 then Break;
                end;
                if CompareText(szProcess, szFileName) <> 0 then
                begin
                    CloseHandle(hProc);
                    Continue;
                end;
            end;
            // try stop process
            try
                EnumWindows(CallbackAddr('EnumWindowsProc'), pe32.th32ProcessID);
                case WaitForSingleObject(hProc, dwTimeout) of
                    WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                    WAIT_TIMEOUT: try
                        lpProcName := GetProcAddress(GetModuleHandle('kernel32.dll'), 'ExitProcess');
                        if lpProcName = 0 then Exit;
                        //
                        lpMemory := VirtualAllocEx(hProc, 0, SizeOf(lpProcName), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
                        if not WriteProcessMemory(hProc, lpMemory, lpProcName, SizeOf(lpProcName), ret) then Exit;
                        //
                        hThread := CreateRemoteThread(hProc, 0, 0, lpMemory, 0, 0, lpThreadId);
                        if hThread > 0 then
                        case WaitForSingleObject(hThread, dwTimeout) of
                            WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                            WAIT_TIMEOUT: if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL;
                        end;
                    finally
                        CloseHandle(hThread);
                    end;
                end;
            finally
                CloseHandle(hProc);
                if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then Exit;
            end;
        end;
    finally
        CloseHandle(hProcessSnap);
    end;
end;

/////////////////////////////
procedure InitializeWizard();
begin
    TerminateApp('jqs.exe', 5000);
end;


DEZMONDS 07-12-2012 15:08 2040676

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

возможно есть функция или скрипт inno setup что сама по себе блокирует все соединения из вне ..в инет .. или подскажите где посмотреть или как сделать если есть ...

:Beer: мне нужно не вручную а автоматом и не через антивирус ...как делает это skidrow в своих крЯках.... зарание спасибо...

SoulSide 07-12-2012 16:35 2040727

DEZMONDS, На этом форуме обсуждение взлома не приветствуется.
А так, если какая программа лезет в интернет, то смотрите в сторону C:\WINDOWS\system32\drivers\etc\ на файл hosts.

DEZMONDS 07-12-2012 16:45 2040732

SoftLine, да но мне взлом не нужен мне надо что бы в скрипте inno setup прописать как ты говоришь в файле hosts запрет програмы или копирнуть этот хост и как на различные системы винды указать путь? антивирус наверно сразу орать будет что типа репак лезет в запрещенные файлы... и воозможно это сделать автоматом? или подскажите в правельном направлении думаю? через inno setup это делать или кряк дописивать?

YURSHAT 07-12-2012 16:52 2040738

DEZMONDS, вам нужно знать веб адреса на которые лезет программулина и соответственно сделать их локальными.
Прописать в хост примерно такие строки
Код:

127.0.0.1    forum.oszone.net

DEZMONDS 07-12-2012 17:35 2040773

YURSHAT, да я понял ... но все же только вручную? или можно как то через скрипт инно?

Gnom_aka_Lexander 07-12-2012 18:18 2040801

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

SoulSide 07-12-2012 20:41 2040901

DEZMONDS, Прогнав поиск, вот что выдало по файлу hosts: #200, #477, #532.

Gnom_aka_Lexander 07-12-2012 20:55 2040914

к #532 дополню - более корректно перевод строки будет +chr(13)+chr(10)+
chr(13) - возврат каретки в начало
chr(10) - собственно, новая строка

R.i.m.s.k.y. 08-12-2012 19:21 2041400

inno умеет только bmp в формы вставлять? как быть с прозрачностью фона, ведь у каждого своя тема оформления венды и установщика?

Gnom_aka_Lexander 08-12-2012 19:31 2041403

для прозрачных изображений была написана библиотека botva2.dll, есть еще формат bmp 32 бита, но инно его не умеет

R.i.m.s.k.y. 08-12-2012 20:05 2041421

Gnom_aka_Lexander,
ReplaceColor := clWhite; ReplaceWithColor := clBtnFace; не помогут?

Gnom_aka_Lexander 08-12-2012 20:38 2041439

R.i.m.s.k.y., иногда помогают. но иногда такое г.. получается, что просто диву даешься :) в принципе, я сам предпочитаю именно с битмапами работать, просто рисуешь все элементы каждой страницы целиком и все.

R.i.m.s.k.y. 08-12-2012 20:45 2041442

Цитата:

Цитата Gnom_aka_Lexander
просто рисуешь все элементы каждой страницы целиком и все. »

это как?
может упростить задачу? фиксировать цвет фона? какие элементы тогда нужно гвоздями прибивать?

Gnom_aka_Lexander 08-12-2012 20:50 2041443

Элементы - в том смысле, что всякие рамочки, панельки и тому подобное.
При отрезании цвета косяк будет на переходах цвета - там будет грязь состоящая из фонового цвета и пикселей полутонов вырезанного.

Gnom_aka_Lexander 10-12-2012 17:38 2042544

нету стандартных ивентов для WizardForm, типа OnMove, может и добавят, потом. поэтому только каллбек и никак иначе. почему-бы в каллбек распаковки не добавить ловлю сообщений и окна и обработку WM_MOVE?

Johny777 10-12-2012 17:55 2042559

Gnom_aka_Lexander, ещё есть Application.OnMessage
http://forum.oszone.net/post-1894849-1439.html
http://forum.oszone.net/post-1660375-1363.html
я там тоже отслеживал событие WM_MOVE но как обычно облом. :(

Gnom_aka_Lexander 10-12-2012 18:00 2042561

Цитата:

Цитата Johny777
я там тоже отслеживал событие WM_MOVE »

там и не получится, это цикл сбора сообщений, он выполняется один раз, будучи вызванным, используется в длинных циклах, для размораживания окна программы(обычно), когда ради цикла нет необходимости запускать отдельный поток. поэтому только каллбек.

popt2t 11-12-2012 14:42 2043095

Не могу понять, по какой причине не срабатывает ISSkin. Помогите разобраться пожалуйста!

Делаю вот так:
читать дальше »

Код:

[Files]
; Добавляем ISSkin DLL, который используется в инсталляторах Inno Setup.
Source: ISSkin.dll; DestDir: {tmp}; Flags: dontcopy

; Добавляем файл визуального стиля, в котором находятся нужные ресурсы для визуализации.
; Вы также можете использовать Microsoft Visual Styles (*.msstyles).
Source: ISSkin.cjstyles; DestDir: {tmp}; Flags: dontcopy

[Секция Code]
// Импортируем LoadSkin API из ISSkin.DLL
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall';

// Импортируем UnloadSkin API из ISSkin.DLL
procedure UnloadSkin();
external 'UnloadSkin@files:isskin.dll stdcall';

// Импортируем ShowWindow Windows API из User32.DLL
function ShowWindow(hWnd: Integer; uType: Integer): Integer;
external 'ShowWindow@user32.dll stdcall';


function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('ISSkin.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\ISSkin.cjstyles'), '');
  Result := True;
end;

procedure DeinitializeSetup();
begin
  // Скрываем окно до выгрузки скина, чтобы пользователь не увидел
  // окно инсталлятора без визуальных стилей до его закрытия.
  ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
  Sleep(110);
  UnloadSkin();
end;


Gnom_aka_Lexander 11-12-2012 15:36 2043125

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

popt2t 11-12-2012 15:40 2043127

Цитата:

Цитата Gnom_aka_Lexander
Версия длл-ки - анси-юникод должна совпадать с версией инно, именно поэтому в комплекте их две - одна для анси, другая для юникод. »

Спасибо, уже сам допер :yahoo:

А для чего нужна ISSkinEx.dll?

alert30 11-12-2012 17:13 2043209

popt2t, ISSkinEx.dll - вроде тоже самое, как ISSkin.dll; загрузка скина.

Johny777 11-12-2012 21:33 2043384

Системные месседжбоксы:
1. выглядят жутко со скином

2. Их трудно программно сдвинуть в сторону или отобразить не по центру
3. Нельзя изменить размер кнопки и пр.
Поэтому запилил под свои нужды самопальный месседжбокс, который умеет:
старый месседжбокс:
читать дальше »

1: Подстраиваться под размер текста (как и систмный), правда алгоритм хромает
2: Возвращает результат (пока добавил только несколько комбинаций кнопок, но не все)
3: умеет как и его расширенный собрат самозакрываться
пока что не умеет:
1: Отображать на себе иконку
2: Воспроизводить звуки (ошибка, критическая ошибка и пр.)
Код:
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif


const
  GWL_EXSTYLE = -20;
  WS_EX_APPWINDOW = $40000;
  WS_EX_TOOLWINDOW = $80;
  //SW_HIDE = 0;
  SW_NORMAL = 1;
  GWL_HWNDPARENT = -8;
  GCL_STYLE = -26;
  CS_NOCLOSE = $200;
  WM_CLOSE = $10;
//  hhkAtlTab = 101;
//  hhkAtlSpace = 102;
//  MOD_ALT = 1;
//  VK_TAB = 9;
  MB_ICONHAND = $00000010;
//  MB_ICONQUESTION = $00000020;
  MB_ICONEXCLAMATION = $00000030;
  MB_ICONASTERISK = $00000040;
  MB_USERICON = $00000080;
//  MB_ICONWARNING                = MB_ICONEXCLAMATION;
//  MB_ICONERROR                  = MB_ICONHAND;
//  MB_ICONINFORMATION            = MB_ICONASTERISK;
  MB_ICONSTOP                    = MB_ICONHAND;
   
type
  HDC = LongWord;
  HFONT = LongWord;
  HGDIOBJ = LongWord;
 
  STR_SIZE = record
    cx: Longint;
    cy: Longint;
  end;
 
  _MESSAGE_INFO = record
    hMsgLabel: HWND;
    dTimeOut: DWORD;
    dStartTime: DWORD;
    hMsgForm: HWND;
  end;
   
var
  MESSAGE_INFO: _MESSAGE_INFO;
   


//function GetClassLong(Wnd: HWnd; Index: Integer): Longint; external 'GetClassLong{#A}@user32.dll stdcall';
//function SetClassLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetClassLong{#A}@user32.dll stdcall';
//function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';
function GetDC(hWnd: HWND): HDC; external 'GetDC@user32.dll stdcall';
function SelectObject(DC: HDC; p2: HGDIOBJ): HGDIOBJ; external 'SelectObject@gdi32.dll stdcall';
function GetTextExtentPoint32(DC: HDC; Str: PChar; Count: Integer; var Size: STR_SIZE): BOOL; external 'GetTextExtentPoint32{#A}@gdi32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';
function StrFromTimeInterval(var pszOut: Char; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
//function RegisterHotKey(hWnd: HWND; id: Integer; fsModifiers, vk: UINT): BOOL; external 'RegisterHotKey@user32.dll stdcall';
//function UnregisterHotKey(hWnd: HWND; id: Integer): BOOL; external 'UnregisterHotKey@user32.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function MessageBeep(uType: UINT): BOOL; external 'MessageBeep@user32.dll stdcall';
   
function GetStrSizeInPixels(Font: TFont; Caption: String): STR_SIZE;
var
  DC: HDC;
  SaveFont: HFONT;
begin
  DC := GetDC(0);
  try
    SaveFont := SelectObject(DC, Font.Handle);
    GetTextExtentPoint32(DC, PChar(Caption), Length(Caption), Result);
    SelectObject(DC, SaveFont);
  finally
    ReleaseDC(0, DC);
  end;
end;

function TicksToTime(Ticks: DWORD): String;
var
    i: Byte;
    arr: array [0..31] of Char;
begin
    for i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;

function CharCount(C: Char; aStr: String): Integer;
var
  i: Integer;
begin
  Result := 0;
  for i := 1 to Length(aStr) do if aStr[i] = C then Result := Result + 1;
end;

procedure ATimeOutProc;
var
  PassedTime: DWORD;
begin
  PassedTime := GetTickCount-MESSAGE_INFO.dStartTime;
  if PassedTime >= MESSAGE_INFO.dTimeOut then PostMessage(MESSAGE_INFO.hMsgForm, WM_CLOSE, 0, 0);
  SetWindowText(MESSAGE_INFO.hMsgLabel, TicksToTime(MESSAGE_INFO.dTimeOut-PassedTime));
end;

function ShowMessageEx(AText, ACaption: string; AType: UINT; AMsgTyp: TMsgBoxType; ATimeOut: Integer): Integer;
var
  MsgBoxForm: TSetupForm;
  MsgLabel: TLabel;
  Size: STR_SIZE;
  szStatus: TNewStaticText;
  ATimeOutTimer: LongWord;
begin
  MsgBoxForm := CreateCustomForm;
  with MsgBoxForm do
  begin
    Position := poScreenCenter;
    BorderStyle := bsDialog;
    Caption := ACaption;
    Color := clBtnFace;
    ShowWindow(GetWindowLong(MsgBoxForm.Handle, GWL_HWNDPARENT), SW_HIDE);
//    RegisterHotKey(Handle, hhkAtlTab, MOD_ALT, VK_TAB);
    MsgLabel := TLabel.Create(nil)
    with MsgLabel do
    begin
      AutoSize := False;
      WordWrap := True;
      Parent := MsgBoxForm;
      Caption := AText;
      Size := GetStrSizeInPixels(Font, AText);
      Left := ScaleX(16);
      Top := ScaleY(16);
      Font.Size := 10;
      if (Size.cx > 300) and (Size.cx <= 500) then
      begin
        Width := ScaleX(Size.cx);
        Height := ScaleY(Size.cy)+Size.cy*CharCount(#13,AText)+3;
      end else if (Size.cx > 500) then
      begin
        Width := ScaleX(500);
        Height := ScaleY(Size.cy*Round(Size.cx/500)+Size.cy*CharCount(#13,AText));
      end else if (Size.cx < 300) then
      begin
        Width := ScaleX(300);
        Height := (Size.cy);
      end;
    end;

    ClientWidth := MsgLabel.Width + ScaleX(30);
    ClientHeight := MsgLabel.Height + ScaleY(70);

    with TButton.Create(nil) do
    begin
      Parent := MsgBoxForm;
      SetBounds(MsgBoxForm.ClientWidth - ScaleX(90), MsgBoxForm.ClientHeight - ScaleY(35), ScaleX(71), ScaleY(25));
      Cursor := crHand;
      case AType of
        MB_OKCANCEL:
        begin
          ModalResult := mrOk;
          Caption := SetupMessage(msgButtonOK);
        end;
        MB_YESNO:
        begin
          ModalResult := mrYes;
          Caption := SetupMessage(msgButtonYes);
        end;
        MB_OK:
        begin
          ModalResult := mrOk;
          Caption := SetupMessage(msgButtonOk);
        end;
      end;
    end;

    if AType <> MB_OK then
    with TButton.Create(nil) do
    begin
      Caption := SetupMessage(msgButtonNo);
      Parent := MsgBoxForm;
      SetBounds(MsgBoxForm.ClientWidth - ScaleX(175), MsgBoxForm.ClientHeight - ScaleY(35), ScaleX(71), ScaleY(25));
      Cursor := crHand;
      case AType of
        MB_OKCANCEL:
        begin
          ModalResult := mrCancel;
          Caption := SetupMessage(msgButtonCancel);
        end;
        MB_YESNO:
        begin
          ModalResult := mrNo;
          Caption := SetupMessage(msgButtonNo);
        end;
      end;
    end;

    if ATimeOut <> 0 then
    begin
      szStatus := TNewStaticText.Create(nil);
      with szStatus do
      begin
        Parent := MsgBoxForm;
        WordWrap := True;
        SetBounds(ScaleX(16), MsgBoxForm.ClientHeight - ScaleY(25), ScaleX(71), ScaleY(25));
      end;
      MESSAGE_INFO.hMsgLabel := szStatus.Handle;
      MESSAGE_INFO.dTimeOut := ATimeOut;
      MESSAGE_INFO.dStartTime := GetTickCount;
      MESSAGE_INFO.hMsgForm := MsgBoxForm.Handle;
      ATimeOutTimer := SetTimer(0, 777, 1, CallbackAddr('ATimeOutProc'));
    end;
   
    case AMsgTyp of
      mbError: MessageBeep(MB_ICONWARNING);
      mbInformation: if not MessageBeep(MB_ICONINFORMATION) then MessageBeep(MB_ICONASTERISK);
      mbCriticalError: if not MessageBeep(MB_ICONSTOP) then MessageBeep(MB_ICONERROR);
    end;

    case AType of
      MB_OKCANCEL:
      case ShowModal of
        mrOk: Result := IDOK;
        mrCancel: Result := IDCANCEL;
        else Result := IDCANCEL;
      end;
      MB_YESNO:
      case ShowModal of
        mrYes: Result := IDYES;
        mrNo: Result := IDNO;
      else Result := IDNO;
      end;
      MB_OK:
      begin
        ShowModal;
        Result := IDOK;
      end;
    end;
    ShowWindow(GetWindowLong(MsgBoxForm.Handle, GWL_HWNDPARENT), SW_NORMAL);
    KillTimer(0, ATimeOutTimer);
//    UnregisterHotKey(Handle,hhkAtlTab);
//    UnregisterHotKey(Handle,hhkAtlSpace);
    Free;
  end;
end;


function InitializeSetup(): Boolean;
begin
  if ShowMessageEx( ' Названия архивов:' + #13#10 +
                    'hl2_update.exe' + #13#10 +
                    'hl2_ep1_update.exe' + #13#10 +
                    'hl2_ep2_update.exe' + #13#10 +
                    'portal_update.exe'
  , SetupMessage(msgErrorTitle), MB_YESNO, mbCriticalError, 7000) = IDNO then MsgBox('Cancel', mbCriticalError, MB_OK);
end;



=====================================================================

UPD: Новый месседжбокс :grin:
способен:
1. в точности подстраиваться под размер текста
2. возвращать результат
3. самозакрываться
4. отображать те же системные иконки(берёт у системы), что и системный + ещё одну с вопросом
5. воспроизводить системные звуки под все четыре типа иконки свой
вызов:
function ShowMessageEx(sMessage, sCaption: String; uBtnType: UINT; tMessageType: _MSG_TYPE; dwMessageTimeOut: DWORD): Integer;
где
sMessage - сообщение
sCaption - заголовок окна
uBtnType - комбинации кнопок (на данный момент 3: MB_YESNO, MB_OK, MB_OKCANCEL).
tMessageType - тип сообщения (4 своих типа со звуком на каждый: mError, mInformation, mQuestion, mCriticalError)
dwMessageTimeOut - время до закрытия в миллисекундах
возвращает в зависимости от кнопок: IDOK, IDNO, IDYES, IDCANCEL
если МБ самозакрылся то возврат по умолчанию: IDNO, IDCANCEL
реализация:
грузим сообщение в TStringList
в цикле длиной в TStringList.Count создаём динамичный массив TNewStaticText(один под другим)
получаем высоту формы ClientHeight := StaticArray[0].Height*ArrayLength + ScaleY(70); (+70 пикселей на кнопки)
ширина - самый длинный TNewStaticText + 90
если ширина МБ равна ширине монитора (аналогично с высотой) то рекурсивно выводим сообщение что он не помещается, выходим из процедуры

делал под потребности "полу-распада":), но кому нужно забирайте КОД:
читать дальше »
Код:

[Setup]
AppName=The_Best_MessageBox_Ever_Made
AppVersion=The_Best_MessageBox_Ever_Made_v777
DefaultDirName={pf}\My Application

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif


const
  WM_CLOSE = $10;
  MB_ICONHAND = $00000010;
  MB_ICONEXCLAMATION = $00000030;
  MB_ICONASTERISK = $00000040;
  MB_USERICON = $00000080;
  ID_QUESTION = 65579;
  ID_ASTERISK = 65583;
  ID_HAND = 65581;
  ID_EXCLAMATION = 65577;

type
  _MESSAGE_INFO = record
    hMsgLabel: HWND;
    dwTimeOut: DWORD;
    sTimeOut: String;
    dwStartTime: DWORD;
    hMsgForm: HWND;
  end;
 
  _MSG_TYPE = (mError, mInformation, mQuestion, mCriticalError);

var
  MESSAGE_INFO: _MESSAGE_INFO;


function StrFromTimeInterval(var pszOut: Char; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeInterval{#A}@shlwapi.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function MessageBeep(uType: UINT): BOOL; external 'MessageBeep@user32.dll stdcall';

function TicksToTime(Ticks: DWORD): String;
var
    i: Byte;
    arr: array [0..31] of Char;
begin
    for i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;


procedure MessageSelfCloseProc;
var
  PassedTime: DWORD;
begin
  PassedTime := GetTickCount-MESSAGE_INFO.dwStartTime;
  if PassedTime >= MESSAGE_INFO.dwTimeOut then PostMessage(MESSAGE_INFO.hMsgForm, WM_CLOSE, 0, 0);
  SetWindowText(MESSAGE_INFO.hMsgLabel, MESSAGE_INFO.sTimeOut + TicksToTime(MESSAGE_INFO.dwTimeOut-PassedTime));
end;




function ShowMessageEx(sMessage, sCaption: String; uBtnType: UINT; tMessageType: _MSG_TYPE; dwMessageTimeOut: DWORD): Integer;
var
  MessageForm: TSetupForm;
  ATimeOutTimer: LongWord;
  StrList: TStringList;
  StaticArray: array of TNewStaticText;
  MaxStaticTextWidth, i, ArrayLength: Integer;
begin
  try
    MessageForm := CreateCustomForm;
    with MessageForm do
    begin
      Position := poScreenCenter;
      BorderStyle := bsDialog;
      Caption := sCaption;
      Color := clBtnFace;
      try
        StrList := TStringList.Create;
        StrList.Text := sMessage;
        SetArrayLength(StaticArray, StrList.Count);
        ArrayLength := GetArrayLength(StaticArray);
        StaticArray[0] := TNewStaticText.Create(MessageForm)
        with StaticArray[0] do
        begin
          Parent := MessageForm;
          Caption := StrList.Strings[0];
          Font.Size := 10;
          Left := ScaleX(65);// 16
          Top := ScaleY(16);
          MaxStaticTextWidth := Width;
        end;
        if ArrayLength > 1 then for i := 1 to ArrayLength-1 do // MsgBox(StrList[i], mbInformation, MB_OK);
        begin
          StaticArray[i] := TNewStaticText.Create(MessageForm)
          with StaticArray[i] do
          begin
            Parent := MessageForm;
            Caption := StrList.Strings[i];
            Font.Size := 10;
            Left := StaticArray[0].Left;
            Top := StaticArray[i-1].Top + StaticArray[i-1].Height;
            if Width > MaxStaticTextWidth then MaxStaticTextWidth := Width;
          end;
        end else if ArrayLength = 1 then MaxStaticTextWidth := StaticArray[0].Width;
        if MaxStaticTextWidth < 200 then ClientWidth := ScaleX(200) else ClientWidth := ScaleX(MaxStaticTextWidth + 90);
        ClientHeight := StaticArray[0].Height*ArrayLength + ScaleY(70);
      finally
        StrList.Free;
      end;
    end;

    if (MessageForm.ClientWidth >= Screen.Width) or (MessageForm.ClientHeight >= Screen.Height) then
    begin
      ShowMessageEx('Слишком большое сообщение для Вашего монитора!', SetupMessage(msgErrorTitle), MB_OK, mError, 10000);
      Exit;
    end;

    with TButton.Create(MessageForm) do
    begin
      Parent := MessageForm;
      SetBounds(MessageForm.ClientWidth - ScaleX(90), MessageForm.ClientHeight - ScaleY(35), ScaleX(71), ScaleY(25));
      Cursor := crHand;
      case uBtnType of
        MB_OKCANCEL:
        begin
          ModalResult := mrOk;
          Caption := SetupMessage(msgButtonOK);
        end;
        MB_YESNO:
        begin
          ModalResult := mrYes;
          Caption := SetupMessage(msgButtonYes);
        end;
        MB_OK:
        begin
          ModalResult := mrOk;
          Caption := SetupMessage(msgButtonOk);
        end;
      end;
    end;

    if uBtnType <> MB_OK then
    with TButton.Create(MessageForm) do
    begin
      Caption := SetupMessage(msgButtonNo);
      Parent := MessageForm;
      SetBounds(MessageForm.ClientWidth - ScaleX(175), MessageForm.ClientHeight - ScaleY(35), ScaleX(71), ScaleY(25));
      Cursor := crHand;
      case uBtnType of
        MB_OKCANCEL:
        begin
          ModalResult := mrCancel;
          Caption := SetupMessage(msgButtonCancel);
        end;
        MB_YESNO:
        begin
          ModalResult := mrNo;
          Caption := SetupMessage(msgButtonNo);
        end;
      end;
    end;

    if dwMessageTimeOut <> 0 then
    begin
      with TNewStaticText.Create(MessageForm) do
      begin
        Parent := MessageForm;
        SetBounds(StaticArray[0].Left, MessageForm.ClientHeight - ScaleY(30), ScaleX(71), ScaleY(25));
        MESSAGE_INFO.hMsgLabel := Handle;
        MESSAGE_INFO.dwTimeOut := dwMessageTimeOut;
        MESSAGE_INFO.sTimeOut := 'это сообщение закроется через ';
        MESSAGE_INFO.dwStartTime := GetTickCount;
        MESSAGE_INFO.hMsgForm := MessageForm.Handle;
        Caption := MESSAGE_INFO.sTimeOut + TicksToTime(dwMessageTimeOut);
      end;
      ATimeOutTimer := SetTimer(0, 777, 1, CallbackAddr('MessageSelfCloseProc'));
    end;

    with TNewIconImage.Create(MessageForm) do
    begin
      Parent := MessageForm;
      SetBounds(ScaleX(16), ScaleY(16), ScaleX(32), ScaleY(32));
      case tMessageType of
        mError:
        begin
          if not MessageBeep(MB_ICONWARNING) then MessageBeep(MB_ICONEXCLAMATION);
          Icon.Handle := ID_EXCLAMATION;
        end;
        mInformation:
        begin
          if not MessageBeep(MB_ICONINFORMATION) then MessageBeep(MB_ICONASTERISK);
          Icon.Handle := ID_ASTERISK;
        end;
        mCriticalError:
        begin
          if not MessageBeep(MB_ICONHAND) then MessageBeep(MB_ICONERROR);
          Icon.Handle := ID_HAND;
        end;
        mQuestion:
        begin
          MessageBeep(MB_USERICON);
          Icon.Handle := ID_QUESTION;
        end;
      end;
    end;

    case uBtnType of
      MB_OKCANCEL:
      case MessageForm.ShowModal of
        mrOk: Result := IDOK;
        mrCancel: Result := IDCANCEL;
      else Result := IDCANCEL;
      end;
      MB_YESNO:
      case MessageForm.ShowModal of
        mrYes: Result := IDYES;
        mrNo: Result := IDNO;
      else Result := IDNO;
      end;
      MB_OK:
      begin
        MessageForm.ShowModal;
        Result := IDOK;
      end;
    end;
    if dwMessageTimeOut <> 0 then KillTimer(0, ATimeOutTimer);
  finally
    MessageForm.Free;
  end;
end;


function InitializeSetup(): Boolean; 
begin
  repeat
  until ShowMessageEx('"It was a low dome, jutting with antennae and radar dishes, tiny red lights blinking above them.' + #13#10 +
                      'Around the dome were more structures, built low and painted white, almost indistinguishable from' + #13#10 +
                      'their surroundings. The whole thing was sprinkled with snow, like powdered sugar, but it was' + #13#10 +
                      'hardly a pristine image. There hard already been fighting here. Smoke rose from a crack in the dome.' + #13#10 +
                      'The soldiers stationed inside the station had massed against the Combine operators as the news of' + #13#10 +
                      'the uprising spread; the fighting had torn it apart from within."' + #13#10#13#10 + #9#9#9#9#9#9#9#9 +
                      '--Weather Control Vignette' + #13#10#13#10 +
                      ''
  , SetupMessage(msgErrorTitle), MB_OKCANCEL, mError, 7000) = IDCANCEL;
end;



================================================================

R.i.m.s.k.y. 15-12-2012 07:25 2045612

можно ли менять значение Uninstallable=false секции Setup во время установки? а именно после выбора компонентов

Gnom_aka_Lexander 15-12-2012 07:59 2045617

R.i.m.s.k.y., это один из тех параметров, который можно менять. В качестве значения можно использовать булевую функцию, считывается значение в начале установки, когда начинается запись в лог удаления.

Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
Uninstallable=isUninstallable

[*code]
function isUninstallable(): Boolean;
begin
  Result := MsgBox('Создать деинсталлятор?', mbConfirmation, MB_YESNO) = IDYES;
end;


R.i.m.s.k.y. 15-12-2012 10:14 2045669

Цитата:

Цитата Gnom_aka_Lexander
это один из тех параметров, который можно менять. »

какие еще можно менять?

И помоему должно быть Uninstallable={code:isUninstallable}

Mailchik 15-12-2012 10:40 2045690

Цитата:

Цитата R.i.m.s.k.y.
какие еще можно менять? »

в которых значения могут быть true (yes) или false (no).
Цитата:

Цитата R.i.m.s.k.y.
И помоему должно быть Uninstallable={code:isUninstallable} »

Код:

[Setup]
Uninstallable=not IsTaskSelected('portablemode')

[Tasks]
Name: portablemode; Описание:  "Portable Mode"


Gnom_aka_Lexander 15-12-2012 17:07 2045885

Цитата:

Цитата Mailchik
в которых значения могут быть true (yes) или false (no). »

отнюдь, далеко не все из них можно. нужно смотреть в справке, часть параметров является компиляционными и менять их нельзя снаружи, только задавать изначально.
Цитата:

Цитата R.i.m.s.k.y.
И помоему должно быть Uninstallable={code:isUninstallable} »

когда-то именно так и было. но очень дано. именно булевые функции можно применять напрямую.

Gambetto 17-12-2012 09:35 2046998

Подскажите кто-нибудь функции для следующих действий:
1. Найти в каталоге установщика zip-архив по маске;
2. Открыть из архива текстовый файл;
3. В файле найти заданную строку.


Dark_Delphin 19-12-2012 02:02 2048499

Всем привет!

Y меня проблема...

Не могy перенести текст на новy строкy

см. скриншот:
http://i53.fastpic.ru/big/2012/1219/...3a3d65d6e3.png

Код:

Caption:='!ВНИМАНИЕ!\n %n \% Клиент распакуется:';

И как можно перемещать этот инсталл при нажатии в любyю его точкy?


Заранее благодарен!

Gnom_aka_Lexander 19-12-2012 07:20 2048553

Dark_Delphin, про перенос строи в коде, буквально на прошлой странице было. по второму вопросу тоже было, и видимо нужно в шапку, раз вы пользоваться поиском не умеете...

читать дальше »
Код:

function ReleaseCapture: Longint;
  external 'ReleaseCapture@user32.dll stdcall';
........................

procedure LabelOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(WizardForm.Handle,$0112,$F012,0);
end;

.......................

  WizardForm.OnMouseDown:=@LabelOnMouseDown;


там где WizardForm - укажешь свою поверхность, которая у тебя снаружи.

Mailchik 19-12-2012 10:06 2048627

Gambetto,
1. Не понятен вопрос. Просто найти по маске ? Вот скрипт, находит файлы по маске и выводит список найденных файлов в ListBox.
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
 FindButton : TButton;
 FindListBox : TListBox;

procedure FindFiles(Folder, Mask : string; List : TStrings);
var
  FilesFound: Integer;
  FindRec: TFindRec;
begin
  FIlesFound := 0;
  if FindFirst(Folder + '\' + Mask, FindRec) then begin
    try
      repeat
        if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
          List.Add(Folder + '\' + FindRec.Name);
          FilesFound := FilesFound + 1;
      until not FindNext(FindRec);
    finally
      FindClose(FindRec);
    end;
  end;
  if FilesFound = 0 then
  MsgBox('Ничего не найдено.', mbInformation, MB_OK);
end;

procedure FindButtonClick(Sender : TObject);
 begin
  {          Где искать?            Маска    Куда вывести список?
                  |                    |              |          }
  FindFiles(ExpandConstant('{src}'), '*.zip', FindListBox.Items);
end;

procedure FindListBoxClick(Sender : TObject);
 begin
  { При нажатии на ListBox заголовок инсталла изменяется на адрес к найденному файлу}
  WizardForm.Caption := TListBox(Sender).Items.Strings[TListBox(Sender).ItemIndex];
end;

procedure InitializeWizard;
 begin
  with WizardForm do begin
  OuterNotebook.Hide;
  SetBounds(Left, Top, ScaleX(520), ScaleY(400));
  Bevel.Width := ClientWidth;
  end;
  FindButton := TButton.Create(WizardForm);
  with FindButton do begin
  Parent := WizardForm;
  Caption := 'Find';
  OnClick := @FindButtonClick;
  SetBounds(ScaleX(10), ScaleY(250), ScaleX(100), ScaleY(30));
  end;
  FindListBox := TListBox.Create(WizardForm);
  with FindListBox do begin
  Parent := WizardForm;
  OnClick := @FindListBoxClick;
  SetBounds(ScaleX(10), ScaleY(10), ScaleX(500), ScaleY(200));
  end;
end;

2. Наверное невозможно сделать такое. Другим путём можно пойти: распаковываем нужный файл в темп и оттуда открываем его. Рядом со скриптом положите 7z.exe, который можно забрать на оф. сайте.
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: 7z.exe; Flags: dontcopy

[Code]
var
 TestButton : TButton;

procedure TestClick(Sender : TObject);
var
 res : integer;
 begin
 { Сначала извлекаем файл из архива            Архив, из которого извлекаем            |        Извлекаем в темп    |    Нужный файл
                                                            |                                          |                    |                      }
 Exec(ExpandConstant('{tmp}\7z.exe'), 'e ' + ExpandConstant('{src}\archive.zip') + ' -o' + ExpandConstant('{tmp}') + ' test.txt -r',
  ExpandConstant('{tmp}'), SW_HIDE, ewNoWait, res);
 { Теперь запускаем текстовый файл через блокнот}
 Exec('notepad', ExpandConstant('{tmp}\test.txt'), ExpandConstant('{tmp}'), SW_SHOWNORMAL, ewNoWait, res);
end;

function InitializeSetup() : boolean;
 begin
  ExtractTemporaryFile('7z.exe');
  Result := True;
end;

procedure InitializeWizard;
 begin
  with WizardForm do begin
  OuterNotebook.Hide;
  SetBounds(Left, Top, ScaleX(520), ScaleY(400));
  Bevel.Width := ClientWidth;
  end;
  TestButton := TButton.Create(WizardForm);
  with TestButton do begin
  Parent := WizardForm;
  Caption := 'Открыть';
  OnClick := @TestClick;
  SetBounds(ScaleX(10), ScaleY(250), ScaleX(100), ScaleY(30));
  end;
end;

3. Опять же, не понятно что вам нужно. Просто найти строку? Или что то с ней делать? Вот скрипт, который при нахождении текста строки сообщает об этом.
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
 TestButton : TButton;
 F : String;
 S : TArrayOfString;
 i : integer;

procedure TestClick(Sender : TObject);
 begin
  F := ExpandConstant('{src}\test.txt');
  LoadStringsFromFile(F, S);
  if FileExists(F) then begin
  for i:= 0 to GetArrayLength(S) - 1 do
    begin
    if Pos('TestText', S[i]) > 0 then begin      //TestText - текст строки который нужно найти
      MsgBox('Строка найдена', mbInformation, MB_OK);
      Break;
    end;
    end;
  end else begin
  MsgBox('Файл не найден', mbError, MB_OK);
  end;
end;

procedure InitializeWizard;
 begin
  with WizardForm do begin
  OuterNotebook.Hide;
  SetBounds(Left, Top, ScaleX(520), ScaleY(400));
  Bevel.Width := ClientWidth;
  end;
  TestButton := TButton.Create(WizardForm);
  with TestButton do begin
  Parent := WizardForm;
  Caption := 'Test';
  OnClick := @TestClick;
  SetBounds(ScaleX(10), ScaleY(250), ScaleX(100), ScaleY(30));
  end;
end;


Gnom_aka_Lexander 19-12-2012 10:14 2048633

2. Наверное невозможно сделать такое.
возможно. Я давал пример замены файла в зип-архиве. распаковка строго заданного файла и упаковка другого файла в этот архив. Ну да, для этого нужно целую тему полопатить. Но мне лениво вспоминать, как я это делал. и за кого-то лопатить тему - тоже неохота. Ответ есть, значит все, что нужно - просто его найти.

Mailchik 19-12-2012 12:04 2048713

Gnom_aka_Lexander, я имел в виду, что именно так как описал Gambetto невозможно. а так как ты описал, это да. сначала распаковать определенный файл, в темп например, а потом его прочитать.

Dark_Delphin 19-12-2012 18:35 2049108

Gnom_aka_Lexander, да. Спасибо большое, всё получилось.

В чемь может быть проблема, я вставил в скрипт себе код для скина, но после компилирование и запуска инсталла скин стандартный.
Я скачал даже пример и его же компилирую и запускается инсталл с стандартным скином...

Gnom_aka_Lexander 19-12-2012 19:11 2049152

Dark_Delphin, потому, что IsSkin.dll не соответствует версии компилятора. это тоже буквально пару страниц назад было. это единственная возможна причина.

Dark_Delphin 19-12-2012 19:49 2049184

Gnom_aka_Lexander, блин=) Точно, спасибо.

Dark_Delphin 19-12-2012 23:16 2049323

Как избежать ошибки?

http://forum.oszone.net/attachment.p...1&d=1355944597

Gambetto 20-12-2012 09:32 2049469

Цитата:

Цитата Mailchik
Не понятен вопрос. Просто найти по маске? »

Найти по маске архив, достать из него файл, в этом файле найти строку type=1 или type=2.
В зависимости от значения type устанавливать ту или иную программу.

Спасибо за примеры.

Dark_Delphin 20-12-2012 14:53 2049683

Всем привет.

Помогите сделать, чтобы при распаковке файлов прогрес бар работал (Распаковка файлов, которые собраны компилятором)
ставил ssInstall и та же проблема.

Скачать

Johny777 21-12-2012 04:45 2050143

El Sanchez, К сожалению имеется серьёзная проблема с кодом распаковки архивов 7зип, вылетают ошибки
раньше думал, что конфликт с таймерами (Вин Апи) и с подменённой оконной процедурой (пару страниц назад показывал), но вот убрал их все для теста и ситуация не улучшилась :(
вот примеры ошибок:

последняя с ошибкой указателя иногда выделяет строку RtlMoveMemory(ei, _lpEis, SizeOf(ei));
также бывает "stack overflow" если раскомментировать PercentsLabel.Caption := FormatFloat('0.#0 %', (dwCurrentSize*100)/ei.dwFileSize); на 4-м скрине
всё крутится вокруг каллбэк функции
Поймать ошибки трудно. Запускал в цикле - 1 устанока = 1, 2 ошибки ингда в начале цикла иногда к 10 - 20 распаковке (цикл длиной от 1 до 30), пару раз из около 10 тестовых установок бывало без ошибки
Признаю: код очень классный и урезать(или даже отказаться от использования) очень трудно
Просьба: Если есть шанс исправить положение, то прошу помочь!

El Sanchez 21-12-2012 15:43 2050399

Johny777,
1. Зачем тебе wide string? Передаешь в 7z юникод (кириллицу)? Не выйдет, нужно по-другому: в функциях SevenZipCreateArchive и SevenZipExtractArchive после формирования комстроки s7cmd допиши CharToOemBuff(s7cmd).
2. SevenZipKillOwnerWindowEx(hWnd). К дескриптору какого окна callback привязан? Можешь просто 0 передавать.
3. RtlMoveMemory. Тут по указателю получаем структуру. В момент ошибки _lpEis указывает на невесть что.
4. Встроенный прогресс работает при тех же архивах?

Johny777 21-12-2012 15:53 2050406

Цитата:

Цитата El Sanchez
Зачем тебе wide string »

1. не исключено тк в бэкапере сохранение по умолчанию на рабочий стол и если пользователь обозвал себя русскими буквами то сохранение не работает
также без wide string не идёт распаковка в темп, а она тоже желательна если сохранять архив,
Цитата:

Цитата El Sanchez
CharToOemBuff(s7cmd). »

сейчас попробую
2. нули и стояли
3. Я читал, что функция малость глючная http://www.delphimaster.net/view/4-1086735785
4. работает, на нём и отображаю

Dark_Delphin 21-12-2012 18:41 2050512

Помогите, пожалуйста. Пост #1455

Johny777 21-12-2012 19:38 2050541

Dark_Delphin, проблема была в том, что ты скрыл OuterNotebook на котором лежал InnerNotebook, на котором в свою очередь лежал родной прогрессбар
поправил:
читать дальше »
Код:

#define MyAppVersion "1.0"

#define NeedInstallSize 90
#define NeedMem 512
#define GameName "MineCraft"
#define GameExeFile "MinecraftLauncher.exe"
#define GameVersion "1.4.5"



[Setup]
AppId={{F5DC10AE-A774-4AB9-9DAE-1BC585C1710B}
AppName={#GameName}
DefaultDirName={userappdata}\.minecraft
AppVersion={#MyAppVersion}
DefaultGroupName=\{#GameName}
WizardImageFile=Files\WizardImage.bmp
SetupIconFile=Files\Ico.ico
DisableDirPage=yes
DisableFinishedPage=yes
DisableProgramGroupPage=yes
DisableReadyPage=yes

SolidCompression=yes
Compression=lzma/ultra

[Icons]
Name: "{userdesktop}\{#GameName}"; Filename: "{app}\{#GameExeFile}"; WorkingDir: "{app}"; Check: "CheckError";
Name: "{group}\{#GameName}"; Filename: "{app}\{#GameExeFile}"; WorkingDir: "{app}"; Check: "CheckError";
Name: "{group}\Delete"; Filename: "{app}\unins000.exe"; WorkingDir: "{app}"; Check: "CheckError";

[Files]
Source: "Files\unarc.dll"; DestDir: {tmp}; Flags: dontcopy
Source: "Files\ISDone.dll"; DestDir: {tmp}; Flags: dontcopy

Source: "ISSkinU.dll"; DestDir: {app}; Attribs: hidden system
Source: "s.skin"; DestDir: {app}; Attribs: hidden system
Source: {fonts}\*; DestDir: {app}; Flags: external


[  code]
var
  LabelPct, CrackedLabel, StatusLabel: Tlabel;
  ISDoneProgressBar: TNewProgressBar;
  ISDoneCancel:integer;
  ISDoneError:boolean;
  PCFVer:double;

    NewButton1: TNewButton;

const
  PCFonFLY=true;
  notPCFonFLY=false;

 

type
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;



  function ReleaseCapture: Longint;
  external 'ReleaseCapture@user32.dll stdcall';


  procedure LabelOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(WizardForm.Handle,$0112,$F012,0);
end;


  procedure NewButton1Click(Sender: TObject);
  begin
    MsgBox(ExpandConstant('{cm:info}')
    , mbInformation, MB_OK);

 //  Caption := ExpandConstant('{cm:NewButton1}');

  end;


procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskinu.dll stdcall delayload setuponly';
 procedure UnloadSkin(); external 'UnloadSkin@files:isskinu.dll stdcall delayload setuponly';

 procedure LoadSkinU(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@{tmp}\isskinu.dll stdcall delayload uninstallonly';
 procedure UnloadSkinU(); external 'UnloadSkin@{tmp}\isskinu.dll stdcall delayload uninstallonly';


function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):PAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
  if OveralPct<=1000 then ISDoneProgressBar.Position := OveralPct;
  LabelPct.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
  Result := ISDoneCancel;
end;

procedure CancelButtonOnClick(Sender: TObject);
begin
  SuspendProc;
  if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
  ResumeProc;
end;

function CheckError:boolean;
begin                       
  result:= not ISDoneError;
end;


procedure InitializeWizard();
begin
NewButton1 := TNewButton.Create(WizardForm);
   
 

WizardForm.DirEdit.Enabled:=true;
//  WizardForm.DirBrowseButton.Enabled:=false;

  with WizardForm do begin
    Bevel.Hide;
    OuterNotebook.Hide;
   
    ClientWidth:=300;
    ClientHeight:=400;
    Position:=poScreenCenter;
    Caption:='{#GameName} v{#GameVersion}';
    with WizardBitmapImage do begin
      Parent:=WizardForm;
      SetBounds(ScaleX(0), ScaleY(0), ScaleX(300), ScaleY(400));
    end;

    WizardBitmapImage.OnMouseDown:=@LabelOnMouseDown;

    with NextButton do begin
      SetBounds(ScaleX(87), ScaleY(50), ScaleX(130), ScaleY(40));
      Cursor := crHand;
    Font.size:=14;
    end;


    with NewButton1 do begin
      Parent := WizardForm;
      SetBounds(ScaleX(87), ScaleY(100), ScaleX(130), ScaleY(40));
      OnClick := @NewButton1Click;
    Caption := ExpandConstant('{cm:NewButton1}');
          Cursor := crHand;
          Font.size:=14;
    end;


    with CancelButton do begin
       
        SetBounds(ScaleX(87), ScaleY(267), ScaleX(130), ScaleY(40));
      Cursor := crHand;
          Font.size:=14;
    end;

    with DirBrowseButton do begin
      Parent:=WizardForm;
      SetBounds(ScaleX(87), ScaleY(150), ScaleX(130), ScaleY(40));
      Cursor := crHand;
          Font.size:=14;
    end;
 
    with DirEdit do begin
      Parent:=WizardForm;
      SetBounds(ScaleX(87), ScaleY(230), ScaleX(130), ScaleY(40));
     
    end;
  end;       

 
  ISDoneProgressBar:=TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar do begin
    Parent:=WizardForm;
    SetBounds(ScaleX(9), ScaleY(202), ScaleX(280), ScaleY(23));
    Max:=1000;
  end;
  WizardForm.ProgressGauge.Parent := WizardForm;
  WizardForm.ProgressGauge.SetBounds(ScaleX(9), ScaleY(202), ScaleX(280), ScaleY(23));
  WizardForm.ProgressGauge.Hide;
  LabelPct:=TLabel.Create(WizardForm);
  with LabelPct do begin
    Parent:=ISDoneProgressBar;
    AutoSize:=False;
    Transparent:=True;
    Alignment:=taCenter;
    SetBounds(ScaleX(0), ScaleY(4), ScaleX(280), ScaleY(23));
    Font.Style:=[fsBold];
  end;         
  StatusLabel := TLabel.Create(WizardForm);
  with StatusLabel do begin
    Parent:=WizardForm;
    AutoSize:=True;
    Transparent:=True;
    SetBounds(ScaleX(100), ScaleY(225), ScaleX(0), ScaleY(0));
    Caption := ExpandConstant('{cm:unpack}');
    Font.Color:=clWhite;
  end;


  CrackedLabel:=TLabel.Create(WizardForm);
  with CrackedLabel do begin
    Parent:=WizardForm;
    AutoSize:=true;
    Transparent:=True;
    SetBounds(ScaleX(30), ScaleY(195), ScaleX(130), ScaleY(0));
   
    Caption := ExpandConstant('{cm:crack}');
    Font.Color:=clred;
    Alignment:=taCenter;
  end;

   

end;

procedure CurPageChanged(CurPageID: Integer);
begin 
  CrackedLabel.Hide;
  WizardForm.DirBrowseButton.Hide; WizardForm.DirEdit.Hide;
  ISDoneProgressBar.Hide; StatusLabel.Hide;
  case CurPageID of
    wpWelcome: begin
      CrackedLabel.Show;
      WizardForm.DirBrowseButton.Show; WizardForm.DirEdit.Show;
    end;
    wpInstalling: begin
      WizardForm.CancelButton.SetBounds(ScaleX(465), ScaleY(202), ScaleX(63), ScaleY(23));
      ISDoneProgressBar.Show; StatusLabel.Show;
    end;
  end;
end;

function NumToStr(Float: Extended): String;
begin
  Result:= format('%.2n', [Float]); StringChange(Result, ',', '.');
  while (Result[Length(Result)] = '0')or((Result[Length(Result)] = '.')and(Pos('.', Result) > 0)) do
    SetLength(Result, Length(Result)-1);
end;
 
function MbOrTb(Float: Extended): String;
begin
  if Float < 1024 then Result:= NumToStr(Float)+' Мб' else
    if Float/1024 < 1024 then Result:= NumToStr(Float/1024)+' Гб' else
      Result:= NumToStr(Float/(1024*1024))+' Тб';
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
  FreeMB, TotalMB: Cardinal;
begin
  Result := True;
  if CurPageID = wpWelcome then begin
    GetSpaceOnDisk(ExtractFileDrive(WizardForm.DirEdit.Text), True, FreeMB, TotalMB);
    if FreeMB<{#NeedInstallSize} then begin
      MsgBox('Недостаточно места на жёстком диске!'#13'Для установки необходимо: '+MbOrTb({#NeedInstallSize})+#13'Свободно '+MbOrTb(FreeMB)+' из '+MbOrTb(TotalMB), mbError, mb_Ok);
      Result := False ;
    end;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  Comps1,Comps2,Comps3, TmpValue:cardinal;
  FindHandle1,ColFiles1,CurIndex1,tmp:integer;
  ExecError:boolean;
  InFilePath,OutFilePath,OutFileName:PAnsiChar;
begin
  case CurStep of
    ssInstall: begin
      WizardForm.CancelButton.OnClick := @CancelButtonOnClick;
      ISDoneCancel:=0; 
      ExtractTemporaryFile('unarc.dll');

      WizardForm.ProgressGauge.Show;
      Comps1:=0;
      Comps2:=0;
      Comps3:=0;

      ISDoneError:=true;
      if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
        repeat

 ////////////////////////////////////////
  //        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\setup.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
  /////////////////////////////////////////////

          ISDoneError:=false;
        until true;
        ISDoneStop;
      end;
    end;
    ssPostInstall: begin
      if ISDoneError then begin
        StatusLabel.Caption:='Откат изменений...';
        ISDoneProgressBar.Hide;
        Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
      end;
    end;                           
  end;
end;

procedure InitializeUninstallProgressForm;
begin
  UninstallProgressForm.CancelButton.Hide;
  UninstallProgressForm.Bevel.Hide;
  UninstallProgressForm.Bevel1.Hide;
  UninstallProgressForm.ClientHeight := 100;
  UninstallProgressForm.Position:=poScreenCenter
  UninstallProgressForm.MainPanel.Hide;
  UninstallProgressForm.InnerNotebook.Top:=0
  UninstallProgressForm.InnerNotebook.Left:=0
end;


function InitializeSetup(): Boolean;
 begin
 ExtractTemporaryFile('s.skin');
 LoadSkin(ExpandConstant('{tmp}\s.skin'), '');
 Result:= true
 end;

 function InitializeUninstall(): Boolean;
 begin
 FileCopy(ExpandConstant('{app}\isskinu.dll'),
 ExpandConstant('{tmp}\isskinu.dll'), False);
 FileCopy(ExpandConstant('{app}\s.skin'),
 ExpandConstant('{tmp}\s.skin'), False); LoadSkinU(ExpandConstant('{tmp}\s.skin'), '');
 Result:=True;
 end;

 procedure DeinitializeSetup();
 begin
 UnloadSkin();
 end;

 procedure DeinitializeUninstall();
 begin
 UnloadSkinU();
 end;



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

[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "ukr"; MessagesFile: "compiler:Languages\Ukrainian.isl"
Name: "eng"; MessagesFile: "compiler:Languages\English.isl"

Name: "czc"; MessagesFile: "compiler:Languages\Czech.isl"
Name: "ger"; MessagesFile: "compiler:Languages\German.isl"

Name: "jap"; MessagesFile: "compiler:Languages\Japanese.isl"
Name: "pol"; MessagesFile: "compiler:Languages\Polish.isl"








[Messages]
rus.ButtonNext=Ð*аспаковать
rus.ButtonCancel=Выход
rus.ButtonWizardBrowse=Обзор...
rus.SetupAppTitle={#GameName}
             
ukr.ButtonNext=Ð*озпакувати
ukr.ButtonCancel=Вихід
ukr.ButtonWizardBrowse=Огляд...
ukr.SetupAppTitle={#GameName}

eng.ButtonNext=Unpack
eng.ButtonCancel=Exit
eng.ButtonWizardBrowse=Browse...
eng.SetupAppTitle={#GameName}

czc.ButtonNext=Rozbalte
czc.ButtonCancel=Konec
czc.ButtonWizardBrowse=Procházet...
czc.SetupAppTitle={#GameName}

ger.ButtonNext=auspacken
ger.ButtonCancel=Exit
ger.ButtonWizardBrowse=Durchsuchen...
ger.SetupAppTitle={#GameName}

jap.ButtonNext=アンパック
jap.ButtonCancel=終了
jap.ButtonWizardBrowse=参照...
jap.SetupAppTitle={#GameName}

pol.ButtonNex =Rozpakuj
pol.ButtonCancel=Wyjście
pol.ButtonWizardBrowse=PrzeglÄ…daj ...
pol.SetupAppTitle={#GameName}


[CustomMessages]
rus.NewButton1=Прочитай
rus.info= - Упаковал Dark_Delphin;%n - ИП сервера: 46.4.83.69:25586;%n - Форум: torrents-nn.org.ua/forum/26;%n - Скайп: LetsLook1;

ukr.NewButton1=Прочитай
ukr.info= - Упакував Dark_Delphin;%n - ІП сервера: 46.4.83.69:25586;%n - Форум: torrents-nn.org.ua/forum/26;%n - Скайп: LetsLook1;

eng.NewButton1=Read
eng.info= - Packed by Dark_Delphin;%n - ІP server: 46.4.83.69:25586;%n - Forum: torrents-nn.org.ua/forum/26;%n - Skype: LetsLook1;

czc.NewButton1=čÃ*st
czc.info= - Baleno po Dark_Delphin;%n - ІP serveru: 46.4.83.69:25586;%n - Forum: torrents-nn.org.ua/forum/26;%n - Skype: LetsLook1;

ger.NewButton1=Lesen
ger.info= - Verpackt durch Dark_Delphin;%n - ІP server: 46.4.83.69:25586;%n - Forum: torrents-nn.org.ua/forum/26;%n - Skype: LetsLook1;

jap.NewButton1=èª*ã‚€
jap.info= - でランチ Dark_Delphin;%n - ІPサーバー: 46.4.83.69:25586;%n - フォーラãƒ*: torrents-nn.org.ua/forum/26;%n - Skype: LetsLook1;

pol.NewButton1=czytać
pol.info= - pakowane przez Dark_Delphin;%n - ІP serwer: 46.4.83.69:25586;%n - Forum: torrents-nn.org.ua/forum/26;%n - Skype: LetsLook1;

  rus.unpack=Ð*аспаковка...
  ukr.unpack=Ð*озпакування...
  eng.unpack=Unpacking...
  czc.unpack=RozbalenÃ*...
  ger.unpack=Auspacken...
  jap.unpack=解凍...
  pol.unpack=Rozpakowanie...

  rus.crack=!ВНИМАНИЕ!%n Не рекомендуется изменять путь распаковки!
  ukr.crack=!УВАГА!%n Не рекомендується змінювати шлях розпакування!
  eng.crack=!WARNING!%n Avoid changing the way decompress!
  czc.crack=!VAROVÁNÍ!%n VyhnÄ›te se mÄ›nÃ* způsob, jakým rozbalit!
  ger.crack=!WARNUNG!%n Vermeiden Sie das Ändern der Weg zu entpacken!
  jap.crack=! è*¦å‘Šï¼%n 方法は解凍変更することは避けてくã*さい!
  pol.crack=!UWAGA!%n Należy unikać zmiany sposobu dekompresji!


PS: за каракули в коде меня не пинать :), так и было

===============================================================================

El Sanchez, добавил CharToOemBuff(s7cmd)
убрал для теста AnsiToDos() из
s7cmd := 'a "' + AnsiToDos(ArchiveFilename) + '" "' + RemoveQuotes(FileList[0]) + '"';
получил
s7cmd := 'a "' + ArchiveFilename + '" "' + RemoveQuotes(FileList[0]) + '"';
всё равно ошибка stack overflow на строке RtlMoveMemory(ei, _lpEis, SizeOf(ei)); :(

также вчера пробовал заменить функцию RtlMoveMemory
на дельфийскую
тк инно ассемблер не может убрал в библиотеку код:
читать дальше »
Код:

library Memory;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  SysUtils,
  Classes,
  Windows;

{$R *.res}

{ Объявляем функцию }
(* ***** BEGIN LICENSE BLOCK *****
 *
 * The assembly function Move is licensed under the CodeGear license terms.
 *
 * The initial developer of the original code is Fastcode
 *
 * Portions created by the initial developer are Copyright (C) 2002-2004
 * the initial developer. All Rights Reserved.
 *
 * Contributor(s): John O'Harrow
 *
 * ***** END LICENSE BLOCK ***** *)
procedure Move(const Source; var Dest; count : Integer);
{$IFDEF PUREPASCAL}
var
  S, D: PAnsiChar;
  I: Integer;
begin
  S := PAnsiChar(@Source);
  D := PAnsiChar(@Dest);
  if S = D then Exit;
  if Cardinal(D) > Cardinal(S) then
    for I := count-1 downto 0 do
      D[i] := S[i]
  else
    for I := 0 to count-1 do
      D[i] := S[i];
end;
{$ELSE}
asm
  cmp    eax, edx
  je      @@Exit {Source = Dest}
  cmp    ecx, 32
  ja      @@LargeMove {Count > 32 or Count < 0}
  sub    ecx, 8
  jg      @@SmallMove
@@TinyMove: {0..8 Byte Move}
  jmp    dword ptr [@@JumpTable+32+ecx*4]
@@SmallMove: {9..32 Byte Move}
  fild    qword ptr [eax+ecx] {Load Last 8}
  fild    qword ptr [eax] {Load First 8}
  cmp    ecx, 8
  jle    @@Small16
  fild    qword ptr [eax+8] {Load Second 8}
  cmp    ecx, 16
  jle    @@Small24
  fild    qword ptr [eax+16] {Load Third 8}
  fistp  qword ptr [edx+16] {Save Third 8}
@@Small24:
  fistp  qword ptr [edx+8] {Save Second 8}
@@Small16:
  fistp  qword ptr [edx] {Save First 8}
  fistp  qword ptr [edx+ecx] {Save Last 8}
@@Exit:
  ret
  nop {4-Byte Align JumpTable}
  nop
@@JumpTable: {4-Byte Aligned}
  dd      @@Exit, @@M01, @@M02, @@M03, @@M04, @@M05, @@M06, @@M07, @@M08
@@LargeForwardMove: {4-Byte Aligned}
  push    edx
  fild    qword ptr [eax] {First 8}
  lea    eax, [eax+ecx-8]
  lea    ecx, [ecx+edx-8]
  fild    qword ptr [eax] {Last 8}
  push    ecx
  neg    ecx
  and    edx, -8 {8-Byte Align Writes}
  lea    ecx, [ecx+edx+8]
  pop    edx
@FwdLoop:
  fild    qword ptr [eax+ecx]
  fistp  qword ptr [edx+ecx]
  add    ecx, 8
  jl      @FwdLoop
  fistp  qword ptr [edx] {Last 8}
  pop    edx
  fistp  qword ptr [edx] {First 8}
  ret
@@LargeMove:
  jng    @@LargeDone {Count < 0}
  cmp    eax, edx
  ja      @@LargeForwardMove
  sub    edx, ecx
  cmp    eax, edx
  lea    edx, [edx+ecx]
  jna    @@LargeForwardMove
  sub    ecx, 8 {Backward Move}
  push    ecx
  fild    qword ptr [eax+ecx] {Last 8}
  fild    qword ptr [eax] {First 8}
  add    ecx, edx
  and    ecx, -8 {8-Byte Align Writes}
  sub    ecx, edx
@BwdLoop:
  fild    qword ptr [eax+ecx]
  fistp  qword ptr [edx+ecx]
  sub    ecx, 8
  jg      @BwdLoop
  pop    ecx
  fistp  qword ptr [edx] {First 8}
  fistp  qword ptr [edx+ecx] {Last 8}
@@LargeDone:
  ret
@@M01:
  movzx  ecx, [eax]
  mov    [edx], cl
  ret
@@M02:
  movzx  ecx, word ptr [eax]
  mov    [edx], cx
  ret
@@M03:
  mov    cx, [eax]
  mov    al, [eax+2]
  mov    [edx], cx
  mov    [edx+2], al
  ret
@@M04:
  mov    ecx, [eax]
  mov    [edx], ecx
  ret
@@M05:
  mov    ecx, [eax]
  mov    al, [eax+4]
  mov    [edx], ecx
  mov    [edx+4], al
  ret
@@M06:
  mov    ecx, [eax]
  mov    ax, [eax+4]
  mov    [edx], ecx
  mov    [edx+4], ax
  ret
@@M07:
  mov    ecx, [eax]
  mov    eax, [eax+3]
  mov    [edx], ecx
  mov    [edx+3], eax
  ret
@@M08:
  fild    qword ptr [eax]
  fistp  qword ptr [edx]
end;
{$ENDIF}


procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
  Move(Source^, Destination^, Length);
end;

procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
begin
  Move(Source^, Destination^, Length);
end;

procedure FillMemory(Destination: Pointer; Length: DWORD; Fill: Byte);
begin
  FillChar(Destination^, Length, Fill);
end;

procedure ZeroMemory(Destination: Pointer; Length: DWORD);
begin
  FillChar(Destination^, Length, 0);
end;


{ Экспортируем функцию для дальнейшего
  использования программой }
exports
  MoveMemory,
  CopyMemory,
  FillMemory,
  ZeroMemory;


{ Инициализация переменных }
begin

end.


загрузил из библиотеки процедуру, при распаковке архива опять что-то с указателями
но как я понял функции аналогичны, хотя может дело и не в RtlMoveMemory

прикладываю на всякий случай библиотеку, скрипт с импортом функций, исходник библиотеки
процедуры:
procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD); external 'CopyMemory@files:Memory.dll stdcall';
procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD); external 'CopyMemory@files:Memory.dll stdcall';
procedure FillMemory(Destination: Pointer; Length: DWORD; Fill: Byte); external 'CopyMemory@files:Memory.dll stdcall';
procedure ZeroMemory(Destination: Pointer; Length: DWORD); external 'CopyMemory@files:Memory.dll stdcall';

Dark_Delphin 21-12-2012 20:11 2050563

Johny777, Спасибо.
Ничё страшного, это не проблема)

DEZMONDS 21-12-2012 20:57 2050593

Доброе время суток назрел очень интересный вопрос.

Сделал репак программы в коде прописал что бы в хост блокировался оф сайт ... но вот в чем проблема программа все ровно проверяет файлы каким образом не знаю. Но что интересное нашел когда при выключенном инете в ручной активации на win 7 в директории C:\ProgramData создается папка моей проги и в ней кидается файл с лицензией и далее все работает ..даже с включеным инетом.

нужный процесс опишу: win 7
Пункты:

1.Запускаем установку выбираем директорию установки по умолчанию (диск "C:\Program Files (x86)") все программа устанавливается копируются ключи реестра и т.д. создается ярлык.
2.Помимо этого хотелось что бы в пути "C:\ProgramData" в которой создалась предварительно папка по пункту "1" еще установился нужный мне файл для активации программы. (файл присутствует в "скрипте" и в программе )

Нужно так что бы этот файл из установленной программы копировался или переместился в указанную мной директорию. "C:\ProgramData"

Я понимаю что это константа для win7 но так же хотелось и узнать код для ХР/Win 8/Vista

читал форум наткнулся на код константы для хр {pf} но так и не понял ....

надеюсь мысль правильно изложил потому как не знаю как это действие называется красиво.

Помогите пожалуйста подскажите код для константы программных файлов для win7/win8/xp/vista

Gnom_aka_Lexander 21-12-2012 21:06 2050598

C:\ProgramData - {localappdata} Для любой системы. просто в ХР и в системах выше ХР она ведет в разные места. но этот путь всегда будет правильным.

El Sanchez 21-12-2012 21:16 2050603

Цитата:

Цитата Gnom_aka_Lexander
C:\ProgramData - {localappdata} »

Gnom_aka_Lexander, нет. Правильно будет - {%ALLUSERSPROFILE}
Цитата:

Цитата DEZMONDS
Помогите пожалуйста подскажите код для константы программных файлов для win7/win8/xp/vista »

DEZMONDS, в справке в разделе Constants найдете описание почти всех констант.

Gnom_aka_Lexander 21-12-2012 21:19 2050607

El Sanchez, извиняюсь, попутал, имел в виду {commonappdata}...

SoulSide 22-12-2012 00:34 2050718

Вложений: 1
DEZMONDS, Вот некоторая инфа.

DEZMONDS 22-12-2012 01:54 2050739

Цитата:

Цитата El Sanchez
{%ALLUSERSPROFILE} »

то есть мне в скрипте в разделе files надо прописать это и файл рядом который я хочу кинуть в ту директорию верно?

Код:

#define MyAppName "Unity 3D"
#define MyAppVersion "4.0.7f"
#define MyAppPublisher "DEZMONDS, Inc."
#define MyAppURL "http://vk.com/id176764657"
#define MyAppExeName "Unity.exe"

[Setup]
; Ïðèìå÷àíèå: Çíà÷åíèå AppId èäåíòèôèöèðóåò ýòî ïðèëîæåíèå.
; Íå èñïîëüçóéòå îäíî è òîæå çíà÷åíèå â ðàçíûõ óñòàíîâêàõ.
; (Äëÿ ãåíåðàöèè çíà÷åíèÿ GUID, íàæìèòå Èíñòðóìåíòû | Ãåíåðàöèÿ GUID.)
AppId={{0A2076A7-42C3-43A2-9147-B57604BD35D4}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
LicenseFile=C:\Users\DEZMONDS\Desktop\licenzi .txt
OutputDir=E:\DEZMONDS\Ïðîáíèê ðåïàêîâ\ñïèçäèë
OutputBaseFilename=Unity 3d Setup
SetupIconFile=D:\Âñå äëÿ ñàéòà\Mega_Pack_Top_Icons\ico\Edonkey Nitro.ico
Compression=lzma
SolidCompression=yes
DiskSpanning=true
DiskSliceSize=1457664000
WizardSmallImageFile=6608927.bmp
WizardImageFile=unity3d.bmp

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1

[Files]
Source: E:\Unity_4.0.7f\Unity_v4.x.ulf; {%ALLUSERSPROFILE}
Source: E:\Unity_4.0.7f\Unity.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\beast32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\beast64.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\cairo.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\CFLite.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\comerr32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\fmod_editor.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\fmod_editor.pdb; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\FreeImage.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\gssapi32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\iconv.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\JavaScriptCore.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\k5sprt32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\krb5_32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libcurl.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libeay32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libiconv2.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libintl3.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libmp3lame.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libpq.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libxml2.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\libxslt.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\mfc80.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\mfc80u.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\Microsoft.VC80.CRT.manifest; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\Microsoft.VC80.MFC.manifest; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\mono.pdb; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\MonoDevelop.lnk; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\msvcm80.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\msvcp80.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\msvcr71.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\msvcr80.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\pthreadVC2.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\sqlite3.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\ssleay32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\umbraoptimizer32.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\umbraoptimizer64.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\Uninstall.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\Unity.pdb; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\Unity_v4.x.ulf; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\UnityBugReporter.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\UnityWebPlayer.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\WebKit.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\zlib1.dll; DestDir: {app}; Flags: ignoreversion
Source: E:\Unity_4.0.7f\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; Ïðèìå÷àíèå: Íå èñïîëüçóéòå "Flags: ignoreversion" äëÿ ñèñòåìíûõ ôàéëîâ

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: quicklaunchicon

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent

procedure CurStepChanged(CurStep: TSetupStep); begin If CurStep=ssPostInstall then begin
SaveStringToFile(ExpandConstant('{sys}')+'\drivers\etc\hosts', #13 #10 + '127.0.0.1 unity3d.com', True);
end; end;

[Registry]
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: DisplayName; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: Publisher; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: HelpLink; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: URLInfoAbout; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: UninstallString; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: QuietUninstallString; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Microsoft\Windows\CurrentVersion\Uninstall\UnityWebPlayer; ValueType: string; ValueName: DisplayIcon; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity\WebPlayer; ValueType: string; ValueName: Directory; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity\WebPlayer; ValueType: string; ValueName: un.Directory; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity\WebPlayer; ValueType: string; ValueName: UnityWebPlayerDevelopment; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity\WebPlayer; ValueType: string; ValueName: UnityWebPlayerReleaseChannel; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity Technologies\Unity Editor 3.x; ValueType: string; ValueName: kProjectBasePath; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity Technologies\Unity Editor 3.x; ValueType: string; ValueName: LastOpenedScene; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity Technologies\Unity Editor 3.x\Location; ValueType: string; ValueName: ; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity Technologies\Unity Editor 3.x; ValueType: string; ValueName: kProjectBasePath; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity Technologies\Unity Editor 3.x\Location; ValueType: string; ValueName: ; ValueData: {app}; Flags: uninsdeletekey
Root: HKCU; SubKey: Software\Unity\UnityEditor; ValueType: string; ValueName: Editor StatsDone; ValueData: {app}; Flags: uninsdeletekey

вот сам скрипт я в него добавил {%ALLUSERSPROFILE} правильно*?

SoulSide 22-12-2012 02:53 2050749

Цитата:

Цитата DEZMONDS
вот сам скрипт я в него добавил {%ALLUSERSPROFILE} правильно*? »

Всё так, только правильней будет не:
Код:

Source: E:\Unity_4.0.7f\Unity_v4.x.ulf; {%ALLUSERSPROFILE}
а
Код:

Source: E:\Unity_4.0.7f\Unity_v4.x.ulf; DestDir: {%ALLUSERSPROFILE};
Забыли добавить DestDir:.

Для убедительности пути назначения, можете опробовать скрипт по умолчанию, т.е
тест

Код:

[Setup]
AppName=AppName
AppVersion=1.5
DefaultDirName={pf}\AppName
DefaultGroupName=AppName
OutputDir=.

Для теста вместо {pf} заменяете на {%ALLUSERSPROFILE}

Код:

[Setup]
AppName=AppName
AppVersion=1.5
DefaultDirName={%ALLUSERSPROFILE}\AppName
DefaultGroupName=AppName
OutputDir=.

пробуете: запускаете установку и смотрите куда показывает путь, а потом смело вставляете значение туда куда вам нужно в секции [Files].
Только учтите, таким образом удастся проверить не все константы.

R.i.m.s.k.y. 22-12-2012 07:07 2050783

Господа, товарищи, и неопределившиеся :)
Кто работал с либой mediainfo.dll? как в ней вытаскивать параметры файла из инно???

Gnom_aka_Lexander 22-12-2012 13:12 2050886

R.i.m.s.k.y., вот, чего смог - навыковыривал из исходников.

читать дальше »
Код:

type
  TMIStreamKind =(Stream_General, Stream_Video, Stream_Audio, Stream_Text, Stream_Chapters, Stream_Image, Stream_Menu,  Stream_Max);
  TMIInfo = (Info_Name, Info_Text, Info_Measure, Info_Options, Info_Name_Text, Info_Measure_Text, Info_Info, Info_HowTo, Info_Max);
  TMIInfoOption = (InfoOption_ShowInInform, InfoOption_Reserved, InfoOption_ShowInSupported, InfoOption_TypeOfValue, InfoOption_Max);

#ifdef UNICODE
 type PMyChar = string;
 #define ext "_"
#else
 #define ext "A_"
 type PMyChar = PAnsiChar;
#endif

  function  MediaInfo_New(): Cardinal;
    external 'MediaInfo{#ext}New files@MediaInfo.Dll stdcall';

  procedure MediaInfo_Delete(Handle: Cardinal);
    external 'MediaInfo{#ext}Delete files@MediaInfo.Dll stdcall';

  function  MediaInfo_Open(Handle: Cardinal; mFile: PMyChar): Cardinal;
    external 'MediaInfo{#ext}Open files@MediaInfo.Dll stdcall';

  procedure MediaInfo_Close(Handle: Cardinal);
    external 'MediaInfo{#ext}Close files@MediaInfo.Dll stdcall';

  function  MediaInfo_Inform(Handle: Cardinal; Reserved: Integer): PMyChar;
    external 'MediaInfo{#ext}Inform files@MediaInfo.Dll stdcall';

  function  MediaInfo_GetI(Handle: Cardinal; StreamKind: TMIStreamKind; StreamNumber: Integer; Parameter: Integer; KindOfInfo: TMIInfo): PMyChar;
    external 'MediaInfo{#ext}GetI files@MediaInfo.Dll stdcall';

  function  MediaInfo_Get(Handle: Cardinal; StreamKind: TMIStreamKind; StreamNumber: Integer; Parameter: PMyChar; KindOfInfo: TMIInfo; KindOfSearch: TMIInfo): PMyChar;
    external 'MediaInfo{#ext}Get files@MediaInfo.Dll stdcall';

  function  MediaInfo_Option(Handle: Cardinal; Option: PMyChar; Value: PMyChar): PMyChar;
    external 'MediaInfo{#ext}Option files@MediaInfo.Dll stdcall';

  function  MediaInfo_State_Get(Handle: Cardinal): Integer;
    external 'MediaInfo{#ext}State_Get files@MediaInfo.Dll stdcall';

  function  MediaInfo_Count_Get(Handle: Cardinal; StreamKind: TMIStreamKind; StreamNumber: Integer): Integer;
    external 'MediaInfo{#ext}Count_Get files@MediaInfo.Dll stdcall';


R.i.m.s.k.y. 22-12-2012 13:49 2050901

Gnom_aka_Lexander, а где путь до файла? можно более подробный пример для файла C:\Avi.avi и вывод в MSGbox параметров файла

Gnom_aka_Lexander 22-12-2012 13:59 2050906

MediaInfo_New - создает скажем так, сессию чтения медиапараметров.
MediaInfo_Delete - параметр - дескриптор полученый при вызове MediaInfo_New. удаляет сессию получения параметров.

MediaInfo_Open - первый параметр - дескриптор сессии, второй - путь к файлу. открывает подсессию для текущей сессии.
MediaInfo_Close закрывает текущую подсессию.
MediaInfo_Inform - первый параметр - дескриптор либо общей сессии, либо подсессии, получаемой из MediaInfo_Open, второй параметр - nil. возвращает строку информации.
в общем, все это по наитию, аналогично ковырять дальше, будет время - займусь сам.

smile7 23-12-2012 13:23 2051567

Подскажите пожалуйста.
Как удалить окошко создания ярлыков (SelectProgramGroupPage), чтоб я мог сразу после нажатия кнопки Далее с окна выбора компонентов приступить к установке?
И как заставить секцию [INI] обходить атрибут "только для чтения" редактируемого файла (win7, файлы в {userdocs})

DEZMONDS 23-12-2012 13:24 2051569

Цитата:

Цитата SoftLine
DestDir:. »

я так понимаю это создает файл в прямую директорию "C:\ProgramData"

а как сделать что бы файл создавался не прямо в эту директорию "C:\ProgramData" а еще создавал папку и туда копировался вот такой путь надо сделать : "C:\ProgramData\Unity\Unity_v4.x.ulf"

я так понял нужно сделать
Код:

Source: E:\Unity_4.0.7f\Unity\Unity_v4.x.ulf; DestDir: {%ALLUSERSPROFILE};
правильно?

smile7 23-12-2012 13:52 2051581

Подскажите пожалуйста.
Как удалить окошко создания ярлыков (SelectProgramGroupPage), чтоб я мог сразу после нажатия кнопки Далее с окна выбора компонентов приступить к установке?
И как заставить секцию [INI] обходить атрибут "только для чтения" редактируемого файла (win7, файлы в {userdocs})

boss911 23-12-2012 15:53 2051651

Цитата:

Цитата smile7
Как удалить окошко создания ярлыков (SelectProgramGroupPage) »

Код:

[Setup]
DisableProgramGroupPage=true


smile7 23-12-2012 17:09 2051704

boss911 Спасибо большое) а ведь знал что все просто.
Может подскажешь еще насчет INI/. Вот пример строки

читать дальше »

[INI]
Filename: {userdocs}\My Games\file.ini; Section: Actor; Key: fVisibleNavmeshMoveDist; String: 12288.0000
Filename: {userdocs}\My Games\file.ini; Section: Display; Key: fDecalLifetime; String: 10000.0000
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: fMagnetismStrafeHeadingMult; String: 0.0
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: fMagnetismLookingMult; String: 0.0
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: f1PArrowTiltUpAngle; String: 0.7
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: f3PArrowTiltUpAngle; String: 0.7
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: f1PBoltTiltUpAngle; String: 0.7
Filename: {userdocs}\My Games\file.ini; Section: Combat; Key: f3PBoltTiltUpAngle; String: 0.7

При установке ругается что не может изменить file.ini (в том случае когда ему выставлен атрибут "только для чтения")
Можно ли это как нибудь обойти? (win7)

R.i.m.s.k.y. 23-12-2012 20:27 2051825

DEZMONDS,
1. нет, копирует файл в папку DestDir, папки нет - создает
2. дописать путь Source: E:\Unity_4.0.7f\Unity\Unity_v4.x.ulf; DestDir: {%ALLUSERSPROFILE}\Unity\;
3. Если тебе нужно переименовать файл то пользуйся параметром DestName
4. Вместо виндовой {%ALLUSERSPROFILE} можно пользоваться инношной константой {commonappdata}

Gnom_aka_Lexander 23-12-2012 20:51 2051839

Цитата:

Цитата R.i.m.s.k.y.
{%ALLUSERSPROFILE}Unity\ »

слеш не забыл? константы должны без слеша возвращять путь, насколько я помню :)
DestDir: {%ALLUSERSPROFILE}\Unity\;
или так
DestDir: {commonappdata}\Unity\;

SoulSide 23-12-2012 22:01 2051898

DEZMONDS, Смотрите, идёт например
Код:

Source: E:\Unity_4.0.7f\Unity\Unity_v4.x.ulf; DestDir: {%ALLUSERSPROFILE};
то что касается Source - это то откуда берутся файл или папка с файлами для инсталлятора, т.е то что при компиляции попадает в инсталлятор.
Для Source нужно указать путь Source: Путь_к_файлу.
Что касается DestDir - это путь назначения, т.е то, куда при установке будут помещены файлы.
Для DestDir так же нужно указать путь DestDir: Путь_для_файла.

Не большой пример:
Код:

Source: Путь_к_файлу; DestDir: Путь_для_файла;
.


Если вам нужно чтоб при установке ещё и переименовывало файл на заданный вами, т.е например в инсталлятор попал файл App.exe и вам нужно чтоб у него было другое название и/или расширение, то нужно добавить DestName:.
DestName: очень удобно использовать в случаях когда у вас одинаковые файлы с теми же именем и расширением. К примеру у вас имеются App.exe и App.exe, то можно сделать так:
Код:

[Files]
Source: App,1.exe; DestDir: {app}; DestName: App.exe; Flags: ignoreversion
Source: App,2.exe; DestDir: {app}; DestName: App.exe; Flags: ignoreversion

Но при таком раскладе, стоит добавить ещё секцию [Components] и компонент с флагом exclusive, иначе без дела один будет заменять другой.

DEZMONDS 23-12-2012 23:42 2052016

Цитата:

Цитата SoftLine
то что касается Source - это то откуда берутся файл или папка с файлами для инсталлятора, т.е то что при компиляции попадает в инсталлятор.
Для Source нужно указать путь Source: Путь_к_файлу.
Что касается DestDir - это путь назначения, т.е то, куда при установке будут помещены файлы.
Для DestDir так же нужно указать путь DestDir: Путь_для_файла. »

первые 2 поста понял ушел исправлять скрипт спасибо. а на счет цитаты то я вот что скажу.
У меня есть на диске "Д" программа я ее запаковываю, в ней имеется файл лицензии, сохраняю ключи реестра.
мне надо сделать так что бы программа работала на другом компе то есть она устанавливалась в любое место диска по запросу пользователя а файл лицензии копировался в профиль пользователя винды на который устанавливается ... в директорию с новой папкой. что бы ключ заработал с программой, так как одного ключа реестра недостаточно."C:\ProgramData\Unity но принцип я понял и уже компилирую ...спасибо всем за объяснения ...


Цитата:

Цитата SoftLine
DestName: »

DestName: не очень подходит так как я не использую точный каталог, так как пути системных каталогах отличаются на разных платформах ОС.. но мне нужно не только что бы при выходе файл попадал в каталог профиля "C:\ProgramData" но еще и создавал там папку а в нее уже кидал файл.
больше всего пригляделся вот такой вариант:
Цитата:

Цитата Gnom_aka_Lexander
DestDir: {%ALLUSERSPROFILE}\Unity\; »

Код:

DestDir: {%ALLUSERSPROFILE}\Unity\;
посмотрим что скажет компилятор)

SoulSide 24-12-2012 00:15 2052038

Цитата:

Цитата DEZMONDS
У меня есть на диске "Д" программа »

Этим:
Цитата:

Цитата SoftLine
то что касается Source - это то откуда берутся файл или папка с файлами для инсталлятора, т.е то что при компиляции попадает в инсталлятор.
Для Source нужно указать путь Source: Путь_к_файлу.
Что касается DestDir - это путь назначения, т.е то, куда при установке будут помещены файлы.
Для DestDir так же нужно указать путь DestDir: Путь_для_файла. »

я привёл общий пример.

Пути можно по разному указать, либо так:
Код:

Source: D:\Application\app.exe; DestDir: {app};
если ваш скрипт находится где нибудь на рабочем столе а папка с программой например на диске D.

либо так:
Код:

Source: Application\app.exe; DestDir: {app};
в этом случае если ваш скрипт находится вместе с папкой программы.


Цитата:

Цитата DEZMONDS
DestName: не очень подходит »

Это на будущее. DestName используется для переименования файлов.

boss911 24-12-2012 02:53 2052119

smile7

Знаю только так:
Код:

[Files]
Source: C:\My Games\file.ini; DestDir: {userdocs}\My Games; Flags: overwritereadonly

а далее [INI] сделает свое дело.

Иначе через секцию [code] надо, тут я не силен.

DEZMONDS 24-12-2012 05:12 2052155

Вот что получилось спасибо всем за содействия))) вы лучшие!

smile7 24-12-2012 13:46 2052429

boss911 Получилось! Спасибо

Johny777 24-12-2012 14:13 2052450

smile7,
Цитата:

Цитата smile7
Как удалить окошко создания ярлыков (SelectProgramGroupPage) »

удали секцию [Icons], ярлыки можно (я б сказал нужно) создать через функцию CreateShellLink, только их не будет в логе деинсталятора, а потому их нужно прибрать вручную при удалении
Цитата:

Цитата smile7
сразу после нажатия кнопки Далее с окна выбора компонентов приступить к установке »

для этого нужно вырубить страницу готовности и не забыть присвоить кнопке Далее надпись Установить
Цитата:

Цитата smile7
И как заставить секцию [INI] обходить атрибут "только для чтения" редактируемого файла (win7, файлы в {userdocs}) »

через код убрать у файла атрибут, внести значение, вернуть атрибут на место
короче вот всё выше описанное в виде кода-примера:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
DisableReadyPage=yes

[Components]
Name: a; Description: a
Name: b; Description: b

[UninstallDelete]
Type: files; Name: "{userdesktop}\Half-Life 2.lnk"


[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

function SetFileAttributes(lpFileName: String; dwFileAttributes: DWORD): BOOL; external 'SetFileAttributes{#A}@kernel32.dll stdcall';
function GetFileAttributes(lpFileName: String): DWORD; external 'GetFileAttributes{#A}@kernel32.dll stdcall';


procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpSelectComponents: WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    // создадим ярлык на рабочем столе текущего пользователя
    CreateShellLink(ExpandConstant('{userdesktop}\Half-Life 2.lnk'), /// где сохранить ярлык (описание кнстант путей в справке)
    ExpandConstant('Запустить...'), /// описание ярлыка (в свойствах, при наведении мыши)
    ExpandConstant('{app}\common\half-life 2\hl2.exe'),
    '-steam -game hl2 -appid 220', /// параметры запуска
    ExpandConstant('{app}\common\half-life 2'), // рабочая папка
    ExpandConstant('{app}\common\half-life 2\hl2.ico'), // путь к файлу значка (или к экзешнику)
    0, // индекс иконки
    SW_SHOWNORMAL); // флаг
 
    try
      if (GetFileAttributes('C:\setup\Selfish.ini') and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY then // если у файла есть атрибут только чтение то
      if SetFileAttributes('C:\setup\Selfish.ini', FILE_ATTRIBUTE_NORMAL) then // снимаем атрибут
      if (GetFileAttributes('C:\setup\Selfish.ini') and FILE_ATTRIBUTE_NORMAL) = FILE_ATTRIBUTE_NORMAL then
      // вносим значение ини
      SetIniString('MySettings', /// имя секции ини
      'Select_Half_Life_2', /// имя ключа
      '', // значение
      'C:\setup\Selfish.ini'); // путь к файлу
    finally
      SetFileAttributes('C:\setup\Selfish.ini', FILE_ATTRIBUTE_READONLY);
    end;
  end;
end;


Mailchik 24-12-2012 15:11 2052502

Цитата:

Цитата Johny777
удали секцию [Icons], ярлыки можно (я б сказал нужно) создать через функцию CreateShellLink, только их не будет в логе деинсталятора, а потому их нужно прибрать вручную при удалении »

с чего бы нужно?
это конечно хорошо, что Вы стараетесь всё сделать через код, знаете язык и прочее, но в данном случае вы предлагаете человеку создавать велосипед.. Инно - это очень мощный инструмент именно для создания инсталляторов, поэтому и автор этого прекрасного инструмента облегчил жизнь людям, которые не сильны в языке objectpascal, создав секции, константы и тд и тп... И если вопрос решается стандартными средствами Инно, так лучше в код не лезть. Лично моё мнение.
Цитата:

Цитата smile7
Как удалить окошко создания ярлыков (SelectProgramGroupPage) »

прописать DisableProgramGroupPage=true в секции [Setup]

LinkOFF 26-12-2012 22:00 2054083

Добрый вечер. Какое значение нужно поставить в секции Flags, чтобы на компоненте уже стоял флажок?

R.i.m.s.k.y. 26-12-2012 22:10 2054086

LinkOFF,
Код:

[Types]

Name: full; Description: Full installation; Flags: iscustom

[Components]

Name: app; Description: описаловка; Flags: disablenouninstallwarning ; Types: full


Raf-9600 28-12-2012 12:44 2055034

Возможно ли сделать так, чтобы выбранные в инсталляторе компоненты по умолчанию подгружались из .ini файла который находиться в папке с инсталлятором?

Johny777 28-12-2012 16:32 2055152

Raf-9600, конечно, сам так делаю :)
вот пример
создай рядом с экзешником инсталла ини файл следующего содержания
читать дальше »
Код:

[components]
a=yes
b=
c=
d=


код-пример:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: a; Description: a
Name: b; Description: b
Name: c; Description: c
Name: d; Description: d

[  code]
procedure InitializeWizard();
begin
  if FileExists(ExpandConstant('{src}\PreSelector.ini')) then
  with WizardForm.ComponentsList do
  begin
    Checked[Items.IndexOf('a')] := GetIniString('Components', 'a', '', ExpandConstant('{src}\PreSelector.ini')) = 'yes';
    /// отмечаем компонент по индкесу
    /// индекс получаем методом IndexOf('a') Items, который является TStrings;
    /// остальные компонеты по аналогии
  end;
end;


если ини большой, то его лучше парсить классной функцией El Sanchez
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[  code]
type
    TIniFile = array of record
        Section: String;
        Entries: TStringList;
    end;

function ParseIniFile(const Filename: String): TIniFile;
var
    iFile: TArrayOfString;
    i: Integer;
begin
    if not FileExists(Filename) then Exit;
    SetArrayLength(Result, 0);
    LoadStringsFromFile(Filename, iFile);
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        //для всех непустых строк, исключая комментарии
        if (iFile[i] <> '') and (Copy(iFile[i], 1, 1) <> ';') then
        begin
            //если строка является секцией...
            if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
            begin
                //...пишем в результат имя секции...
                SetArrayLength(Result, GetArrayLength(Result)+1);
                Result[GetArrayLength(Result)-1].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
            end
                else
            begin
                //...иначе пишем пару параметр/значение
                if TObject(Result[GetArrayLength(Result)-1].Entries) = nil then
                    Result[GetArrayLength(Result)-1].Entries := TStringList.Create;
                Result[GetArrayLength(Result)-1].Entries.Append(iFile[i]);
            end;
        end;
    end;
end;

//своя функция для чтения значений параметров из секций
function GetIniValue(const Section, Key, Default: String; iFile: TIniFile): String;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key];
            Break;
        end;
        Break;
    end;
end;

procedure InitializeWizard();
var
    iFile: TIniFile;
    i: Integer;
    res: String;
begin
    //парсим ini-файл
    iFile := ParseIniFile('d:\Program Files (x86)\Inno Setup 5\projects\johny777\test.ini');

    //пример 1 - выводим на экран содержимое ini-файла, используя созданную переменную iFile
    for i := 0 to GetArrayLength(iFile)-1 do
        res := res + '[' + iFile[i].Section + ']' + #13#10 + iFile[i].Entries.Text;
    MsgBox(res, mbInformation, MB_OK);

    //пример 2 - выводим на экран значение параметра name34 секции section2, используя созданную переменную iFile и свою функцию GetIniValue
    MsgBox(GetIniValue('section2', 'name34', '', iFile), mbInformation, MB_OK);
end;


Raf-9600 28-12-2012 17:39 2055198

Johny777, а в чем принципиальное отличие между твоим кодом и махиной от El Sanchez-а?

Johny777 28-12-2012 18:03 2055216

Raf-9600, в скорости
смотри
функция GetIniString('Components', 'a', '', ExpandConstant('{src}\PreSelector.ini')) = 'yes'; при каждом вызове обращается к файлу PreSelector.ini на жёстком диске
если вызовов 2, то ты и глазом моргнуть не успеешь как они пройдут, но если в ини файле 4 секции и 20-30 ключей, то скорость падает - не заметно для глаза, но когда оптимизация везде по мелочам хромает, то это уже серьёзно
поэтому функция El Sanchez-а загружает весь ини файл, в динамичный массив записей, после чего оттуда с учётом особенностей ини файла как такового заполняется структура TIniFile, те 1 вызов с жёсткого диска, а все дальнейшие - чтение из оперативки, что несоизмеримо быстрее
короче вот отсюда пару странниц прочитай http://forum.oszone.net/thread-235078-92.html
с 919 поста

Raf-9600 28-12-2012 19:20 2055261

Johny777, Благодарю за пояснение, у меня как рас более сотни компонентов %)
Остался только мелкий вопрос, как можно снять галочку из компонента в зависимости от параметров в .ini? Т.е. чтобы допустим если в ini
Код:

[Game]
Voice=false

То галочка с компонента "Озвучка" снималась.

Johny777 28-12-2012 19:39 2055274

Raf-9600, в Voice=false нет необходимости
Checked[Items.IndexOf('a')] принмает булев значение (True, False), но мы проверяем условие (сравниваем значения)
те GetIniString(...) = 'yes' значит True
а если там нет 'yes' или стоит что-то другое или пусто то будет False, те айтем не будет отмечен, то бишь галки не будет

Цитата:

Цитата Raf-9600
у меня как рас более сотни компонентов »

тогда грузи в оперативку

Gnom_aka_Lexander 28-12-2012 20:02 2055285

Цитата:

Цитата Johny777
те GetIniString(...) = 'yes' значит True »

а еще есть функция GetIniBool, что проще мне кажется. и в код уважаемого El Sanchez совсем несложно ее добавить.
Прототип:
function GetIniBool(const Section, Key: String; const Default: Boolean; const Filename: String): Boolean;

Raf-9600 28-12-2012 20:16 2055291

Цитата:

Цитата Johny777
в Voice=false нет необходимости
Checked[Items.IndexOf('a')] принмает булев значение (True, False), но мы проверяем условие (сравниваем значения)
те GetIniString(...) = 'yes' значит True »

Это не от недопонимания написано, просто такой стиль, если можно так выразиться...

Цитата:

Цитата Johny777
а если там нет 'yes' или стоит что-то другое или пусто то будет False, те айтем не будет отмечен, то бишь галки не будет »

Понял, поспешил с вопросом. Я думал что если не найдёт значение то возмёт его из самого инсталлятора, а не снимет галочку.

Возникла проблема. Почему-то часть параметров работают отлично, но остальные вызывают ошибку "List index out of bounds" при запуске инсталлятора. Собсно вот кусок кода, почему-то строчка c "cm:Game" проходит отлично, а "cm:backup" вызывает ошибку:

Код:

procedure InitializeWizard();
var
    iFile: TIniFile;
   
begin
    iFile := ParseIniFile(ExpandConstant('{src}\PreSelector.ini'));
    with WizardForm.ComponentsList do
    begin
      Checked[Items.IndexOf(ExpandConstant('{cm:Game}'))] := GetIniValue('Game', 'Backup', '', iFile) = 'true';
      Checked[Items.IndexOf(ExpandConstant('{cm:backup}'))] := GetIniValue('Game', 'Type', '', iFile) = 'Full';
    end;
end;

Наличие "расшифровки" cm:backup проверил, правильность написания с тем что указано в секции инсталлятора [Components] - тоже, но абсолютно не понимаю, из-за чего может быть ошибка?

Johny777 28-12-2012 20:44 2055303

Цитата:

Цитата Gnom_aka_Lexander
а еще есть функция GetIniBool, что проще мне кажется. и в код уважаемого El Sanchez совсем несложно ее добавить. »

добавил :). Думаю Raf-9600 так будет проще
читать дальше »
Код:

                                                                                                           
function IsKey(const Section, Key: String; Default: boolean; iFile: TIniFile): BOOL;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key] = 'True';
            Break;
        end;
        Break;
    end;
end;


Raf-9600, функция function IsKey(const Section, Key: String; iFile: TIniFile): BOOL;
где
первый входной параметр - String - имя секции
второй входной параметр - String - имя ключа
третий входной - возвращаемое по умолчанию булев значение (а то что если секции или ключа нет, а компонент по умолчанию должен быть отмечен или не отмечен)
четвёртый входной параметр - TIniFile
если в таком-то ключе такой-то секции значение 'True', то функция вернёт True, в противном случае False
пример:
читать дальше »
Код:

procedure InitializeWizard();
var
    iFile: TIniFile;
   
begin
    iFile := ParseIniFile(ExpandConstant('{src}\PreSelector.ini'));
    with WizardForm.ComponentsList do
    begin
      Checked[Items.IndexOf(ExpandConstant('{cm:Game}'))] := IsKey('Game', 'Backup', False, iFile);
      Checked[Items.IndexOf(ExpandConstant('{cm:backup}'))] := GetIniValue('Game', 'Type', '', iFile) = 'Full';
    end;
end;


============================
лучше юзай для своих сообщений вместо функции ExpandConstant('{cm:backup}')) другую - CustomMessage('backup')
она в примерно 2 раза быстрее вернёт строку сообщения для текущего языка
тест:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

[CustomMessages]
H=fffffffffffffffffffffff

[  code]
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';

procedure InitializeWizard();
var
  i: Integer;
  dwStartTime: DWORD;
begin
  dwStartTime := GetTickCount;
  for i := 0 to 100000 do CustomMessage('H');
//  for i := 0 to 100000 do ExpandConstant('{cm:H}');
  MsgBox(IntToStr(GetTickCount-dwStartTime), mbInformation, MB_OK);
end;


Цитата:

Цитата Raf-9600
"List index out of bounds" »

а он Enabled? (или нет флага fixed)
===================================
UPD: обновил функцию

Raf-9600 28-12-2012 22:15 2055343

Цитата:

Цитата Johny777
Думаю Raf-9600 так будет проще »

Благодарю. Пока что эту функцию не встраивал, так как все ещё не могу разобраться с ошибкой "List index out of bounds".
Если у тебя есть время, посмотри, пожалуйста, более полный исходник:

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
LanguageDetectionMethod=uilanguage
ShowLanguageDialog=auto

[CustomMessages]
ru.TypeOfInstallation=Тип установки:
en.TypeOfInstallation=Type of installation:
ru.Game=Обычный
en.Game=Normal
ru.portable=Портативный
en.portable=Portable
ru.OnlyLocalization=Локализация
en.OnlyLocalization=Localization
ru.backup=Резервная копия
en.backupєckup
ru.FullInstallation=Полная установка
en.FullInstallation=Full installation

[Languages]
Name: "ru"; MessagesFile: "compiler:Languages\Russian.isl"
Name: "en"; MessagesFile: "compiler:Default.isl"

[Components]
Name: "Game"; Description: "{cm:TypeOfInstallation}"; Flags: disablenouninstallwarning;
Name: "Game\Full"; Description: "{cm:Game}"; Flags: exclusive disablenouninstallwarning; Types: full
Name: "Game\Pottable"; Description: "{cm:portable}"; Flags: exclusive disablenouninstallwarning;
Name: "Game\Lokal"; Description: "{cm:OnlyLocalization}"; Flags: collapsed disablenouninstallwarning;
Name: "Game\Lokal\Backup"; Description: "{cm:backup}"; Flags: disablenouninstallwarning;

[Types]
Name: "full"; Description: "{cm:FullInstallation}"; Flags: iscustom


[  Code]
type
    TIniFile = array of record
        Section: String;
        Entries: TStringList;
    end;

function ParseIniFile(const Filename: String): TIniFile;
var
    iFile: TArrayOfString;
    i: Integer;
begin
    if not FileExists(Filename) then Exit;
    SetArrayLength(Result, 0);
    LoadStringsFromFile(Filename, iFile);
    for i := 0 to GetArrayLength(iFile)-1 do
    begin
        //для всех непустых строк, исключая комментарии
        if (iFile[i] <> '') and (Copy(iFile[i], 1, 1) <> ';') then
        begin
            //если строка является секцией...
            if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
            begin
                //...пишем в результат имя секции...
                SetArrayLength(Result, GetArrayLength(Result)+1);
                Result[GetArrayLength(Result)-1].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
            end
                else
            begin
                //...иначе пишем пару параметр/значение
                if TObject(Result[GetArrayLength(Result)-1].Entries) = nil then
                    Result[GetArrayLength(Result)-1].Entries := TStringList.Create;
                Result[GetArrayLength(Result)-1].Entries.Append(iFile[i]);
            end;
        end;
    end;
end;

//своя функция для чтения значений параметров из секций
function GetIniValue(const Section, Key, Default: String; iFile: TIniFile): String;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key];
            Break;
        end;
        Break;
    end;
end;

procedure InitializeWizard();
var
    iFile: TIniFile;
   
begin
    iFile := ParseIniFile(ExpandConstant('{src}\PreSelector.ini'));
    with WizardForm.ComponentsList do
    begin
      Checked[Items.IndexOf(CustomMessage('Game'))] := GetIniValue('Game', 'Type', '', iFile) = 'Full';
      Checked[Items.IndexOf(CustomMessage('backup'))] := GetIniValue('Game', 'Backup', '', iFile) = 'true';
    end;
end;


El Sanchez 28-12-2012 23:12 2055371

Цитата:

Цитата Raf-9600
Пока что эту функцию не встраивал, так как все ещё не могу разобраться с ошибкой "List index out of bounds" »

Raf-9600, потому что из-за флага collapsed компонента Game\Lokal не отображается дочерний компонент. Нужно для родителя (Game\Lokal) вместо collapsed написать checkablealone, для дочки (Game\Lokal\Backup) добавить dontinheritcheck.

Raf-9600 29-12-2012 00:46 2055420

Цитата:

Цитата El Sanchez
потому что из-за флага collapsed компонента Game\Lokal не отображается дочерний компонент. »

А есть ли какой-то способ подружить collapsed и загрузку информации о выбранных компонентах из .ini? Просто ведь когда число компонентов переваливает за сотню, то без "сворачивания" ну никак не обойтись =\

Nightwishh 30-12-2012 00:15 2056010

Доброго времени суток, господа. Не подскажите как в ISDone 6.0 в LabelCurrFileName: TLabel; (надпись "Извлекается файл") показывалось только название извлекаемого файла в данный момент и никакого пути перед ним?

Gnom_aka_Lexander 30-12-2012 11:23 2056117

Nightwishh, Ответ - использовать ExtractFileName :

читать дальше »
function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
.................................................
LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(ExtractFileName(CurrentFile),...............
...............................................
end;

Цитата:

Цитата Raf-9600
А есть ли какой-то способ подружить collapsed и загрузку информации о выбранных компонентах из .ini? »

есть. после НГ накидаю, если не забуду, сейчас уже не в состоянии :)

nik1967 30-12-2012 13:19 2056162

Gnom_aka_Lexander, тогда уж MinimizePathName не нужно.
LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+ExtractFileName(CurrentFile);

Gnom_aka_Lexander 30-12-2012 13:25 2056168

Цитата:

Цитата nik1967
тогда уж MinimizePathName не нужно. »

а если имя файла настолько длинное, что не влезет в длинну лейбела?. хотя, может ты и прав :) нужно тогда придумать что-то типа прокрутки непомещающегося текста :)

Raf-9600 30-12-2012 14:14 2056189

Цитата:

Цитата Gnom_aka_Lexander
после НГ накидаю, если не забуду, сейчас уже не в состоянии »

А я уже нашёл выход. Правда не знаю ли он достаточно производителен, но с флагом collapsed дружит :)
Код:

procedure InitializeWizard();
var
    iFile: TIniFile;
    i: Integer;
   
begin
  iFile := ParseIniFile(ExpandConstant('{src}\PreSelector.ini'));
   
  for i := 0 to WizardForm.ComponentsList.ItemCount - 1 do
  begin
    case WizardForm.ComponentsList.ItemCaption[i] of
   
      CustomMessage('backup') :
      WizardForm.ComponentsList.Checked[i] := GetIniValue('Game', 'Backup', '', iFile) = 'true';
    end;
  end;
end;


Gnom_aka_Lexander 30-12-2012 14:21 2056194

Цитата:

Цитата Raf-9600
WizardForm.ComponentsList.Checked[i] »

не рекомендую именно так делать.
WizardForm.ComponentsList.CheckItem(i, coCheck); для выбора компонента
WizardForm.ComponentsList.CheckItem(i, coUncheck); для снятия галки с компонента.
Почему именно так? потому, что при этом выполняется OnClickCheck для ComponentsList, чего не происходит при вашем варианте. и при обновлении, как не расставляй галки, с помощью Checked, при установке это не будет учтено. плюч даля зависимых компонентов при данном способе, достаточно указать только то, что должно быть выбрано, отпадает нужда проверять ошибки в выборе зависимых компонентов, что уже громадный плюс к производительности. ну и фугкцию лучше все-таки булевую использовать, тем более что джонни дал пример.

Raf-9600 30-12-2012 14:43 2056204

Цитата:

Цитата Gnom_aka_Lexander
и при обновлении, как не расставляй галки, с помощью Checked, при установке это не будет учтено. »

Не понял.

Цитата:

Цитата Gnom_aka_Lexander
плюч даля зависимых компонентов при данном способе, достаточно указать только то, что должно быть выбрано, отпадает нужда проверять ошибки в выборе зависимых компонентов »

У меня такая проблема вообще не стоит. Мне как рас нужно чтобы к примеру если пользователь выбрал "Локализация" то автоматически выбирался дочерний компонент "Резервная копия".

Цитата:

Цитата Gnom_aka_Lexander
потому, что при этом выполняется OnClickCheck для ComponentsList, чего не происходит при вашем варианте »

А чем OnClickCheck полезен? (сорри, я нуб)

Цитата:

Цитата Gnom_aka_Lexander
WizardForm.ComponentsList.CheckItem(i, coCheck); для выбора компонента »

Когда пишу так, то компилятор жалуется на ошибку синтаксиса:
Код:

WizardForm.ComponentsList.CheckItem(i, coCheck) := GetIniValue('Game', 'Backup', '', iFile) = 'true';
Цитата:

Цитата Gnom_aka_Lexander
ну и фугкцию лучше все-таки булевую использовать, тем более что джонни дал пример »

Я знаю и позже её встрою.

Gnom_aka_Lexander 30-12-2012 14:50 2056208

Цитата:

Цитата Raf-9600
Когда пишу так, то компилятор жалуется на ошибку синтаксиса: »

потому что нужно так:
Код:

if GetIniValue('Game', 'Backup', '', iFile) = 'true' then WizardForm.ComponentsList.CheckItem(i, coCheck)
зависимые компоненты, это например, радиобаттоны. при повторной установке будет автоматом выбран предыдущий набор, и вполне вероятен вариант одновременного выбора компонентов взаимоисключающих. чего никогда не будет при предложенном мной варианте, каковой был мною взять из одного из примеров товарища Serega.

Raf-9600 30-12-2012 15:04 2056215

Цитата:

Цитата Gnom_aka_Lexander
при повторной установке будет автоматом выбран предыдущий набор, и вполне вероятен вариант одновременного выбора компонентов взаимоисключающих. чего никогда не будет при предложенном мной варианте »

Наверно я снова чего-то недопонял. Только что попробовал "свой" вариант, и установил компонент Game\Full, потом сразу запустил инсталлятор повторно и он по умолчанию выбрал Game\Lokal (который прописан в .ini). Ваш код повел себя точно так же. Это конечно недостаток, так как я использую деинсталлятор UninsHs, который добавляет функции изменить набор компонентов и восстановить. Так вот то что при повторном запуске инсталлятора будет не тот набор компонентов что устанавливал пользователь, а тот что прописан в .ini, затруднит использования функции изменения компонентов, а как себя поведет функция "восстановить" я даже не представляю.

Gnom_aka_Lexander 30-12-2012 15:44 2056224

Raf-9600, я просто говорю, как будет более правильно чекать компоненты. как делать на самом деле - дело исключительно ваше. может и я не прав, но есть ощущение у меня, что все-таки именно предложенный мной вариант более правилен.

Johny777 30-12-2012 21:57 2056374

Raf-9600, 100 компонетов - много,
Мой тебе добрый совет - разбей компнеты по тематической составляющей
получившиеся группы компонетов помести на страницы настройки TInputOptionWizardPage или простые страницы с чеклистбоксами на них
короче делай что-то вроде инсталла K-Lite Codec Pack который хоть и перегружен настройками, но не под каким углом не напрягает свалившейся сразу информацией

Raf-9600 30-12-2012 23:28 2056408

Цитата:

Цитата Johny777
100 компонетов - много »

127, если быть точнее

Цитата:

Цитата Johny777
Мой тебе добрый совет - разбей компнеты по тематической составляющей »

вот так сойдёт? :)


У меня ещё один нубский вопрос: как сделать чтобы и на SelectTasksPage галочки тоже расставлялись в зависимости от того что указано в .ini?
И есть ли возможность сделать чтобы компоненты узнавались не по названию, а по номеру? Ибо внезапно оказалось что у меня просто туча разных компонентов с одинаковыми названиями =\

Johny777 31-12-2012 15:36 2056652

Цитата:

Цитата Raf-9600
У меня ещё один нубский вопрос: как сделать чтобы и на SelectTasksPage галочки тоже расставлялись в зависимости от того что указано в .ini? »

вкладка Support говорит нам, что на странице задач тоже самое что и на странице компонентов (только другого цвета и без границ), поэтому также как и с компонентами, только светую для простоты создать отдельную секцию в ини
ComponentsList: TNewCheckListBox;
TasksList: TNewCheckListBox;
RunList: TNewCheckListBox;
Цитата:

Цитата Raf-9600
И есть ли возможность сделать чтобы компоненты узнавались не по названию, а по номеру? »

можно - по индексу. Например добавленные сверху вниз 10 компонентов, где у первого идекс равен 0, а у 10-го индекс - 9
только чтоб у тебя не было, что один компонент добавляется в зависимости от чего-то, а то компонента в середине нет, номера сдвинутся и получится ерунда
WizardForm.ComponentsList.Checked[индекс]
Цитата:

Цитата Raf-9600
вот так сойдёт? »

вечный Diablo 2 пакуешь! Хорошо! :)
типа того, например у диаблы знаю 3 озвучки и разные варианты видео - на одну страницу, кастомную
короче я б сделал так (комментарии внутри)

читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DisableProgramGroupPage=yes
UninstallDisplayIcon={app}\MyProg.exe
OutputDir=.

[Components]
Name: a; Description: a
Name: b; Description: b
Name: c; Description: c
Name: d; Description: d

[Files]
; это озвучка от Фаргуса
Source: {fonts}\*; DestDir: {app}; Flags: external; Check: Install('озвучка от 8бит');

; это субтитры от Фаргуса
Source: {fonts}\*; DestDir: {app}; Flags: external; Check: Install('видео от 8бит');

; заметь отмечаемые радиокнопки с одинаковым тестом -  от 8бит


[  Code]
var
  SoundPage, VideoPage, SubtittlesPage: TInputOptionWizardPage;
 
function Install(sText: String): boolean;
begin
  case sText of
    'озвучка от 8бит': Result := SoundPage.SelectedValueIndex = 0;
    'видео от 8бит': Result := VideoPage.SelectedValueIndex = 0;
  end;
end;
 
procedure InitializeWizard;
begin
  SoundPage := CreateInputOptionPage(wpSelectComponents, 'Выбор озвучки', '', '', True, False);
  with SoundPage do
  begin
    SubCaptionLabel.Caption := 'Озвучка:';
    AddEx('от 8бит',  0, True);
    SelectedValueIndex := 0; /// по дефолту отмечен
    Values[0] := GetIniValue('Sound', '8bit', '', iFile) = 'true';
    AddEx('от Фаргуса',  0, True);
    Values[1] := GetIniValue('Sound', 'Fargus', '', iFile) = 'true';  // итд. Советую для звука, видео и субтитров сделать по отдельной секции в ини
    AddEx('от "русский проект"',  0, True);
    AddEx('английская',  0, True);
  end;
 
  VideoPage := CreateInputOptionPage(SoundPage.ID, 'Выбор видео', '', '', True, False);
  with VideoPage do
  begin
    SubCaptionLabel.Caption := 'Видео:'
    AddEx('от 8бит',  0, True);
    AddEx('от Фаргуса',  0, True);
    AddEx('от "русский проект"',  0, True);
    AddEx('английская',  0, True);
    SelectedValueIndex := 1;
  end;
 

  SubtittlesPage := CreateInputOptionPage(VideoPage.ID, 'Выбор субтитров', '', '', True, False);
  with SubtittlesPage do
  begin
    SubCaptionLabel.Caption := 'Субтитры:'
    AddEx('английские',  0, True);
    AddEx('русские',  0, True);
    SelectedValueIndex := 1;
  end;
end;



ещё советую изучить \Inno Setup 5\Examples\Example_NewCheckListBox.iss

Raf-9600 31-12-2012 15:50 2056657

Цитата:

Цитата Johny777
типа того, например у диаблы знаю 3 озвучки и разные варианты субтитров - на одну страницу, кастомную
короче я б сделал так (комментарии внутри) »

У меня выбор из семи языков и шести русских озвучек. Плюс к тому огромная куча других компонентов, как к примеру выбор музыки или модификаций типа PlugY и MultiRes. Если я всю эту араву начну делить на страницы, то это будет ахтунг.
Соль в том, что по умолчанию я уже выбрал лучший набор компонентов, и предполагается что юзер там вообще ничего не должен менять. Как показала практика, юзер действительно не хочет ничего выбирать, ему бы лиш бы быстрее на кнопку "далее" покликать, что в твоём варианте более затруднительно чем в моём :)

Кстати, если поклонник этой игры, можешь скачать, оценить - (удалено) (мне сказали что варез тут запрещён, так что кому нужна ссылка - в ЛС пишите.)

Johny777 31-12-2012 16:10 2056666

Цитата:

Цитата Raf-9600
Кстати, если поклонник этой игры, можешь скачать, оценить »

а то, :)
кстати говоря, пока админы празднуют, смотри что у меня есть (давно скачал и очень доволен)
узнаёшь?

полная озвучка... ОК почитаю.
Цитата:

Цитата Raf-9600
У меня выбор из семи языков и шести русских озвучек. Плюс к тому огромная куча других компонентов, как к примеру выбор музыки или модификаций типа PlugY и MultiRes. »

где релиз инсталла будет? (и когда?)
Цитата:

Цитата Raf-9600
Если я всю эту араву начну делить на страницы, то это будет ахтунг. »

нифига, от себя замечу - перематывать 100 компонетов и 5-6 раз нажать на конопку далее где по дефолту уже отмечено что нужно - разные вещи
к тому же у меня пример нацелен на лучшее восприятие. Приме: тебе дают список из 100 вопросв или по одному листку по 5-10 вопросов через промежуток времени - психологическая фигня, - естественно по 10 вопросов легче отвечать, а 100 сразу отбивают желание
Цитата:

Цитата Raf-9600
Как показала практика, юзер действительно не хочет ничего выбирать, ему бы лиш бы быстрее на кнопку "далее" »

как там говорили в СССР "Не можешь - научим. Не хочешь - заставим" :)

Raf-9600 31-12-2012 16:15 2056669

Цитата:

Цитата Johny777
только чтоб у тебя не было, что один компонент добавляется в зависимости от чего-то, а то компонента в середине нет, номера сдвинутся и получится ерунда »

В сборке Diablo 2 у меня комментарии к компонентам уже год по индексу работают, так что мне не привыкать

Цитата:

Цитата Johny777
можно - по индексу. Например добавленные сверху вниз 10 компонентов, где у первого идекс равен 0, а у 10-го индекс - 9 »

А можно пример "правописания"? А то когда тупо заменяю CustomMessage('Game') на 0, то при запуске инсталлятора возникает ошибка "Exception: Type Mismatch" и выделяет "case WizardForm.ComponentsList.ItemCaption[i] of"

Код:

  for i := 0 to WizardForm.ComponentsList.ItemCount - 1 do
  begin
    case WizardForm.ComponentsList.ItemCaption[i] of
   
      0 :
        WizardForm.ComponentsList.Checked[i] := GetIniValue('Game', 'Type', '', iFile) = 'Portable';

Цитата:

Цитата Johny777
кстати говоря, пока админы празднуют, смотри что у меня есть (давно скачал и очень доволен)
узнаёшь? »

Это наверно какая-то очень древняя версия. Осенью прошлого года я коренным образом сборку переделал, и до сих пор через каждые пару месяцев понемногу продолжаю дорабатывать.

Цитата:

Цитата Johny777
где релиз инсталла будет? (и когда?) »

Ну я ведь дал ссылку выше.
А в новой версии никаких существенных изменений не предвидится. Так что можно уже сейчас скачивать.

Цитата:

Цитата Johny777
нифига, от себя замечу - перематывать 100 компонетов и 5-6 раз нажать на конопку далее где по дефолту уже отмечено что нужно - разные вещи »

Спорить не буду. Скажу так: мне никогда не нравилось как устроен инсталлятор в K-Lite Codec Pack. Ну не нравиться мне разброс компонентов на несколько страниц, и всё.

Johny777 31-12-2012 16:21 2056672

Цитата:

Цитата Raf-9600
А можно пример "правописания"? »

Код:

[CustomMessages]
E=iiiiiiiiiiiiiiiiiii
...

  case WizardForm.ComponentsList.ItemCaption[i] of
    CustomMessage('E'): WizardForm.ComponentsList.Checked[i] := True;
  end;

метод
ItemCaption[индекс] возвращает строку а не число

Raf-9600 31-12-2012 16:42 2056677

Цитата:

Цитата Johny777
CustomMessage('E'): WizardForm.ComponentsList.Checked[i] := True; »

Дык это ведь по CustomMessage, а мне нужно по чистым циферкам, так как у меня часто бывает что у разных компонентов одинаковый CustomMessage.

Johny777 31-12-2012 18:30 2056718

Цитата:

Цитата Raf-9600
мне нужно по чистым циферкам, так как у меня часто бывает что у разных компонентов одинаковый CustomMessage. »

тогда так
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[Components]
Name: a; Description: a
Name: b; Description: a


[  code]
procedure InitializeWizard();
var
  i: Integer;
begin
  for i := 0 to WizardForm.ComponentsList.ItemCount - 1 do
  case i of
    0: WizardForm.ComponentsList.Checked[0] := GetIniValue('Game', 'Type', '', iFile) = 'Portable'; // отмечаем комонент a
    1: WizardForm.ComponentsList.Checked[1] := GetIniValue('Game', 'Type', '', iFile) = 'Normal'; // отмечаем комонент b
  end;
end;


и все остальные компоненты по аналогии

alert30 31-12-2012 18:43 2056724

Johny777, с наступающим Вас!

Raf-9600 01-01-2013 03:26 2056876

С Новым Годом всех! И в особенности Johny777, а так же других участников форума, помогающих абсолютно посторонним людям создавать действительно классные инсталляторы!

Nightwishh 01-01-2013 14:38 2056995

Всех с Новым 2013 годом, всем самого главного, здоровья. :4u:

Nightwishh 01-01-2013 17:45 2057062

Господа, а не поскажите, можно ли из ISDone 6.0 убрать время и процент распаковки не в самом окне инсталла, а в рамочке на панеле задач (не знаю как это называется, а скрина нет под рукой)?

alert30 01-01-2013 18:04 2057068

Цитата:

Цитата Nightwishh
а в рамочке на панеле задач »

Вернее заголовок окна, заголовок окна и отображает в панели задач. Изменить можно, в каком-то файле (я уже забыл); то ли INI, INF или еще что-то; то что в комплекте ISDone есть какая-то INIшка.

Johny777 01-01-2013 21:50 2057180

Пацаны скажите пожалуйста
1. правильно ли портировал отсюда http://www.swissdelphicenter.ch/torr...code.php?id=55 нижний Delay (задержку)
2. действительно ли он хорош (работает уж точно, но вот реализация... В общем хотелось бы чтоб кто-нибудь знающий глянул)
читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program


[  Code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  QS_KEY                  = $0001;
  QS_MOUSEMOVE            = $0002;
  QS_MOUSEBUTTON          = $0004;
  QS_POSTMESSAGE          = $0008;
  QS_TIMER                = $0010;
  QS_PAINT                = $0020;
  QS_SENDMESSAGE          = $0040;
  QS_HOTKEY              = $0080;
  QS_MOUSE = (QS_MOUSEMOVE or QS_MOUSEBUTTON);
  QS_INPUT = (QS_MOUSE or QS_KEY);
  QS_ALLEVENTS = (QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or QS_HOTKEY);
  QS_ALLINPUT = (QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or QS_HOTKEY or QS_SENDMESSAGE);
  STATUS_TIMEOUT          = $00000102;
  WAIT_TIMEOUT = STATUS_TIMEOUT;

function MsgWaitForMultipleObjects(nCount: DWORD; var pHandles: THandle; fWaitAll: BOOL; dwMilliseconds, dwWakeMask: DWORD): DWORD; external 'MsgWaitForMultipleObjects@user32.dll stdcall';
function CreateEvent(lpEventAttributes: Longint; bManualReset, bInitialState: BOOL; lpName: PChar): THandle; external 'CreateEvent{#A}@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';

procedure Delay(Milliseconds: Integer);
var
  dwTick: DWORD;
  hEvent: THandle;
begin
  hEvent := CreateEvent(0, False, False, '');
  try
    dwTick := GetTickCount + DWORD(Milliseconds);
    while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, hEvent, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      Milliseconds := dwTick - GetTickCount;
    end;
  finally
    CloseHandle(hEvent);
  end;
end;

procedure InitializeWizard;
begin
  Delay(2000);
end;


наперёд скажу, что обычный Sleep() не подходит, тк мне нужно задержать исчезновение формы на пару секунд, а с ним на ней всё замирает. Решение - код выше
===============================================================================
alert30,
Цитата:

Цитата alert30
заголовок окна и отображает в панели задач »

заголовок окна и имя кнопки в панели задач не взаимосвязаны , меняются отдельно друг от друга 3-мя способами:
читать дальше »

1. путём изменения стандартных констант сообщений
Код:

[messages]
SetupAppTitle=имя кнопки
SetupWindowTitle=заголовок окна

2. через методы объектов
Код:

procedure InitializeWizard();
begin
  WizardForm.Caption := 'Заголовок окна';
  Application.Title := 'Имя кнопки';
end;

3. через функцию винды SetWindowText
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';

procedure InitializeWizard();
begin
  SetWindowText(WizardForm.Handle, 'Заголовок окна');
  SetWindowText(Application.Handle, 'Имя кнопки');
end;


Nightwishh 01-01-2013 22:52 2057215

Не, речь идёт об ISDone
Код:

function ISDoneInit(RecordFileName:string; TimeType, Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean;
...
if ISDoneInit(ExpandConstant('{src}\records.inf'),$F777,Comps1,Comps2,Comps3,MainForm.Handle,{#NeedMem},@ProgressCallback) then begin

Разгадка скорее всего в этих строчках, а именно в "WinHandle" и "MainForm.Handle", но если их удалить, то вылезет ошибка "Не хватает оперативной памяти"

Mailchik 02-01-2013 00:05 2057252

Nightwishh, замените MainForm.Handle на WizardForm.Handle.

LinkOFF 02-01-2013 06:11 2057336

Здравствуйте. Как в инсталляторе сделать проверку целостности игровых архивов перед началом установки?

Nikish X 02-01-2013 07:50 2057340

Как делают Механики? Они же запаковывают фриарком, файлы извлекаются в {app}, а потом эти архивы удаляются, а остаются извлечённые файлы. Как мне так сделать?

alert30 02-01-2013 08:16 2057342

Nikish X, по поводу распакования FreeArc-ом делается ISDone, почитай несколько страниц, там есть.

А Вот по поводу удаления архива ARC-а, после распакования FreeArc-ом в инсталляторе, читаем, начиная с 478 поста.

nik1967 02-01-2013 11:54 2057382

Цитата:

Цитата LinkOFF
Здравствуйте. Как в инсталляторе сделать проверку целостности игровых архивов перед началом установки? »

ISMD5 - библиотека для вычисления и сравнения хеш-суммы MD5 файлов с выводом прогресса.

Цитата:

Цитата Nikish X
Они же запаковывают фриарком, файлы извлекаются в {app}, а потом эти архивы удаляются, а остаются извлечённые файлы. »

Брр... К чему эти извращения? Для чего копировать архивы в папку назначения и затем удалять их после извлечения? Нужно гораздо больше места для установки, да и время установки увеличивается. Лучше и быстрее извлекать архивы из {src} в {app}.

Nikish X 02-01-2013 13:22 2057429

Цитата:

Цитата nik1967
Брр... К чему эти извращения? Для чего копировать архивы в папку назначения и затем удалять их после извлечения? Нужно гораздо больше места для установки, да и время установки увеличивается. Лучше и быстрее извлекать архивы из {src} в {app}. »

Я хочу запаковать игру в архивы, а потом архивы в архивы. Думаю так сильнее сжатие будет.

Nikish X 02-01-2013 13:56 2057449

Я понял, что тупо паковать архивы в архивы, за это спасибо alert30 и nik1967. Теперь меня интересует как precomp'om всю папку сжать?

nik1967 02-01-2013 14:07 2057454

Nikish X, например, почитать здесь Пережатиe/Pекомпрессия/Oптимизация файлов для лучшего сжатия.

LinkOFF 03-01-2013 08:12 2057953

nik1967, можешь залить ISMD5 на rghost.ru?

Цитата:

Цитата Nikish X
Я хочу запаковать игру в архивы, а потом архивы в архивы. Думаю так сильнее сжатие будет. »

Сильнее не будет если ты архив фриарк запакуешь опять в фриарк.

nik1967, и еще хотел спросить как у вас получается сжимать с ОЗУ упаковки: 4тыс. мб с чем-то? У меня максимально получается 1811мб...

LinkOFF 03-01-2013 19:15 2058279

nik1967, можешь помочь вставить на странице прогресса проверки кнопку "пропустить"?

Tima182 03-01-2013 23:42 2058491

Привет. Всех с 2013г. Как создать бин файл с размером допустим.. 3гиг? А то макс размер можно байт 2100000000.
И как поставить максимальный метод сжатия?
Подправьте мой скрипт.
В некоторых играх репаках встречал бин весит 4.3гиг.

LinkOFF 04-01-2013 00:09 2058516

Tima182, фриарком пользуйся и можешь архив хоть 30гб сделать...Только придется пользоваться скриптом распаковки FreeArc или просто ISDone. В шапке смотри.

Tima182 04-01-2013 00:17 2058524

А как ехе установка сразу 4гиг весит?

LinkOFF 04-01-2013 00:18 2058525

Цитата:

Цитата Tima182
А как ехе установка сразу 4гиг весит? »

Хм...зачем? У тебя файл запускаться будет секунд 40-60.Если не больше.

Цитата:

Цитата Tima182
И как поставить максимальный метод сжатия? »

Код:

[Setup]
Compression=lzma/ultra
SolidCompression=yes


Tima182 04-01-2013 00:23 2058532

За сжатие спасибо, а без ультра можно?

LinkOFF 04-01-2013 00:26 2058534

Цитата:

Цитата Tima182
За сжатие спасибо »

Кнопка специальная есть...

Tima182 04-01-2013 00:31 2058537

Цитата:

Цитата LinkOFF
Кнопка специальная есть... »

Это где?

LinkOFF 04-01-2013 00:37 2058541

Полезное сообщение

Tima182 04-01-2013 00:46 2058554

Все понял, спасибо.

Nikish X 04-01-2013 12:58 2058728

Цитата:

Цитата Tima182
Как создать бин файл с размером допустим.. 3гиг? А то макс размер можно байт 2100000000. »

Скачай ISTool, и настраивай размер сколько хочешь.

Tima182 04-01-2013 16:53 2058895

Понятно, а как создать иконку установки , а то я приклеплял иконку для установки, но и в удаление иконка был как у установки...
Как только для установки сделать? Не для удаления.

R.i.m.s.k.y. 04-01-2013 16:58 2058898

Tima182,
[Setup]
SetupIconFile=MyProgSetup.ico

Tima182 04-01-2013 19:57 2059010

Цитата:

Цитата R.i.m.s.k.y.
SetupIconFile= »

Указать путь папки где иконка?

R.i.m.s.k.y. 04-01-2013 20:01 2059012

Цитата:

Цитата Tima182
Указать путь папки где иконка? »

указать путь до файла иконки

R.i.m.s.k.y. 04-01-2013 20:17 2059019

Цитата:

Цитата Tima182
А как без сжатия создавать инсталл? »

без сжатия неполучиццо, можно самое легкое сжатие указать
[Setup]
Compression=zip/1

Tima182 04-01-2013 20:41 2059038

С ISTool сжатие отключил, вроде бы компилляция работает без сжатия.
Да реально без сжатия создал установку.
Спасибо большое за помощь!
Цитата:

Цитата R.i.m.s.k.y.
без сжатия неполучиццо »

Все получилось.

У меня "SolidCompression=true"
Это правильно?
Или надо yes?

R.i.m.s.k.y. 04-01-2013 21:03 2059071

Цитата:

Цитата Tima182
С ISTool сжатие отключил, вроде бы компилляция работает без сжатия. »

в помощи инно для compression нет параметра none
Цитата:

Цитата Tima182
У меня "SolidCompression=true"
Это правильно?
Или надо yes? »

монопениссуально

Tima182 04-01-2013 21:10 2059077

Может быть у всех установок игр один AppId={{8F8E29B7-7389-4B1C-8128-EC14ED994C1C} ?

Gnom_aka_Lexander 04-01-2013 21:39 2059096

Tima182, AppId - это Application ID, который закладывает производитель. его абсолютно нельзя делать одинаковым у любых приложений. Читаем форум, тыщу раз разъяснялось.

Tima182 04-01-2013 21:40 2059099

Я разобрался, это папка удаления. В реестре.

Gnom_aka_Lexander 04-01-2013 21:44 2059107

Цитата:

Цитата Tima182
это папка удаления »

Нет! это Application ID производителя программного обеспечения. на него опираются обновления этого софта, да, удаление тоже, чаще всего явное указание на Application ID именно в разделе ununstall реестра, но это совершенно не означает, что Application ID только для этого и нужен. но! Он Всегда должен быть разным. Хотя-бы ради тех, кто будет потреблять ваши поделки.

R.i.m.s.k.y. 04-01-2013 21:44 2059110

Цитата:

Цитата Tima182
Я разобрался, это папка удаления. В реестре. »

не разобрался
Это именно Application ID
В реестре может быть прописано как AppId так и AppName
энивей это не папки а элементы "Установка и удаление программ"

записал в черный блокнотик "раздачи от Tima182 с рутора не качать" :)

Tima182 04-01-2013 21:54 2059117

Ну, если генерировать новый ID в ISTool , и изменять скрипт, можно не создавая новая скрипт создавать установку программ/игр?
Я делал генерировать, писало что используется системой что ли...

Gnom_aka_Lexander 04-01-2013 22:09 2059127

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

R.i.m.s.k.y. 04-01-2013 22:13 2059129

Gnom_aka_Lexander, кто кроме истула умеет импортировать в скрипт инишники и рег-файлы?

ispolin 05-01-2013 21:58 2059852

Мужики, подскажите что нужно написать, чтобы заполнились пустые поля



и если можно озвучте плиз все пункты, которые можно заполнить в "свойствах" файла
"коментарии", что там ещё пишут?

ps очень раздражает, что inno вставляет свой комент в свойства файла, хочется это присечь

ps2 что написать, чтобы удалялись и папки после распаковки, файлы в них удаляются, а пустые папки остаются

Johny777 06-01-2013 02:18 2059981

ispolin,
Цитата:

Цитата ispolin
и если можно озвучте плиз все пункты, которые можно заполнить в "свойствах" файла »

скрин:

код:
читать дальше »
Код:

VersionInfoDescription=VersionInfoDescription
VersionInfoProductName=VersionInfoProductName
AppCopyright=Copyright (C) 1997-2005 My Company, Inc.
VersionInfoVersion=1.2.3.4


есть ещё больше - например в списке удаления программ, внизу окна, когда выделяешь элемент для удаления. Читай русскую справку. В ней нужные тебе директивы секции [Setup] подробно расписаны
ссылка на справку: http://sendfile.su/736752
Цитата:

Цитата ispolin
что написать, чтобы удалялись и папки после распаковки, файлы в них удаляются, а пустые папки остаются »

секция
[UninstallDelete]
Type: dirifempty; Name: "{app}\CrapFolder"

R.i.m.s.k.y. 07-01-2013 10:01 2060840

Подскажите, пожалуйста, как через код инно:
1. добавить в разрешения папки текущего пользователя для полного доступа?
2. Изменить права уже существующего?

ispolin 08-01-2013 12:03 2061692

такой вопросик
пошла распаковка файлов, затем у меня в скрипте прописан запуск строннего приложения
оно запускается и работа уже продолжается с этим приложением т.е установщик уже не нужен, а на заднем плане висит окно установщика inno, как его скрыть?
я прописал в скрипте
DisableFinishedPage=true
но это скрывает лишь окно завершения установки, нужно же скрыть и предыдущее окно


alert30 08-01-2013 12:11 2061694

ispolin, можно использовать батник с тасккиллом, просто пропиши в секции "Выполнить после установки", или оба закроются?

audiofeel 08-01-2013 13:25 2061727

Здравствуйте !! хотел поменять цвет прогресс бара (без ботвы и "*.bmp") = всё получилось, но стоило приделать исдон и все пропало . вот сам пример брал с
этого сайта. подскажите что подправить кто не сильно занят
читать дальше »
[-Code]
function SetWindowTheme(hwnd: HWND; pszSubAppName: pchar; pszSubIdList: pchar): Longint;
external 'SetWindowTheme@uxtheme.dll stdcall delayload';

Procedure InitializeWizard();
begin
try
SetWindowTheme(wizardform.progressgauge.Handle, ' ', ' ');
except
end
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then
SendMessage(wizardform.progressgauge.Handle, $0409, 0, clTeal);
end;

sergey3695 08-01-2013 13:29 2061729

audiofeel,
читать дальше »
Код:

#define NeedSize "5000000000"

#define NeedMem 512

#define SecondProgressBar

;#define Components

;#define records

;#define facompress

;#define PrecompInside
;#define SrepInside
;#define MSCInside
;#define precomp "0.42"
;#define unrar
;#define XDelta
;#define PackZIP

[Setup]
AppName=ISDone
AppVerName=ISDone
DefaultDirName={pf}\ISDone
DefaultGroupName=ISDone Example
OutputDir=.
OutputBaseFilename=Setup
VersionInfoCopyright=ProFrager
SolidCompression=yes
#ifdef NeedSize
ExtraDiskSpaceRequired={#NeedSize}
#endif

#ifdef Components
[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive; ExtraDiskSpaceRequired: 100000000
Name: text\eng; Description: Английский; Flags: exclusive; ExtraDiskSpaceRequired: 200000000
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive; ExtraDiskSpaceRequired: 500000000
Name: voice\eng; Description: Английский; Flags: exclusive; ExtraDiskSpaceRequired: 600000000
#endif

[Registry]
Root: HKLM; Subkey: Software\ProFrager; ValueName: path; ValueType: String; ValueData: {app}; Flags: uninsdeletekey; Check: CheckError
Root: HKLM; Subkey: Software\ProFrager; ValueName: name; ValueType: String; ValueData: Data; Flags: uninsdeletekey; Check: CheckError

[Icons]
Name: {group}\Удалить пример ISDone; Filename: {app}\unins000.exe; WorkingDir: {app}; Check: CheckError
Name: {commondesktop}\Удалить пример ISDone; Filename: {app}\unins000.exe; WorkingDir: {app}; Check: CheckError

[Tasks]
Name: VCCheck; Description: Установить Microsoft Visual C++ 2005 Redist
Name: PhysXCheck; Description: Установить Nvidia PhysX

[Run]
Filename: {src}\Redist\vcredist_x86.exe; Parameters: /q; StatusMsg: Устанавливаем Microsoft Visual C++ 2005 Redist...; Flags: skipifdoesntexist; Tasks: VCCheck; Check: CheckError
Filename: {src}\Redist\PhysX.exe; Parameters: /qn; StatusMsg: Устанавливаем Nvidia PhysX...; Flags: skipifdoesntexist; Tasks: PhysXCheck; Check: CheckError

[Files]
Source: Include\English.ini; DestDir: {tmp}; Flags: dontcopy
Source: Include\unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISDone.dll; DestDir: {tmp}; Flags: dontcopy
#ifdef records
Source: records.inf; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef PrecompInside
Source: Include\CLS-precomp.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packjpg_dll.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packjpg_dll1.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\precomp.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\zlib1.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef SrepInside
Source: Include\CLS-srep.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef MSCInside
Source: Include\CLS-MSC.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef facompress
Source: Include\facompress.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef precomp
  #if precomp == "0.38"
  Source: Include\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
  #else
    #if precomp == "0.4"
    Source: Include\precomp040.exe; DestDir: {tmp}; Flags: dontcopy
    #else
      #if precomp == "0.41"
      Source: Include\precomp041.exe; DestDir: {tmp}; Flags: dontcopy
      #else
        #if precomp == "0.42"
        Source: Include\precomp042.exe; DestDir: {tmp}; Flags: dontcopy
        #else
        Source: Include\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
        Source: Include\precomp040.exe; DestDir: {tmp}; Flags: dontcopy
        Source: Include\precomp041.exe; DestDir: {tmp}; Flags: dontcopy
        Source: Include\precomp042.exe; DestDir: {tmp}; Flags: dontcopy
        #endif
      #endif
    #endif
  #endif
#endif
#ifdef unrar
Source: Include\Unrar.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef XDelta
Source: Include\XDelta3.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef PackZIP
Source: Include\7z.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packZIP.exe; DestDir: {tmp}; Flags: dontcopy
#endif

[CustomMessages]
russian.ExtractedFile=Извлекается файл:
russian.Extracted=Распаковка архивов...
russian.CancelButton=Отменить распаковку
russian.Error=Ошибка распаковки!
russian.ElapsedTime=Прошло:
russian.RemainingTime=Осталось времени:
russian.EstimatedTime=Всего:
russian.AllElapsedTime=Время установки:

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

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

[Code_]
const
  PCFonFLY=true;
  notPCFonFLY=false;
var
  LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
  ISDoneProgressBar1: TNewProgressBar;
#ifdef SecondProgressBar
  LabelPct2: TLabel;
  ISDoneProgressBar2:TNewProgressBar;
#endif
  MyCancelButton: TButton;
  ISDoneCancel:integer;
  ISDoneError:boolean;
  PCFVer:double;

type
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';

function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function IS7ZipExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'IS7zipExtract@files:ISDone.dll stdcall delayload';
function ISRarExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'ISRarExtract@files:ISDone.dll stdcall delayload';
function ISPrecompExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISPrecompExtract@files:ISDone.dll stdcall delayload';
function ISSRepExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISSrepExtract@files:ISDone.dll stdcall delayload';
function ISxDeltaExtract(CurComponent:Cardinal; PctOfTotal:double; minRAM,maxRAM:integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile:boolean):boolean; external 'ISxDeltaExtract@files:ISDone.dll stdcall delayload';
function ISPackZIP(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString;ComprLvl:integer; DeleteInFile:boolean):boolean; external 'ISPackZIP@files:ISDone.dll stdcall delayload';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):boolean; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall delayload';

function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer; external 'ISFindFiles@files:ISDone.dll stdcall delayload';
function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean; external 'ISPickFilename@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):PAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';

function SrepInit(TmpPath:PAnsiChar;VirtMem,MaxSave:Cardinal):boolean; external 'SrepInit@files:ISDone.dll stdcall delayload';
function PrecompInit(TmpPath:PAnsiChar;VirtMem:cardinal;PrecompVers:single):boolean; external 'PrecompInit@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
  if OveralPct<=1000 then ISDoneProgressBar1.Position := OveralPct;
  LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
#ifdef SecondProgressBar
  if CurrentPct<=1000 then ISDoneProgressBar2.Position := CurrentPct;
  LabelPct2.Caption := IntToStr(CurrentPct div 10)+'.'+chr(48 + CurrentPct mod 10)+'%';
#endif
  LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, LabelCurrFileName.Font, LabelCurrFileName.Width-ScaleX(100));
  LabelTime1.Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
  LabelTime2.Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
  LabelTime3.Caption:=ExpandConstant('{cm:AllElapsedTime}')+TimeStr3;
  Result := ISDoneCancel;
end;

procedure CancelButtonOnClick(Sender: TObject);
begin
  SuspendProc;
  if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
  ResumeProc;
end;

procedure HideControls;
begin
  WizardForm.FileNamelabel.Hide;
  ISDoneProgressBar1.Hide;
  LabelPct1.Hide;
  LabelCurrFileName.Hide;
  LabelTime1.Hide;
  LabelTime2.Hide;
  MyCancelButton.Hide;
#ifdef SecondProgressBar
  ISDoneProgressBar2.Hide;
  LabelPct2.Hide;
#endif
end;

function SetWindowTheme(hwnd: HWND; pszSubAppName: pchar; pszSubIdList: pchar): Longint;
external 'SetWindowTheme@uxtheme.dll stdcall delayload';

procedure CreateControls;
var PBTop:integer;
begin
  PBTop:=ScaleY(50);
  ISDoneProgressBar1 := TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar1 do begin
    Parent  := WizardForm.InstallingPage;
    Height  := WizardForm.ProgressGauge.Height;
    Left    := ScaleX(0);
    Top      := PBTop;
    Width    := ScaleX(365);
    Max      := 1000;
  end;
  LabelPct1 := TLabel.Create(WizardForm);
  with LabelPct1 do begin
    Parent    := WizardForm.InstallingPage;
    AutoSize  := False;
    Left      := ISDoneProgressBar1.Width+ScaleX(5);
    Top      := ISDoneProgressBar1.Top + ScaleY(2);
    Width    := ScaleX(80);
  end;
  LabelCurrFileName := TLabel.Create(WizardForm);
  with LabelCurrFileName do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := ISDoneProgressBar1.Width+ScaleX(30);
    Left    := ScaleX(0);
    Top      := ScaleY(30);
  end;
#ifdef SecondProgressBar
  PBTop:=PBTop+ScaleY(25);
  ISDoneProgressBar2 := TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar2 do begin
    Parent  := WizardForm.InstallingPage;
    Left    := ScaleX(0);
    Top      := PBTop+ScaleY(8);
    Width    := ISDoneProgressBar1.Width;
    Max      := 1000;
    Height  := WizardForm.ProgressGauge.Height;
  end;
  LabelPct2 := TLabel.Create(WizardForm);
  with LabelPct2 do begin
    Parent    := WizardForm.InstallingPage;
    AutoSize  := False;
    Left      := ISDoneProgressBar2.Width+ScaleX(5);
    Top      := ISDoneProgressBar2.Top + ScaleY(2);
    Width    := ScaleX(80);
  end;
#endif
  LabelTime1 := TLabel.Create(WizardForm);
  with LabelTime1 do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := ISDoneProgressBar1.Width div 2;
    Left    := ScaleX(0);
    Top      := PBTop + ScaleY(35);
  end;
  LabelTime2 := TLabel.Create(WizardForm);
  with LabelTime2 do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := LabelTime1.Width+ScaleX(40);
    Left    := ISDoneProgressBar1.Width div 2;
    Top      := LabelTime1.Top;
  end;
  LabelTime3 := TLabel.Create(WizardForm);
  with LabelTime3 do begin
    Parent  := WizardForm.FinishedPage;
    AutoSize := False;
    Width    := 300;
    Left    := 180;
    Top      := 200;
  end;
  MyCancelButton:=TButton.Create(WizardForm);
  with MyCancelButton do begin
    Parent:=WizardForm;
    Width:=ScaleX(135);
    Caption:=ExpandConstant('{cm:CancelButton}');
    Left:=ScaleX(360);
    Top:=WizardForm.cancelbutton.top;
    OnClick:=@CancelButtonOnClick;
  end;

  SetWindowTheme(ISDoneProgressBar1.Handle, ' ', ' ');
#ifdef SecondProgressBar
  SetWindowTheme(ISDoneProgressBar2.Handle, ' ', ' ');
#endif
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  if (CurPageID = wpFinished) and ISDoneError then
  begin
    LabelTime3.Hide;
    WizardForm.Caption:= ExpandConstant('{cm:Error}');
    WizardForm.FinishedLabel.Font.Color:= clRed;
    WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
  end;
end;

function CheckError:boolean;
begin
  result:= not ISDoneError;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var Comps1,Comps2,Comps3, TmpValue:cardinal;
    FindHandle1,ColFiles1,CurIndex1,tmp:integer;
    ExecError:boolean;
    InFilePath,OutFilePath,OutFileName:PAnsiChar;
begin
  if CurStep = ssInstall then begin  //Если необходимо, можно поменять на ssPostInstall
    WizardForm.ProgressGauge.Hide;
    WizardForm.CancelButton.Hide;
    CreateControls;
    SendMessage(ISDoneProgressBar1.Handle, $0409, 0, clTeal);
#ifdef SecondProgressBar
    SendMessage(ISDoneProgressBar2.Handle, $0409, 0, clTeal);
#endif
    WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
    ISDoneCancel:=0;

// Распаковка всех необходимых файлов в папку {tmp}.

ExtractTemporaryFile('unarc.dll');

#ifdef PrecompInside
ExtractTemporaryFile('CLS-precomp.dll');
ExtractTemporaryFile('packjpg_dll.dll');
ExtractTemporaryFile('packjpg_dll1.dll');
ExtractTemporaryFile('precomp.exe');
ExtractTemporaryFile('zlib1.dll');
#endif
#ifdef SrepInside
ExtractTemporaryFile('CLS-srep.dll');
#endif
#ifdef MSCInside
ExtractTemporaryFile('CLS-MSC.dll');
#endif
#ifdef facompress
    ExtractTemporaryFile('facompress.dll'); //ускоряет распаковку .arc архивов.
#endif
#ifdef records
    ExtractTemporaryFile('records.inf');
#endif
#ifdef precomp
  #if precomp == "0.38"
    ExtractTemporaryFile('precomp038.exe');
  #else
    #if precomp == "0.4"
      ExtractTemporaryFile('precomp040.exe');
    #else
      #if precomp == "0.41"
        ExtractTemporaryFile('precomp041.exe');
      #else
        #if precomp == "0.42"
          ExtractTemporaryFile('precomp042.exe');
        #else
          ExtractTemporaryFile('precomp038.exe');
          ExtractTemporaryFile('precomp040.exe');
          ExtractTemporaryFile('precomp041.exe');
          ExtractTemporaryFile('precomp042.exe');
        #endif
      #endif
    #endif
  #endif
#endif
#ifdef unrar
    ExtractTemporaryFile('Unrar.dll');
#endif
#ifdef XDelta
    ExtractTemporaryFile('XDelta3.dll');
#endif
#ifdef PackZIP
    ExtractTemporaryFile('7z.dll');
    ExtractTemporaryFile('PackZIP.exe');
#endif

    ExtractTemporaryFile('English.ini');

// Подготавливаем переменную, содержащую всю информацию о выделенных компонентах для ISDone.dll
// максимум 96 компонентов.
    Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
    TmpValue:=1;
    if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue;    //компонент 1
    TmpValue:=TmpValue*2;
    if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue;    //компонент 2
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue;    //компонент 3
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue;    //компонент 4
//    .....
// см. справку
#endif

#ifdef precomp
  PCFVer:={#precomp};
#else
  PCFVer:=0;
#endif
    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
      repeat
//        ChangeLanguage('English');
        if not SrepInit('',512,0) then break;
        if not PrecompInit('',128,PCFVer) then break;
        if not FileSearchInit(true) then break;

        if not ISArcExtract ( 0, 50, ExpandConstant('{src}\*.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
        if not ISArcExtract ( 0, 50, ExpandConstant('{src}\*.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

//    далее находятся закомментированые примеры различных функций распаковки (чтобы каждый раз не лазить в справку за примерами)
(*
        if not ISArcExtract    ( 0, 0, ExpandConstant('{src}\arc.arc'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
        if not IS7ZipExtract  ( 0, 0, ExpandConstant('{src}\CODMW2.7z'), ExpandConstant('{app}\data1'), false, '') then break;
        if not ISRarExtract    ( 0, 0, ExpandConstant('{src}\data_*.rar'), ExpandConstant('{app}'), false, '') then break;
        if not ISSRepExtract  ( 0, 0, ExpandConstant('{app}\data1024_1024.srep'),ExpandConstant('{app}\data1024.arc'), true) then break;
        if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\data.pcf'),    ExpandConstant('{app}\data.7z'), true) then break;
        if not ISxDeltaExtract ( 0, 0, 0, 640, ExpandConstant('{app}\in.pcf'), ExpandConstant('{app}\*.diff'),  ExpandConstant('{app}\out.dat'), false, false) then break;
        if not ISPackZIP      ( 0, 0, ExpandConstant('{app}\1a1\*'), ExpandConstant('{app}\1a1.pak'), 2, false ) then break;
        if not ISExec          ( 0, 0, 0, ExpandConstant('{tmp}\Arc.exe'), ExpandConstant('x -o+ "{src}\001.arc" "{app}\"'), ExpandConstant('{tmp}'), '...',false) then break;
        if not ShowChangeDiskWindow ('Пожалуйста, вставьте второй диск и дождитесь его инициализации.', ExpandConstant('{src}'),'CODMW_2.arc') then break;

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

        FindHandle1:=ISFindFiles(0,ExpandConstant('{app}\*.ogg'),ColFiles1);
        ExecError:=false;
        while not ExecError and ISPickFilename(FindHandle1,ExpandConstant('{app}\'),CurIndex1,true) do begin
          InFilePath:=ISGetName(0);
          OutFilePath:=ISGetName(1);
          OutFileName:=ISGetName(2);
          ExecError:=not ISExec(0, 0, 0, ExpandConstant('{tmp}\oggdec.exe'), '"'+InFilePath+'" -w "'+OutFilePath+'"',ExpandConstant('{tmp}'),OutFileName,false);
        end;
        ISFindFree(FindHandle1);
        if ExecError then break;
*)

        ISDoneError:=false;
      until true;
      ISDoneStop;
    end;
    HideControls;
    WizardForm.CancelButton.Visible:=true;
    WizardForm.CancelButton.Enabled:=false;
  end;
  if (CurStep=ssPostInstall) and ISDoneError then begin
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
  end;
end;


Можно ли как-нибудь передвинуть компаненты на стандартном компанентлисте (или на созданном)?

Gnom_aka_Lexander 08-01-2013 13:53 2061748

Цитата:

Цитата alert30
можно использовать батник с тасккиллом »

Зачем такие сложности? Не нужно вводить людей в заблуждение, в инно все это легко регламентируется флагами.
ispolin, если через секцию RUN, то используем флаг Flags: nowait.
если сделано в секции Code, функцией Exec, то в качестве TExecWait указать ewNoWait.

R.i.m.s.k.y. 10-01-2013 12:57 2063255

поделитесь, пожалуйста, скриптом для процентов зеленой колбасы распаковки внешнего зип/рар архива
не фриарк

Raf-9600 10-01-2013 23:41 2063837

Использую код на растянутый WizardSmallBitmapImage но столкнулся с проблемой: если в операционке выбрать увеличенные шрифты (в Панель управления\Оформление и персонализация\Экран) то картинка оказывается маленькой:



Вот код который я использую:
Код:

procedure InitializeWizard();
begin
  with WizardForm do begin
    with MainPanel do
      Height := Height - 1;
    with WizardSmallBitmapImage do begin
      Left := 0;
      Top := 0;
      Height := 58; //Размер рисунка
      Width := 497; //
    end;
    with PageNameLabel do begin
      Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст
      Left := Left + 497; //
    end;
    with PageDescriptionLabel do begin
      Width := Width - 497; //Поставьте здесь значения на 0, если хотите вернуть текст
      Left := Left + 497; //
    end;
  end;
end;

Собсно можно ли этот баг исправить?

Johny777 11-01-2013 01:22 2063874

Цитата:

Цитата Raf-9600
Собсно можно ли этот баг исправить? ... Вот код который я использую»

в нём то и проблема - мало того что странно "скрываются" статиктексты так ещё и картинка растягивается вручную
вот корректный способ:
читать дальше »
Код:

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    PageNameLabel.Hide;
    PageDescriptionLabel.Hide;
    WizardSmallBitmapImage.Align := alClient;
    WizardSmallBitmapImage.Stretch := True;
  end;
end;


======================================================================================
R.i.m.s.k.y., ну блин даёшь! :) При тебе El Sanchez портировал в этой части темы модуль дельфи распаковки/запаковки архивов 7-zip, который использует родную библиотеку архиватора, а он, архиватор, способен распаковать
http://www.7-zip.org/ всё что тебе нужно и более того. с отображением прогресса, процентов и прочей инфы!

Spell1999 11-01-2013 02:02 2063885

Вложений: 2
Я всё никак немогу понять что за ошибка в ботве?http://forum.oszone.net/attachment.p...1&d=1357855281
она меня уже очень сильно бесит! прошу помогите плиз вот сам скрипт скачать
чё токо непробовал, сёравно ошибка.

YURSHAT 11-01-2013 02:47 2063888

Цитата:

Цитата Spell1999
Я всё никак немогу понять что за ошибка в ботве? »

Компильте на расширенной версии от китайсев :)

R.i.m.s.k.y. 11-01-2013 07:15 2063933

Johny777, искал уже, не нашел
помню что был в этой теме, а листать 156 страниц - идиотом сделаешься

И отвечая на свой прошлый вопрос - как дать права папке всем:

Код:

procedure GrantFolder(Folder : string);
var pathapp : string; res : integer;
begin
  pathapp := RemoveQuotes(Folder); pathapp := RemoveBackslashUnlessRoot(pathapp); pathapp := Lowercase(pathapp); pathapp := AddQuotes(pathapp);
  Exec('cmd.exe', ' /c icacls ' + pathapp + ' /grant *S-1-1-0:F /T /C /Q /inheritance:e',ExpandConstant('{sys}'),SW_HIDE,ewNoWait,res);
end;

Требуется либо разрешение от UAC либо запуск установщика от админа

R.i.m.s.k.y. 11-01-2013 09:42 2063992

Поиск по теме оказывается сломан
Вбиваю 7-zip которое вот точно есть выше - результат ничего не найдено
Однако по слову проблема результаты есть

так что вопрос двойной:
- сслыка на портированный скрипт
- пример его использования для двух внешних архивов {src}\zip.zip {src}\zip2.zip c процентами зеленой колбасы

Mailchik 11-01-2013 12:40 2064097

Цитата:

Цитата Raf-9600
Использую код на растянутый WizardSmallBitmapImage но столкнулся с проблемой: если в операционке выбрать увеличенные шрифты (в Панель управления\Оформление и персонализация\Экран) то картинка оказывается маленькой: »

При объявлении координат расположения используйте ScaleX (для Left и Width) и ScaleY (для Top и Height). Вот пример на основе вашего кода:
читать дальше »
Код:

procedure InitializeWizard();
begin
  with WizardForm do begin
    with MainPanel do
      Height := Height - ScaleY(1);
    with WizardSmallBitmapImage do begin
      Left := ScaleX(0);
      Top := ScaleY(0);
      Height := ScaleY(58); //Размер рисунка
      Width := ScaleX(497); //
    end;
    with PageNameLabel do begin
      Width := Width - ScaleX(497); //Поставьте здесь значения на 0, если хотите вернуть текст
      Left := Left + ScaleX(497); //
    end;
    with PageDescriptionLabel do begin
      Width := Width - ScaleX(497); //Поставьте здесь значения на 0, если хотите вернуть текст
      Left := Left + ScaleX(497); //
    end;
  end;
end;


nik1967 11-01-2013 15:44 2064308

Mailchik, из справки:
Takes an X coordinate or width and returns it scaled to fit the size of the current dialog font. If the dialog font is 8-point MS Sans Serif and the user is running Windows in Small Fonts (96 dpi), then X is returned unchanged.
Берет X координат или ширину и возвращает масштабируемый, чтобы соответствовать размеру текущего диалогового шрифта. Если диалоговый шрифт - Sans Serif MS с 8 точками, и пользователь запускает Windows в Маленьких Шрифтах (96 точек на дюйм), то X возвращен неизменный.
Походу это только для лейблов. Я сам всегда всё через ScaleX ScaleY делал, но недавно прокололся на картинках при изменении размера текста в винде.
Гуру поправте меня, если я не прав.

Mailchik 11-01-2013 16:29 2064357

nik1967, это в справке так написано, а на практике ScaleX и ScaleY мне помогали со всеми визуальными компонентами, которые я использовал. маленький пример которым можно проверить:
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
procedure InitializeWizard;
 begin
  with WizardForm do begin
  OuterNotebook.Hide;
  with WizardBitmapImage do begin
    Parent := WizardForm;
    Width := 497;
    //Width := ScaleX(497);
  end;
  end;
end;


Vstanka 11-01-2013 17:08 2064401

Подскажите, пожалуйста, как в inno вызвать функцию inet_addr (для проверки правильности введенного ip-адреса) из библиотеки winsock? В паскале достаточно было ее прописать в разделе uses, а здесь как?

alert30 11-01-2013 17:29 2064428

Vstanka, только это понарыл, проверьте и отпишитесь:
читать дальше »
Код:

[Code]

//_______________________________________________________________________
// IsConnected.iss
// Version 1.0
// October 09, 2008

// by C. Kevin Provance (kevin@tpasoft.com or kevin.provance@gmail.com)
// © Copyright 2008, C. Kevin Provance d/b/a TPA Software.
// All Rights Reserved.

// Contains a PING routine to determine if an active Internet connection
// is currently established. To use this script, add an #include directive
// in your script that points to this script, example:

// #include ;

// Finally, in your InitializeWizard section, call:

// IsConnected('');

// It will return a Boolean value, True if connected, False otherwise
// or 11010 if the site is timed out (down). It is important that you
// use your own website's IP as the test is twofold. The first is to
// check for an Internet connection, the second is to check if your site
// is indeed up and running (for those who may check out my WebInstall
// script.)

// In the future I will be tweaking this script to accept URL's instead
// of IP addresses and clean up the const values some more.

// Feel free to use this script in your projects for no compensation. I
// do ask that if you reprint it or modify it you leave this header
// section in tact so due credit is given and all the changes you made,
// along with your name and date. If you would also send me a copy of my
// records, that would be great as well.
//ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
//_______________________________________________________________________
// Version History
//ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
// [10.09.08] - Author: Kevin Provance
// - First Initial release

//_______________________________________________________________________
// ToDo:
//ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
// - Accept URL instead of IP addresses via the IsConnected function
// - Properly declare CONST values instead of adding the return values
// directly into the code.

// SUGGESTIONS ALWAYS WELCOME!!!!!

// And now for the code...Enjoy.

// C. Kevin Provance
//ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ

//_______________________________________________________________________
// Type records for ICMP and WSA
//ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
type
 // ICMP Options type
 TICMPOptions = record
 Ttl: Integer;
 Tos: Integer;
 Flags: Integer;
 OptionsSize: Integer;
 OptionsData: Integer;
 end;

 // Echo Reply type
 TEchoReply = record
 Address: Integer;
 status: Integer;
 RoundTripTime: Integer;
 DataSize: Integer;
 DataPointer: Integer;
 Options: TICMPOptions;
 Data: String;
 end;

 // WSA Data type
 TWSAData = record
 wVersion: Integer;
 wHighVersion: Integer;
 szDescription: array[0..256] of Char;
 szSystemStatus: array[0..128] of Char;
 wMaxSockets: Integer;
 wMaxUDPDG: Integer;
 dwVendorInfo: PChar;
 end;

//_______________________________________________________________________
// API from Ws2_32.dll
//ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
function WSAStartup(wVersionRequired: Integer; lpWSADATA: TWSAData):
Integer;
 external 'WSAStartup@Ws2_32.dll stdcall';

function WSACleanup(): Integer;
 external 'WSACleanup@Ws2_32.dll stdcall';

function inet_addr(s: String): Integer;
 external 'inet_addr@Ws2_32.dll stdcall';

//_______________________________________________________________________
// API from icmp.dll
//ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
function IcmpCreateFile(): Integer;
 external 'IcmpCreateFile@icmp.dll stdcall';

function IcmpCloseHandle(IcmpHandle:Integer): Integer;
 external 'IcmpCloseHandle@icmp.dll stdcall';

function IcmpSendEcho(IcmpHandle: Integer; DestinationAddress: Integer;
 RequestData: String; RequestSize: Integer;
 RequestOptions: Integer; ReplyBuffer: TEchoReply;
 ReplySize: Integer; Timeout: Integer): Integer;
 external 'IcmpSendEcho@icmp.dll stdcall';

//_______________________________________________________________________
// Ping function to determine if a connection to the Internet is active.
//ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
function Ping(sAddress: String; sDataToSend: String; ECHO: TEchoReply):
Integer;
var
 hPort: Integer;
 dwAddress: Integer;
 WSAD: TWSAData;
 lRetVal: Integer;
begin
 Result := -1;

 // Perform Winsock start
 lRetVal := WSAStartup($0101, WSAD);
 if lRetVal <> 0 then begin
 Log('Winsock not responding');
 exit;
 end;

 // Obtain pointer to the IP address
 dwAddress := inet_addr(sAddress);

 If dwAddress <> -1 Then begin

 // Create a port to send our test data
 hPort := IcmpCreateFile();
 If hPort <> 0 Then begin

 // Send the data and wait for a reply.
 IcmpSendEcho(hPort, dwAddress, sDataToSend, Length(sDataToSend),
 0, ECHO, Sizeof(ECHO), 200);

 // The reply
 Result := ECHO.status;

 // CLose the port handle
 IcmpCloseHandle(hPort);
 end Else begin
 Result := -1;
 end;
 end;

 // Clean up the winsock session we opened
 WSACleanup();
end;

//_______________________________________________________________________
// IsConnected, test the Internet connection with the IP to your website.
//ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ
function IsConnected(sIP: String): Boolean;
var
 lReply: Integer;
 lCount: Integer;
 ECHO: TEchoReply;
begin
 lReply := Ping(sIP, '.', ECHO);

 case lReply of
 0: //success
 begin
 Result := True;
 end;
 11010: //Timeout
 begin
 Result := True;
 if ECHO.DataPointer = 0 then begin
 Result := False;
 end;
 end;
 else
 begin
 Result := False;
 end;
 end;
end;


Johny777 12-01-2013 03:24 2064789

R.i.m.s.k.y.,
Цитата:

Цитата R.i.m.s.k.y.
Поиск по теме оказывается сломан
Вбиваю 7-zip которое вот точно есть выше - результат ничего не найдено
Однако по слову проблема результаты есть »

я обычно пользуюсь гуглом обходя поисковики форума
вбей для интереса в гугл:
forum oszone function SevenZip(const _hwnd
и получишь по первой ссылке http://forum.oszone.net/post-2012963.html
читай с поста 1211 до 1225
конвертация ком строки не нужна, читай под конец http://forum.oszone.net/post-2050399-1435.html
Цитата:

Цитата R.i.m.s.k.y.
так что вопрос двойной:
- сслыка на портированный скрипт
- пример его использования для двух внешних архивов {src}\zip.zip {src}\zip2.zip c процентами зеленой колбасы »

все есть в кодах по ссылке выше. Разберёшься! :grin:

==================================================================================================== ===

nik1967,
Цитата:

Цитата nik1967
Походу это только для лейблов. Я сам всегда всё через ScaleX ScaleY делал, но недавно прокололся на картинках при изменении размера текста в винде. »

я не гуру, но советую забить и действовать наверняка, то бишь писать через скеил
вот смотри:
тест в цикле длиной в 1 000 000:
читать дальше »
Код:

[Setup]
AppName=Test
AppVersion=1.5
DefaultDirName={pf}\My Application

[  code]
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';

procedure InitializeWizard();
var
  dwStartTime: DWORD;
  i: Integer;
begin
  dwStartTime := GetTickCount;
  for i := 1000000 downto 0 do WizardForm.Width := ScaleX(777);
  //for i := 1000000 downto 0 do WizardForm.Width := 777;
  MsgBoxEx(WizardForm.Handle, IntToStr(GetTickCount-dwStartTime), 'Test', MB_OK, 0, 3);
end;


функция скеил замедляет выполнение на примерно 30%
при таком раскладе не использование этих функций в пользу указания координат напрямую для установки свойств ширины/высоты ничего не даст кроме сокращения времени на писанину.
Такой задержкой можно пренебречь
единственное что ловил себя на записи SetBounds(UninstallButton.Left - UninstallButton.Width - ScaleX(16), ... - не правильно
нужно: SetBounds(ScaleX(UninstallButton.Left - UninstallButton.Width - 16), ...

==================================================================================================== =

alert30, полезный код, сохранил, спасибо!

R.i.m.s.k.y. 12-01-2013 07:33 2064842

Цитата:

Цитата Johny777
Разберёшься! »

ога
а что два архива ему на распаковку не подсунешь? нужно мудровать с прогрессбаром?
Еще и кнопку cancel распаковке/упаковке никак не приклеить?
я ж в этом не силен


El Sanchez


в скрипте ошибка в SevenZipExtractArchive
7зип не понимает маску *.*, ему нужно *
Цитата:

7-Zip doesn't uses the system wildcard parser. 7-Zip doesn't follow the archaic rule by which *.* means any file. 7-Zip treats *.* as matching the name of any file that has an extension. To process all files, you must use a * wildcard.
FileList тоже не работает, если написать
SevenZipExtractArchive(szStatus.Handle, 'y:\Games\RedAlert2.7z', 'movies01.mix,movies02.mix', False, '', True, 'r:\', False, CallbackAddr('ArchiverCallbackProc'));
то пишет No files to proceed
комстрока 7зипа совсем неправильная
x "y:\Games\RedAlert2.7z" -o"r:\" "movies01.mix" -i!"movies02.mix" -hide -y

Никак нельзя добавить несколько архивов на распаковку с общим прогрессбаром?
типа
SevenZipExtractArchive(szStatus.Handle, 'y:\Games\RedAlert2.7z,y:\Games\Omikron.7z', '*', False, '', True, 'r:\', False, CallbackAddr('ArchiverCallbackProc'));

audiofeel 12-01-2013 07:37 2064844

Доброе утро всем. почему у меня не получается приделать вот этот пример = " когда после установки игры, если ещё раз хочешь запустить установку автоматом, то запускается деинсталлятор?"
читать дальше »
В секции [Setup] генерируешь appid (например AppID={{0872DB47-24CB-4C7F-AC4B-E6EFC27BD244}),
в секцию добавляешь следущее:
[_Code]
var
ResultStr:string;
ResultCode: Integer;

function InitializeSetup(): Boolean;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0872DB47-24CB-4C7F-AC4B-E6EFC27BD244}_is1', 'UninstallString', ResultStr)
if ResultStr='' then
begin
Result := True;
end
else
ResultStr:=RemoveQuotes(ResultStr);
Exec(ResultStr, '', '', SW_SHOWNORMAL, ewNoWait, ResultCode)
end;
этот пример я не могу приделать (использовать) именно в этом скрипте, или запускается и установка и удаление или ошибка "runtime error couldn't...." подскажите что и где делаю не так
читать дальше »
#define MyAppName "Assassin's Creed III"
#define MyAppVerName "Assassin's Creed III [v 1.01]"

#define NeedSize 10752

#define Components

;#define records
;#define facompress
;#define PrecompInside
#define SrepInside

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName}
AppPublisher=Fakt_37
DefaultDirName={pf}\Fakt_37\{#MyAppName}
DefaultGroupName=Fakt_37\{#MyAppName}
DirExistsWarning=no
AppID={{0872DB47-24CB-4C7F-AC4B-E6EFC27BD244}
VersionInfoDescription={#MyAppName}
DisableReadyPage=yes
LZMAAlgorithm=1
LZMAMatchFinder=BT
LZMANumFastBytes=273

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[CustomMessages]
rus.Welcome=Вас приветствует Мастер установки игры «{#MyAppName}» %nРекомендуется закрыть антивирусные программы, а также все прочие приложения перед тем, как продолжить.%nНажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти из программы установки.
rus.Dir1=Программа установит «{#MyAppName}» в следующую папку.
rus.Group1=Программа создаст ярлыки в следующей папке меню «Пуск».
rus.FreeSpace=Доступно места на диске:
rus.NeedSpace=Требуется места для установки:
rus.nic=Не создавать папку в меню «Пуск»
rus.Fin=%nУстановка игры «{#MyAppName}» успешно завершена. %nНажмите "Завершить", чтобы выйти из программы установки.
rus.FinError=Установка игры «{#MyAppName}» не завершена. %nВо время установки произошла ошибка, пожалуйста отключите сторонние программы и повторите попытку установки. %nНажмите "Завершить", чтобы выйти из программы установки.
rus.Extracted=Распаковка файлов...
rus.rbc=Откат установки...
rus.Dir2=Нажмите «Далее», чтобы продолжить. Если Вы хотите выбрать другую папку, нажмите «Обзор»

#ifdef Components

[Registry]

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: Dector; Description: Дополнительные ярлыки:; Types: full
Name: Dector\a; Description: Добавить ярлык на рабочий стол; Types: full
Name: PO; Description: Дополнительное програмное обеспечения:; Types: full
Name: PO\a; Description: Обновить DirectX; Types: full
Name: PO\b; Description: Установить/обновить Microsoft Visual C++; Types: full
Name: PO\c; Description: Установить/обновить Microsoft Visual C++; Types: full
#endif

[Files]
Source: Files\fon.png; Flags: dontcopy
Source: Files\pb1.png; Flags: dontcopy
Source: Files\pb2.png; Flags: dontcopy
Source: Files\1.bmp; Flags: dontcopy
Source: Files\form.png; Flags: dontcopy
Source: Files\form1.png; Flags: dontcopy
Source: Files\logo.png; Flags: dontcopy
Source: Files\button.png; Flags: dontcopy
Source: dll\*.*; Flags: dontcopy
Source: ISDone\unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISDone\ISDone.dll; DestDir: {tmp}; Flags: dontcopy
#ifdef records
Source: records.inf; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef PrecompInside
Source: ISDone\CLS-precomp.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISDone\packjpg_dll.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISDone\packjpg_dll1.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISDone\precomp.exe; DestDir: {tmp}; Flags: dontcopy
Source: ISDone\zlib1.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef SrepInside
Source: ISDone\CLS-srep.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef facompress
Source: ISDone\facompress.dll; DestDir: {tmp}; Flags: dontcopy
#endif

[Icons]
Name: {userdesktop}\{#MyAppName}; Filename: {app}\AC3SP.exe; WorkingDir: {app}; IconFilename: {app}\AC3SP.exe; Components: Dector\a; Check: CheckError
Name: {group}\{#MyAppName}; Filename: {app}\AC3SP.exe; WorkingDir: {app}; IconFilename: {app}\AC3SP.exe; Comment: Запустить игру; Check: CheckError
Name: {group}\Удалить игру; Filename: {uninstallexe}; Comment: Удалить игру; Check: CheckError

[Run]
Filename: {src}\Redist\directx.exe; WorkingDir: {src}\Redist\; Parameters: /Q; Flags: waituntilterminated runminimized; Components: PO\a; Check: CheckError
Filename: {src}\Redist\vcredist_x86.exe; WorkingDir: {src}\Redist\; Parameters: /Q; Flags: waituntilterminated; Components: PO\b; Check: CheckError
Filename: {src}\Redist\PhysX.msi; Parameters: /Q; WorkingDir: {src}\Redist; Components: PO\c; Check: CheckError
[code]
const
PCFonFLY=true;
notPCFonFLY=false;

var
Enabled: Boolean;
hCancelBtn, hNextBtn, hBackBtn, hDirBrowseBtn, hGroupBrowseBtn: HWND;
Welcomelbl1, Selectlbl1, Selectlbl2, MainLabel, Mb1, Mb2, NoIconsLabel, islbl1, islbl2, islbl3: TLabel;
WFButtonFont: TFont;
form, form1: Longint;
NoIconsCheck: TNewCheckBox;
IntList, VoiceList: TNewCheckListBox;
ISDoneCancel: Integer;
ISDoneError: Boolean;
PCFVer: Double;
s: AnsiString;

function ReleaseCapture: Longint; external 'ReleaseCapture@user32.dll stdcall';

procedure LabelOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ReleaseCapture;
SendMessage(WizardForm.Handle, $0112, $F012, 0)
end;

#include "AddIss\botva2.iss"
#include "AddIss\progressbar.iss"

var
ISDonePB: TImgPB;

function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
Result:=True;
end;

function cm(s: PAnsiChar): String;
begin
Result:= ExpandConstant('{cm:'+s+'}');
end;

type
TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';

function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function IS7ZipExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'IS7zipExtract@files:ISDone.dll stdcall delayload';
function ISRarExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'ISRarExtract@files:ISDone.dll stdcall delayload';
function ISPrecompExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISPrecompExtract@files:ISDone.dll stdcall delayload';
function ISSRepExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISSrepExtract@files:ISDone.dll stdcall delayload';
function ISxDeltaExtract(CurComponent:Cardinal; PctOfTotal:double; minRAM,maxRAM:integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile:boolean):boolean; external 'ISxDeltaExtract@files:ISDone.dll stdcall delayload';
function ISPackZIP(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString;ComprLvl:integer; DeleteInFile:boolean):boolean; external 'ISPackZIP@files:ISDone.dll stdcall delayload';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):boolean; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall delayload';

function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer; external 'ISFindFiles@files:ISDone.dll stdcall delayload';
function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean; external 'ISPickFilename@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):PAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';

function SrepInit(TmpPath:PAnsiChar;VirtMem,MaxSave:Cardinal):boolean; external 'SrepInit@files:ISDone.dll stdcall delayload';
function PrecompInit(TmpPath:PAnsiChar;VirtMem:cardinal;PrecompVers:single):boolean; external 'PrecompInit@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
if OveralPct<=1000 then ImgPBSetPosition(ISDonePB, OveralPct);
WizardForm.Caption:= s + ' - ' + IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
islbl1.Caption:= cm('Extracted') + ' ' + IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
islbl2.Caption:= MinimizePathName(ExpandConstant('{app}\')+CurrentFile, islbl2.Font, ScaleX(400));
Result := ISDoneCancel;
end;

procedure CancelButtonOnClick(hBtn: HWND);
begin
SuspendProc;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then begin
ISDoneCancel:=1;
islbl1.Caption:= cm('rbc');
end;
ResumeProc;
end;


function CheckError:boolean;
begin
Result:= not ISDoneError;
end;

procedure CreateWizardImg;
begin
with WizardForm do begin
ClientWidth:=ScaleX(623);
ClientHeight:=ScaleY(382);
InnerNotebook.Hide;
OuterNotebook.Hide;
Bevel.Hide;
Center;
Color:= $191919;
end;

ImgLoad(WizardForm.Handle, 'fon.png', ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
form:= ImgLoad(WizardForm.Handle, 'form.png', ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
form1:= ImgLoad(WizardForm.Handle, 'form1.png', ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
ImgLoad(WizardForm.Handle, 'logo.png', ScaleX(20), ScaleY(326), ScaleX(190), ScaleY(39), True, True);

ImgSetVisibility(form1, false);

ImgApplyChanges(WizardForm.Handle);
end;

procedure SetStateNewButtons;
begin
with WizardForm.BackButton do begin
BtnSetText(hBackBtn,PAnsiChar(Caption));
BtnSetVisibility(hBackBtn,Visible);
BtnSetEnabled(hBackBtn,Enabled);
end;
with WizardForm.NextButton do begin
BtnSetText(hNextBtn,PAnsiChar(Caption));
BtnSetVisibility(hNextBtn,Visible);
BtnSetEnabled(hNextBtn,Enabled);
end;
with WizardForm.CancelButton do begin
BtnSetText(hCancelBtn,PAnsiChar(Caption));
BtnSetVisibility(hCancelBtn,Visible);
BtnSetEnabled(hCancelBtn,Enabled);
end;
BtnSetText(hDirBrowseBtn,PAnsiChar(WizardForm.DirBrowseButton.Caption));
BtnSetText(hGroupBrowseBtn,PAnsiChar(WizardForm.GroupBrowseButton.Caption));
end;

procedure WizardFormBtnClick(hBtn:HWND);
var
Btn: TButton;
begin
case hBtn of
hCancelBtn: Btn:=WizardForm.CancelButton;
hNextBtn: Btn:=WizardForm.NextButton;
hBackBtn: Btn:=WizardForm.BackButton;
hDirBrowseBtn: Btn:=WizardForm.DirBrowseButton;
hGroupBrowseBtn: Btn:=WizardForm.GroupBrowseButton;
end;
Btn.OnClick(Btn);
SetStateNewButtons;
BtnRefresh(hBtn);
end;

procedure NoIconsCheckClick(Sender: TObject);
begin
if NoIconsCheck.Checked then begin
WizardForm.GroupEdit.Enabled:= false;
WizardForm.GroupBrowseButton.Enabled:= false;
BtnSetEnabled(hGroupBrowseBtn, false);
end else begin
WizardForm.GroupEdit.Enabled:= true;
WizardForm.GroupBrowseButton.Enabled:= true;
BtnSetEnabled(hGroupBrowseBtn, true);
end;
WizardForm.NoIconsCheck.Checked:= NoIconsCheck.Checked;
WizardForm.GroupEdit.Color:= clblack;
end;

procedure NoIconsLabelClick(Sender: TObject);
begin
NoIconsCheck.Checked:= not NoIconsCheck.Checked;
NoIconsCheckClick(nil);

end;

procedure ButtonsTextures;
begin
WFButtonFont:=TFont.Create;
WFButtonFont.Style:=[fsBold];
WFButtonFont.Name:= 'Arial';
WFButtonFont.Size:= 8;

with WizardForm.BackButton do begin
hBackBtn:= BtnCreate(WizardForm.Handle, ScaleX(Left+28), ScaleY(Top+3), ScaleX(100), ScaleY(35), 'button.png', 1, False);
BtnSetEvent(hBackBtn, BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
BtnSetFont(hBackBtn, WFButtonFont.Handle);
BtnSetFontColor(hBackBtn, clblack, clblack, clblack, clblack);
Width:=0;
Height:=0;
end;

with WizardForm.NextButton do begin
hNextBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+55), ScaleY(Top+3), ScaleX(100), ScaleY(35), 'button.png', 1, False);
BtnSetEvent(hNextBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
BtnSetFont(hNextBtn,WFButtonFont.Handle);
BtnSetFontColor(hNextBtn, clblack, clblack, clblack, clblack);
Width:=0;
Height:=0;
end;

with WizardForm.CancelButton do begin
hCancelBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+85), ScaleY(Top+3), ScaleX(100), ScaleY(35), 'button.png', 1, False);
BtnSetEvent(hCancelBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
BtnSetFont(hCancelBtn,WFButtonFont.Handle);
BtnSetFontColor(hCancelBtn, clblack, clblack, clblack, clblack);
Width:=0;
Height:=0;
end;

with WizardForm.DirBrowseButton do begin
hDirBrowseBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+90), ScaleY(Top+164), ScaleX(100), ScaleY(35), 'button.png', 1, False);
BtnSetEvent(hDirBrowseBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
BtnSetFont(hDirBrowseBtn,WFButtonFont.Handle);
BtnSetFontColor(hDirBrowseBtn, clblack, clblack, clblack, clblack);
Width:=0;
Height:=0;
end;

with WizardForm.GroupBrowseButton do begin
hGroupBrowseBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+90), ScaleY(Top+164), ScaleX(100), ScaleY(35), 'button.png', 1, False);
BtnSetEvent(hGroupBrowseBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
BtnSetFont(hGroupBrowseBtn,WFButtonFont.Handle);
BtnSetFontColor(hGroupBrowseBtn, clblack, clblack, clblack, clblack);
Width:=0;
Height:=0;
end;
end;


function NumToStr(Float: Extended): string;
begin
Result:=Format('%.2n', [Float]);
StringChange(Result, ',', '.');
while ((Result[Length(Result)]='0') or (Result[Length(Result)]='.')) and (Pos('.',Result)>0) do SetLength(Result,Length(Result)-1);
end;

function MbOrTB(Float: Extended): string;
begin
if Float<1024 then Result:=NumToStr(Float)+' MB'
else if (Float/1024)<1024 then Result:=NumToStr(Float/1024)+' GB'
else if (Float/(1024*1024))<1024 then Result:=NumToStr(Float/(1024*1024))+' TB'
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Enable: Boolean;
Path: AnsiString;
FreeMB, TotalMB: Cardinal;
begin
Path:= ExtractFileDrive(WizardForm.DirEdit.Text);
Enable:= GetSpaceOnDisk(Path, True, FreeMB, TotalMB);

if not Enable then begin
mb1.Caption:= cm('FreeSpace') + ' ' + '0 Мб';
mb2.Caption:= cm('NeedSpace') + ' ' + MborTb({#NeedSize});
WizardForm.NextButton.Enabled:= false;
BtnSetEnabled(hNextBtn, false);
Exit;
end;

if Enable then begin
mb1.Caption:= cm('FreeSpace') + ' ' + MbOrTb(FreeMB);
mb2.Caption:= cm('NeedSpace') + ' ' + MborTb({#NeedSize});
WizardForm.NextButton.Enabled:= true;
BtnSetEnabled(hNextBtn, true);
end;

if FreeMB < {#NeedSize} then begin WizardForm.NextButton.Enabled:= false; BtnSetEnabled(hNextBtn, false); end else begin WizardForm.NextButton.Enabled:= true; BtnSetEnabled(hNextBtn, true); end;
end;

procedure CreateLabel;
begin
Welcomelbl1:= TLabel.Create(WizardForm);
with Welcomelbl1 do
begin
Left:= ScaleX(80);
Top:= ScaleY(244);
Width:= ScaleX(450);
Height:= ScaleY(450);
AutoSize:= false;
Transparent:= true;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8;
Font.Color:= clwhite;
Font.Style := [fsBold];
Alignment := taCenter;
Parent:= WizardForm;
Caption:= cm('Welcome');
end;

with WizardForm.DirEdit do begin
Parent:= WizardForm;
Left:= ScaleX(100);
Top:= ScaleY(250);
Color:= clblack;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:= clwhite;
Width:= ScaleX(324);
Height:= ScaleY(18);
end;

with WizardForm.GroupEdit do begin
Parent:= WizardForm;
Left:= ScaleX(100);
Top:= ScaleY(250);
Color:= clblack;
Font.Name:= 'Arial';
Font.Size:= 9;
Font.Color:= clwhite;
Width:= ScaleX(324);
Height:= ScaleY(18);
end;

Selectlbl1:=TLabel.Create(WizardForm);
with Selectlbl1 do
begin
Left:= ScaleX(100);
Top:= ScaleY(200);
Width:= ScaleX(450);
Height:= ScaleY(200);
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= clwhite;
Parent:= WizardForm;
Caption:= cm('dir1');
end;

Selectlbl2:=TLabel.Create(WizardForm);
with Selectlbl2 do
begin
Left:= ScaleX(100);
Top:= ScaleY(216);
Width:= ScaleX(450);
Height:= ScaleY(200);
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= clwhite;
Parent:= WizardForm;
Caption:= cm('dir2');
end;


mb1:=TLabel.Create(WizardForm);
with mb1 do
begin
Left:= ScaleX(100);
Top:= ScaleY(278);
Width:= ScaleX(450);
Height:= ScaleY(200);
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= clwhite;
Parent:= WizardForm;
end;

mb2:=TLabel.Create(WizardForm);
with mb2 do
begin
Left:= ScaleX(100);
Top:= ScaleY(295);
Width:= ScaleX(450);
Height:= ScaleY(200);
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= clwhite;
Parent:= WizardForm;
end;

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;

NoIconsCheck:= TNewCheckbox.Create(WizardForm);
with NoIconsCheck do
begin
Left:= ScaleX(100);
Top:= ScaleY(280);
Width:= ScaleX(13);
Height:= ScaleY(13);
Parent:= WizardForm;
OnClick:= @NoIconsCheckClick;
end;

ExtractTemporaryFile('1.bmp');

with WizardForm.ComponentsList do begin
LoadBGBmpFromFile(ExpandConstant('{tmp}\1.bmp'), Left+100, Top+150);
Parent:= WizardForm;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Font.Color:= clwhite;
left:= ScaleX(100);
BorderStyle:= bsNone;
Top:= ScaleY(200);
Height:= Height - 50;
end;
DeleteFile(ExpandConstant('{tmp}\1.bmp'));

islbl1:=TLabel.Create(WizardForm);
with islbl1 do
begin
Left:= ScaleX(100);
Top:= ScaleY(255);
Width:= ScaleX(450);
Height:= ScaleY(200);
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= clwhite;
Parent:= WizardForm;
Caption:= cm('Extracted');
end;

islbl2:=TLabel.Create(WizardForm);
with islbl2 do
begin
Left:= ScaleX(100);
Top:= ScaleY(270);
Width:= ScaleX(450);
Height:= ScaleY(200);
AutoSize:= false;
WordWrap:= true;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= clwhite;
Parent:= WizardForm;
end;

NoIconsLabel:=TLabel.Create(WizardForm);
with NoIconsLabel do
begin
Left:= ScaleX(120);
Top:= ScaleY(280);
Width:= ScaleX(450);
Height:= ScaleY(200);
AutoSize:= false;
Font.Name:= 'Arial';
Font.Size:= 8
Font.Style := [fsBold];
Transparent:= true;
Font.Color:= clwhite;
Parent:= WizardForm;
Caption:= cm('nic');
OnClick:= @NoIconsLabelClick;
end;
end;

procedure InitializeWizard;
begin
s:= WizardForm.Caption;
Enabled:= true;
CreateLabel;
CreateWizardImg;
ButtonsTextures;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
SetStateNewButtons;

Welcomelbl1.Hide;
WizardForm.DirEdit.Hide;
WizardForm.GroupEdit.Hide;
Selectlbl1.Hide;
Selectlbl2.Hide;
BtnSetVisibility(hDirBrowseBtn, false);
BtnSetVisibility(hGroupBrowseBtn, false);
mb1.Hide;
mb2.Hide;
NoIconsCheck.Hide;
NoIconsLabel.Hide;
WizardForm.ComponentsList.Hide;
islbl1.Hide;

if CurPageID = wpWelcome then
begin
Welcomelbl1.Show;
ImgSetVisibility(form, true);
ImgSetVisibility(form1, false);
end;

if CurPageID = wpSelectDir then
begin
GetFreeSpaceCaption(nil);
Selectlbl2.Caption:= cm('Dir2');
WizardForm.DirEdit.Show;
Selectlbl1.Show;
Selectlbl1.Caption:= cm('Dir1');
Selectlbl2.Show;
BtnSetVisibility(hDirBrowseBtn, true);
ImgSetVisibility(form1, true);
ImgSetVisibility(form, false);
mb1.Show;
mb2.Show;
end;

if CurPageID = wpSelectComponents then WizardForm.ComponentsList.Show;

if CurPageID = wpSelectProgramGroup then
begin
Selectlbl1.Caption:= cm('Group1');
Selectlbl1.Show;
Selectlbl2.Show;
Selectlbl2.Caption:= cm('Dir2');
WizardForm.GroupEdit.Show;
BtnSetVisibility(hGroupBrowseBtn, true);
NoIconsCheck.Show;
NoIconsLabel.Show;
WizardForm.NextButton.Caption:= 'Установить';
end;

if CurPageID = wpSelectTasks then
begin

end;

if CurPageID = wpReady then
begin
ImgSetVisibility(form1, true);
end;

if CurPageID = wpInstalling then
begin
ImgSetVisibility(form, true);
ImgSetVisibility(form1, false);
islbl1.Show;
end;

if CurPageID = wpFinished then
begin
ImgSetVisibility(form, true);
islbl2.Hide;
Welcomelbl1.Show;
Welcomelbl1.Caption:= cm('Fin');
Welcomelbl1.Top:= Welcomelbl1.Top+ScaleY(5);
end;

if (CurPageID = wpFinished) and ISDoneError then
begin
Welcomelbl1.Show;
Welcomelbl1.Font.Color:= clred;
Welcomelbl1.Caption:= cm('FinError');
end;
ImgApplyChanges(WizardForm.Handle);
end;

procedure CurStepChanged(CurStep: TSetupStep);
var Comps1,Comps2,Comps3, TmpValue:cardinal;
FindHandle1,ColFiles1,CurIndex1,tmp:integer;
ExecError:boolean;
InFilePath,OutFilePath,OutFileName:PAnsiChar;
begin
if CurStep = ssInstall then begin
WizardForm.ProgressGauge.Hide;
WizardForm.CancelButton.Hide;
ISDonePB:= ImgPBCreate(WizardForm.Handle, ExpandConstant('pb2.png'),ExpandConstant('pb1.png'), ScaleX(100), ScaleY(290), ScaleX(420), ScaleY(19));

WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
ISDoneCancel:=0;

ExtractTemporaryFile('unarc.dll');

#ifdef PrecompInside
ExtractTemporaryFile('CLS-precomp.dll');
ExtractTemporaryFile('packjpg_dll.dll');
ExtractTemporaryFile('packjpg_dll1.dll');
ExtractTemporaryFile('precomp.exe');
ExtractTemporaryFile('zlib1.dll');
#endif
#ifdef SrepInside
ExtractTemporaryFile('CLS-srep.dll');
#endif
#ifdef facompress
ExtractTemporaryFile('facompress.dll');
#endif
#ifdef records
ExtractTemporaryFile('records.inf');
#endif

Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
TmpValue:=1;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue;
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue;
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue;
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue;
#endif

#ifdef precomp
PCFVer:={#precomp};
#else
PCFVer:=0;
#endif
ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, 0, @ProgressCallback) then begin
repeat
if not SrepInit('',512,0) then break;
if not PrecompInit('',128,PCFVer) then break;
if not FileSearchInit(true) then break;

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data-1.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data-2.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data-3.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data-4.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
if not ShowChangeDiskWindow ('Пожалуйста, вставьте второй диск и дождитесь его инициализации.', ExpandConstant('{src}'),'sound.fakt') then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\sound.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\video.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
(*
*)
ISDoneError:=false;
until true;
ImgPBDelete(ISDonePB);
islbl2.Hide;
islbl1.Caption:= SetupMessage(msgStatusRunProgram);
ISDoneStop;
end;
WizardForm.CancelButton.Visible:=true;
WizardForm.CancelButton.Enabled:=false;
end;
if (CurStep=ssPostInstall) and ISDoneError then begin
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;
end;

procedure DeinitializeSetup;
begin
if Enabled then gdipShutdown;
WizardForm.Free;
end;

R.i.m.s.k.y. 12-01-2013 07:54 2064849

Цитата:

Цитата audiofeel
runtime error couldn't.... »

а дальше?

audiofeel 12-01-2013 08:18 2064853

R.i.m.s.k.y., = "Runtime Error (at 183:50) Внутренняя ошибка: An attempt was made to access Wizard Form before it has been created = это сообщение появляется вместе с окном удаления

R.i.m.s.k.y. 12-01-2013 08:25 2064856

audiofeel, ошибка исдана, я с ним хз

audiofeel 12-01-2013 08:36 2064860

R.i.m.s.k.y., может есть другой пример (с чистым исданом та этот пример работает только с этим скриптом нет) З.Ы. ПРОБОВАЛ ОБЬЕДИНЯТ при помощи "джойнер" = вылазит и установка и удаление

R.i.m.s.k.y. 12-01-2013 08:43 2064864

audiofeel, я с исданом хз

alert30 12-01-2013 11:02 2064888

audiofeel, качай свежий ISDone с руборда, затем склей правильно как-полагается. По ошибке сказано, что с функцией WizradForm перемудрил.

Mailchik 12-01-2013 14:21 2064988

Цитата:

Цитата audiofeel
Runtime Error (at 183:50) Внутренняя ошибка: An attempt was made to access Wizard Form before it has been created = это сообщение появляется вместе с окном удаления »

вы пытаетесь получить доступ к WizardForm до того, как он был создан.

audiofeel 12-01-2013 15:37 2065038

Ну посмотрите хоть мельком скрипт - может ошибка "на виду" и не такая уж из за которой "ВСЁ" "склеивать" по новой

alert30 12-01-2013 15:45 2065044

audiofeel, пользователь Mailchik изъяснял эту ошибку:
Цитата:

вы пытаетесь получить доступ к WizardForm до того, как он был создан.

Mailchik 12-01-2013 16:12 2065059

Цитата:

Цитата audiofeel
Ну посмотрите хоть мельком скрипт - может ошибка "на виду" и не такая уж из за которой "ВСЁ" "склеивать" по новой »

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

audiofeel 12-01-2013 16:26 2065070

по отдельности если компилировать оба скрипта что я "выложил" выше = ошибки нет - проблема в объединение этих скриптов в один . с "#include" тоже не выходит

Mailchik 12-01-2013 17:00 2065089

audiofeel, рабочий вариант:
читать дальше »
Код:

#define MyAppName "Assassin's Creed III"
 #define MyAppVerName "Assassin's Creed III [v 1.01]"

 #define NeedSize 10752

 #define Components

 ;#define records
 ;#define facompress
 ;#define PrecompInside
 #define SrepInside

 [Setup]
 AppName={#MyAppName}
 AppVerName={#MyAppName}
 AppPublisher=Fakt_37
 DefaultDirName={pf}\Fakt_37\{#MyAppName}
 DefaultGroupName=Fakt_37\{#MyAppName}
 DirExistsWarning=no
 AppID={{0872DB47-24CB-4C7F-AC4B-E6EFC27BD244}
 VersionInfoDescription={#MyAppName}
 DisableReadyPage=yes
 LZMAAlgorithm=1
 LZMAMatchFinder=BT
 LZMANumFastBytes=273

 [Languages]
 Name: rus; MessagesFile: compiler:Languages\Russian.isl

 [CustomMessages]
 rus.Welcome=Вас приветствует Мастер установки игры «{#MyAppName}» %nРекомендуется закрыть антивирусные программы, а также все прочие приложения перед тем, как продолжить.%nНажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти из программы установки.
 rus.Dir1=Программа установит «{#MyAppName}» в следующую папку.
 rus.Group1=Программа создаст ярлыки в следующей папке меню «Пуск».
 rus.FreeSpace=Доступно места на диске:
 rus.NeedSpace=Требуется места для установки:
 rus.nic=Не создавать папку в меню «Пуск»
 rus.Fin=%nУстановка игры «{#MyAppName}» успешно завершена. %nНажмите "Завершить", чтобы выйти из программы установки.
 rus.FinError=Установка игры «{#MyAppName}» не завершена. %nВо время установки произошла ошибка, пожалуйста отключите сторонние программы и повторите попытку установки. %nНажмите "Завершить", чтобы выйти из программы установки.
 rus.Extracted=Распаковка файлов...
 rus.rbc=Откат установки...
 rus.Dir2=Нажмите «Далее», чтобы продолжить. Если Вы хотите выбрать другую папку, нажмите «Обзор»

 #ifdef Components

 [Registry]

 [Types]
 Name: full; Description: Full installation; Flags: iscustom

 [Components]
 Name: Dector; Description: Дополнительные ярлыки:; Types: full
 Name: Dector\a; Description: Добавить ярлык на рабочий стол; Types: full
 Name: PO; Description: Дополнительное програмное обеспечения:; Types: full
 Name: PO\a; Description: Обновить DirectX; Types: full
 Name: PO\b; Description: Установить/обновить Microsoft Visual C++; Types: full
 Name: PO\c; Description: Установить/обновить Microsoft Visual C++; Types: full
 #endif

 [Files]
 Source: Files\fon.png; Flags: dontcopy
 Source: Files\pb1.png; Flags: dontcopy
 Source: Files\pb2.png; Flags: dontcopy
 Source: Files\1.bmp; Flags: dontcopy
 Source: Files\form.png; Flags: dontcopy
 Source: Files\form1.png; Flags: dontcopy
 Source: Files\logo.png; Flags: dontcopy
 Source: Files\button.png; Flags: dontcopy
 Source: dll\*.*; Flags: dontcopy
 Source: ISDone\unarc.dll; DestDir: {tmp}; Flags: dontcopy
 Source: ISDone\ISDone.dll; DestDir: {tmp}; Flags: dontcopy
 #ifdef records
 Source: records.inf; DestDir: {tmp}; Flags: dontcopy
 #endif

 #ifdef PrecompInside
 Source: ISDone\CLS-precomp.dll; DestDir: {tmp}; Flags: dontcopy
 Source: ISDone\packjpg_dll.dll; DestDir: {tmp}; Flags: dontcopy
 Source: ISDone\packjpg_dll1.dll; DestDir: {tmp}; Flags: dontcopy
 Source: ISDone\precomp.exe; DestDir: {tmp}; Flags: dontcopy
 Source: ISDone\zlib1.dll; DestDir: {tmp}; Flags: dontcopy
 #endif
 #ifdef SrepInside
 Source: ISDone\CLS-srep.dll; DestDir: {tmp}; Flags: dontcopy
 #endif
 #ifdef facompress
 Source: ISDone\facompress.dll; DestDir: {tmp}; Flags: dontcopy
 #endif

 [Icons]
 Name: {userdesktop}\{#MyAppName}; Filename: {app}\AC3SP.exe; WorkingDir: {app}; IconFilename: {app}\AC3SP.exe; Components: Dector\a; Check: CheckError
 Name: {group}\{#MyAppName}; Filename: {app}\AC3SP.exe; WorkingDir: {app}; IconFilename: {app}\AC3SP.exe; Comment: Запустить игру; Check: CheckError
 Name: {group}\Удалить игру; Filename: {uninstallexe}; Comment: Удалить игру; Check: CheckError

 [Run]
 Filename: {src}\Redist\directx.exe; WorkingDir: {src}\Redist\; Parameters: /Q; Flags: waituntilterminated runminimized; Components: PO\a; Check: CheckError
 Filename: {src}\Redist\vcredist_x86.exe; WorkingDir: {src}\Redist\; Parameters: /Q; Flags: waituntilterminated; Components: PO\b; Check: CheckError
 Filename: {src}\Redist\PhysX.msi; Parameters: /Q; WorkingDir: {src}\Redist; Components: PO\c; Check: CheckError
 [code]
 const
 PCFonFLY=true;
 notPCFonFLY=false;

 var
 Enabled: Boolean;
 hCancelBtn, hNextBtn, hBackBtn, hDirBrowseBtn, hGroupBrowseBtn: HWND;
 Welcomelbl1, Selectlbl1, Selectlbl2, MainLabel, Mb1, Mb2, NoIconsLabel, islbl1, islbl2, islbl3: TLabel;
 WFButtonFont: TFont;
 form, form1: Longint;
 NoIconsCheck: TNewCheckBox;
 IntList, VoiceList: TNewCheckListBox;
 ISDoneCancel: Integer;
 ISDoneError: Boolean;
 PCFVer: Double;
 s: AnsiString;

 function ReleaseCapture: Longint; external 'ReleaseCapture@user32.dll stdcall';

 procedure LabelOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin
 ReleaseCapture;
 SendMessage(WizardForm.Handle, $0112, $F012, 0)
 end;

 #include "AddIss\botva2.iss"
 #include "AddIss\progressbar.iss"

 var
 ISDonePB: TImgPB;
 ResultStr: string;
 ResultCode: Integer;

 function InitializeSetup:boolean;
 begin
 RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0872DB47-24CB-4C7F-AC4B-E6EFC27BD244}_is1', 'UninstallString', ResultStr)
 if ResultStr='' then
 begin
 Result := True;
 if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
 if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
 end
 else begin
 ResultStr := RemoveQuotes(ResultStr);
 Exec(ResultStr, '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);
 end;
 end;

 function cm(s: PAnsiChar): String;
 begin
 Result:= ExpandConstant('{cm:'+s+'}');
 end;

 type
 TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

 function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';

 function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
 function IS7ZipExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'IS7zipExtract@files:ISDone.dll stdcall delayload';
 function ISRarExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'ISRarExtract@files:ISDone.dll stdcall delayload';
 function ISPrecompExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISPrecompExtract@files:ISDone.dll stdcall delayload';
 function ISSRepExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISSrepExtract@files:ISDone.dll stdcall delayload';
 function ISxDeltaExtract(CurComponent:Cardinal; PctOfTotal:double; minRAM,maxRAM:integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile:boolean):boolean; external 'ISxDeltaExtract@files:ISDone.dll stdcall delayload';
 function ISPackZIP(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString;ComprLvl:integer; DeleteInFile:boolean):boolean; external 'ISPackZIP@files:ISDone.dll stdcall delayload';
 function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):boolean; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall delayload';

 function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
 function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer; external 'ISFindFiles@files:ISDone.dll stdcall delayload';
 function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean; external 'ISPickFilename@files:ISDone.dll stdcall delayload';
 function ISGetName(TypeStr:integer):PAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
 function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
 function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';

 function SrepInit(TmpPath:PAnsiChar;VirtMem,MaxSave:Cardinal):boolean; external 'SrepInit@files:ISDone.dll stdcall delayload';
 function PrecompInit(TmpPath:PAnsiChar;VirtMem:cardinal;PrecompVers:single):boolean; external 'PrecompInit@files:ISDone.dll stdcall delayload';
 function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
 function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
 function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
 function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
 function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
 function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';

 function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
 begin
 if OveralPct<=1000 then ImgPBSetPosition(ISDonePB, OveralPct);
 WizardForm.Caption:= s + ' - ' + IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
 islbl1.Caption:= cm('Extracted') + ' ' + IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
 islbl2.Caption:= MinimizePathName(ExpandConstant('{app}\')+CurrentFile, islbl2.Font, ScaleX(400));
 Result := ISDoneCancel;
 end;

 procedure CancelButtonOnClick(hBtn: HWND);
 begin
 SuspendProc;
 if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then begin
 ISDoneCancel:=1;
 islbl1.Caption:= cm('rbc');
 end;
 ResumeProc;
 end;


 function CheckError:boolean;
 begin
 Result:= not ISDoneError;
 end;

 procedure CreateWizardImg;
 begin
 with WizardForm do begin
 ClientWidth:=ScaleX(623);
 ClientHeight:=ScaleY(382);
 InnerNotebook.Hide;
 OuterNotebook.Hide;
 Bevel.Hide;
 Center;
 Color:= $191919;
 end;

 ImgLoad(WizardForm.Handle, 'fon.png', ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
 form:= ImgLoad(WizardForm.Handle, 'form.png', ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
 form1:= ImgLoad(WizardForm.Handle, 'form1.png', ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.ClientHeight, True, True);
 ImgLoad(WizardForm.Handle, 'logo.png', ScaleX(20), ScaleY(326), ScaleX(190), ScaleY(39), True, True);

 ImgSetVisibility(form1, false);

 ImgApplyChanges(WizardForm.Handle);
 end;

 procedure SetStateNewButtons;
 begin
 with WizardForm.BackButton do begin
 BtnSetText(hBackBtn,PAnsiChar(Caption));
 BtnSetVisibility(hBackBtn,Visible);
 BtnSetEnabled(hBackBtn,Enabled);
 end;
 with WizardForm.NextButton do begin
 BtnSetText(hNextBtn,PAnsiChar(Caption));
 BtnSetVisibility(hNextBtn,Visible);
 BtnSetEnabled(hNextBtn,Enabled);
 end;
 with WizardForm.CancelButton do begin
 BtnSetText(hCancelBtn,PAnsiChar(Caption));
 BtnSetVisibility(hCancelBtn,Visible);
 BtnSetEnabled(hCancelBtn,Enabled);
 end;
 BtnSetText(hDirBrowseBtn,PAnsiChar(WizardForm.DirBrowseButton.Caption));
 BtnSetText(hGroupBrowseBtn,PAnsiChar(WizardForm.GroupBrowseButton.Caption));
 end;

 procedure WizardFormBtnClick(hBtn:HWND);
 var
 Btn: TButton;
 begin
 case hBtn of
 hCancelBtn: Btn:=WizardForm.CancelButton;
 hNextBtn: Btn:=WizardForm.NextButton;
 hBackBtn: Btn:=WizardForm.BackButton;
 hDirBrowseBtn: Btn:=WizardForm.DirBrowseButton;
 hGroupBrowseBtn: Btn:=WizardForm.GroupBrowseButton;
 end;
 Btn.OnClick(Btn);
 SetStateNewButtons;
 BtnRefresh(hBtn);
 end;

 procedure NoIconsCheckClick(Sender: TObject);
 begin
 if NoIconsCheck.Checked then begin
 WizardForm.GroupEdit.Enabled:= false;
 WizardForm.GroupBrowseButton.Enabled:= false;
 BtnSetEnabled(hGroupBrowseBtn, false);
 end else begin
 WizardForm.GroupEdit.Enabled:= true;
 WizardForm.GroupBrowseButton.Enabled:= true;
 BtnSetEnabled(hGroupBrowseBtn, true);
 end;
 WizardForm.NoIconsCheck.Checked:= NoIconsCheck.Checked;
 WizardForm.GroupEdit.Color:= clblack;
 end;

 procedure NoIconsLabelClick(Sender: TObject);
 begin
 NoIconsCheck.Checked:= not NoIconsCheck.Checked;
 NoIconsCheckClick(nil);

 end;

 procedure ButtonsTextures;
 begin
 WFButtonFont:=TFont.Create;
 WFButtonFont.Style:=[fsBold];
 WFButtonFont.Name:= 'Arial';
 WFButtonFont.Size:= 8;

 with WizardForm.BackButton do begin
 hBackBtn:= BtnCreate(WizardForm.Handle, ScaleX(Left+28), ScaleY(Top+3), ScaleX(100), ScaleY(35), 'button.png', 1, False);
 BtnSetEvent(hBackBtn, BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
 BtnSetFont(hBackBtn, WFButtonFont.Handle);
 BtnSetFontColor(hBackBtn, clblack, clblack, clblack, clblack);
 Width:=0;
 Height:=0;
 end;

 with WizardForm.NextButton do begin
 hNextBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+55), ScaleY(Top+3), ScaleX(100), ScaleY(35), 'button.png', 1, False);
 BtnSetEvent(hNextBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
 BtnSetFont(hNextBtn,WFButtonFont.Handle);
 BtnSetFontColor(hNextBtn, clblack, clblack, clblack, clblack);
 Width:=0;
 Height:=0;
 end;

 with WizardForm.CancelButton do begin
 hCancelBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+85), ScaleY(Top+3), ScaleX(100), ScaleY(35), 'button.png', 1, False);
 BtnSetEvent(hCancelBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
 BtnSetFont(hCancelBtn,WFButtonFont.Handle);
 BtnSetFontColor(hCancelBtn, clblack, clblack, clblack, clblack);
 Width:=0;
 Height:=0;
 end;

 with WizardForm.DirBrowseButton do begin
 hDirBrowseBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+90), ScaleY(Top+164), ScaleX(100), ScaleY(35), 'button.png', 1, False);
 BtnSetEvent(hDirBrowseBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
 BtnSetFont(hDirBrowseBtn,WFButtonFont.Handle);
 BtnSetFontColor(hDirBrowseBtn, clblack, clblack, clblack, clblack);
 Width:=0;
 Height:=0;
 end;

 with WizardForm.GroupBrowseButton do begin
 hGroupBrowseBtn:=BtnCreate(WizardForm.Handle, ScaleX(Left+90), ScaleY(Top+164), ScaleX(100), ScaleY(35), 'button.png', 1, False);
 BtnSetEvent(hGroupBrowseBtn,BtnClickEventID, CallbackAddr('WizardFormBtnClick'));
 BtnSetFont(hGroupBrowseBtn,WFButtonFont.Handle);
 BtnSetFontColor(hGroupBrowseBtn, clblack, clblack, clblack, clblack);
 Width:=0;
 Height:=0;
 end;
 end;


 function NumToStr(Float: Extended): string;
 begin
 Result:=Format('%.2n', [Float]);
 StringChange(Result, ',', '.');
 while ((Result[Length(Result)]='0') or (Result[Length(Result)]='.')) and (Pos('.',Result)>0) do SetLength(Result,Length(Result)-1);
 end;

 function MbOrTB(Float: Extended): string;
 begin
 if Float<1024 then Result:=NumToStr(Float)+' MB'
 else if (Float/1024)<1024 then Result:=NumToStr(Float/1024)+' GB'
 else if (Float/(1024*1024))<1024 then Result:=NumToStr(Float/(1024*1024))+' TB'
 end;

 procedure GetFreeSpaceCaption(Sender: TObject);
 var
 Enable: Boolean;
 Path: AnsiString;
 FreeMB, TotalMB: Cardinal;
 begin
 Path:= ExtractFileDrive(WizardForm.DirEdit.Text);
 Enable:= GetSpaceOnDisk(Path, True, FreeMB, TotalMB);

 if not Enable then begin
 mb1.Caption:= cm('FreeSpace') + ' ' + '0 Мб';
 mb2.Caption:= cm('NeedSpace') + ' ' + MborTb({#NeedSize});
 WizardForm.NextButton.Enabled:= false;
 BtnSetEnabled(hNextBtn, false);
 Exit;
 end;

 if Enable then begin
 mb1.Caption:= cm('FreeSpace') + ' ' + MbOrTb(FreeMB);
 mb2.Caption:= cm('NeedSpace') + ' ' + MborTb({#NeedSize});
 WizardForm.NextButton.Enabled:= true;
 BtnSetEnabled(hNextBtn, true);
 end;

 if FreeMB < {#NeedSize} then begin WizardForm.NextButton.Enabled:= false; BtnSetEnabled(hNextBtn, false); end else begin WizardForm.NextButton.Enabled:= true; BtnSetEnabled(hNextBtn, true); end;
 end;

 procedure CreateLabel;
 begin
 Welcomelbl1:= TLabel.Create(WizardForm);
 with Welcomelbl1 do
 begin
 Left:= ScaleX(80);
 Top:= ScaleY(244);
 Width:= ScaleX(450);
 Height:= ScaleY(450);
 AutoSize:= false;
 Transparent:= true;
 WordWrap:= true;
 Font.Name:= 'Arial';
 Font.Size:= 8;
 Font.Color:= clwhite;
 Font.Style := [fsBold];
 Alignment := taCenter;
 Parent:= WizardForm;
 Caption:= cm('Welcome');
 end;

 with WizardForm.DirEdit do begin
 Parent:= WizardForm;
 Left:= ScaleX(100);
 Top:= ScaleY(250);
 Color:= clblack;
 Font.Name:= 'Arial';
 Font.Size:= 9;
 Font.Color:= clwhite;
 Width:= ScaleX(324);
 Height:= ScaleY(18);
 end;

 with WizardForm.GroupEdit do begin
 Parent:= WizardForm;
 Left:= ScaleX(100);
 Top:= ScaleY(250);
 Color:= clblack;
 Font.Name:= 'Arial';
 Font.Size:= 9;
 Font.Color:= clwhite;
 Width:= ScaleX(324);
 Height:= ScaleY(18);
 end;

 Selectlbl1:=TLabel.Create(WizardForm);
 with Selectlbl1 do
 begin
 Left:= ScaleX(100);
 Top:= ScaleY(200);
 Width:= ScaleX(450);
 Height:= ScaleY(200);
 AutoSize:= false;
 WordWrap:= true;
 Font.Name:= 'Arial';
 Font.Size:= 8
 Font.Style := [fsBold];
 Transparent:= true;
 Font.Color:= clwhite;
 Parent:= WizardForm;
 Caption:= cm('dir1');
 end;

 Selectlbl2:=TLabel.Create(WizardForm);
 with Selectlbl2 do
 begin
 Left:= ScaleX(100);
 Top:= ScaleY(216);
 Width:= ScaleX(450);
 Height:= ScaleY(200);
 AutoSize:= false;
 WordWrap:= true;
 Font.Name:= 'Arial';
 Font.Size:= 8
 Font.Style := [fsBold];
 Transparent:= true;
 Font.Color:= clwhite;
 Parent:= WizardForm;
 Caption:= cm('dir2');
 end;


 mb1:=TLabel.Create(WizardForm);
 with mb1 do
 begin
 Left:= ScaleX(100);
 Top:= ScaleY(278);
 Width:= ScaleX(450);
 Height:= ScaleY(200);
 AutoSize:= false;
 WordWrap:= true;
 Font.Name:= 'Arial';
 Font.Size:= 8
 Font.Style := [fsBold];
 Transparent:= true;
 Font.Color:= clwhite;
 Parent:= WizardForm;
 end;

 mb2:=TLabel.Create(WizardForm);
 with mb2 do
 begin
 Left:= ScaleX(100);
 Top:= ScaleY(295);
 Width:= ScaleX(450);
 Height:= ScaleY(200);
 AutoSize:= false;
 WordWrap:= true;
 Font.Name:= 'Arial';
 Font.Size:= 8
 Font.Style := [fsBold];
 Transparent:= true;
 Font.Color:= clwhite;
 Parent:= WizardForm;
 end;

 WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;

 NoIconsCheck:= TNewCheckbox.Create(WizardForm);
 with NoIconsCheck do
 begin
 Left:= ScaleX(100);
 Top:= ScaleY(280);
 Width:= ScaleX(13);
 Height:= ScaleY(13);
 Parent:= WizardForm;
 OnClick:= @NoIconsCheckClick;
 end;

 ExtractTemporaryFile('1.bmp');

 with WizardForm.ComponentsList do begin
 LoadBGBmpFromFile(ExpandConstant('{tmp}\1.bmp'), Left+100, Top+150);
 Parent:= WizardForm;
 Font.Name:= 'Arial';
 Font.Size:= 8
 Font.Style := [fsBold];
 Font.Color:= clwhite;
 left:= ScaleX(100);
 BorderStyle:= bsNone;
 Top:= ScaleY(200);
 Height:= Height - 50;
 end;
 DeleteFile(ExpandConstant('{tmp}\1.bmp'));

 islbl1:=TLabel.Create(WizardForm);
 with islbl1 do
 begin
 Left:= ScaleX(100);
 Top:= ScaleY(255);
 Width:= ScaleX(450);
 Height:= ScaleY(200);
 AutoSize:= false;
 WordWrap:= true;
 Font.Name:= 'Arial';
 Font.Size:= 8
 Font.Style := [fsBold];
 Transparent:= true;
 Font.Color:= clwhite;
 Parent:= WizardForm;
 Caption:= cm('Extracted');
 end;

 islbl2:=TLabel.Create(WizardForm);
 with islbl2 do
 begin
 Left:= ScaleX(100);
 Top:= ScaleY(270);
 Width:= ScaleX(450);
 Height:= ScaleY(200);
 AutoSize:= false;
 WordWrap:= true;
 Font.Name:= 'Arial';
 Font.Size:= 8
 Font.Style := [fsBold];
 Transparent:= true;
 Font.Color:= clwhite;
 Parent:= WizardForm;
 end;

 NoIconsLabel:=TLabel.Create(WizardForm);
 with NoIconsLabel do
 begin
 Left:= ScaleX(120);
 Top:= ScaleY(280);
 Width:= ScaleX(450);
 Height:= ScaleY(200);
 AutoSize:= false;
 Font.Name:= 'Arial';
 Font.Size:= 8
 Font.Style := [fsBold];
 Transparent:= true;
 Font.Color:= clwhite;
 Parent:= WizardForm;
 Caption:= cm('nic');
 OnClick:= @NoIconsLabelClick;
 end;
 end;

 procedure InitializeWizard;
 begin
 s:= WizardForm.Caption;
 Enabled:= true;
 CreateLabel;
 CreateWizardImg;
 ButtonsTextures;
 end;

 procedure CurPageChanged(CurPageID: Integer);
 begin
 SetStateNewButtons;

 Welcomelbl1.Hide;
 WizardForm.DirEdit.Hide;
 WizardForm.GroupEdit.Hide;
 Selectlbl1.Hide;
 Selectlbl2.Hide;
 BtnSetVisibility(hDirBrowseBtn, false);
 BtnSetVisibility(hGroupBrowseBtn, false);
 mb1.Hide;
 mb2.Hide;
 NoIconsCheck.Hide;
 NoIconsLabel.Hide;
 WizardForm.ComponentsList.Hide;
 islbl1.Hide;

 if CurPageID = wpWelcome then
 begin
 Welcomelbl1.Show;
 ImgSetVisibility(form, true);
 ImgSetVisibility(form1, false);
 end;

 if CurPageID = wpSelectDir then
 begin
 GetFreeSpaceCaption(nil);
 Selectlbl2.Caption:= cm('Dir2');
 WizardForm.DirEdit.Show;
 Selectlbl1.Show;
 Selectlbl1.Caption:= cm('Dir1');
 Selectlbl2.Show;
 BtnSetVisibility(hDirBrowseBtn, true);
 ImgSetVisibility(form1, true);
 ImgSetVisibility(form, false);
 mb1.Show;
 mb2.Show;
 end;

 if CurPageID = wpSelectComponents then WizardForm.ComponentsList.Show;

 if CurPageID = wpSelectProgramGroup then
 begin
 Selectlbl1.Caption:= cm('Group1');
 Selectlbl1.Show;
 Selectlbl2.Show;
 Selectlbl2.Caption:= cm('Dir2');
 WizardForm.GroupEdit.Show;
 BtnSetVisibility(hGroupBrowseBtn, true);
 NoIconsCheck.Show;
 NoIconsLabel.Show;
 WizardForm.NextButton.Caption:= 'Установить';
 end;

 if CurPageID = wpSelectTasks then
 begin

 end;

 if CurPageID = wpReady then
 begin
 ImgSetVisibility(form1, true);
 end;

 if CurPageID = wpInstalling then
 begin
 ImgSetVisibility(form, true);
 ImgSetVisibility(form1, false);
 islbl1.Show;
 end;

 if CurPageID = wpFinished then
 begin
 ImgSetVisibility(form, true);
 islbl2.Hide;
 Welcomelbl1.Show;
 Welcomelbl1.Caption:= cm('Fin');
 Welcomelbl1.Top:= Welcomelbl1.Top+ScaleY(5);
 end;

 if (CurPageID = wpFinished) and ISDoneError then
 begin
 Welcomelbl1.Show;
 Welcomelbl1.Font.Color:= clred;
 Welcomelbl1.Caption:= cm('FinError');
 end;
 ImgApplyChanges(WizardForm.Handle);
 end;

 procedure CurStepChanged(CurStep: TSetupStep);
 var Comps1,Comps2,Comps3, TmpValue:cardinal;
 FindHandle1,ColFiles1,CurIndex1,tmp:integer;
 ExecError:boolean;
 InFilePath,OutFilePath,OutFileName:PAnsiChar;
 begin
 if CurStep = ssInstall then begin
 WizardForm.ProgressGauge.Hide;
 WizardForm.CancelButton.Hide;
 ISDonePB:= ImgPBCreate(WizardForm.Handle, ExpandConstant('pb2.png'),ExpandConstant('pb1.png'), ScaleX(100), ScaleY(290), ScaleX(420), ScaleY(19));

 WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
 ISDoneCancel:=0;

 ExtractTemporaryFile('unarc.dll');

 #ifdef PrecompInside
 ExtractTemporaryFile('CLS-precomp.dll');
 ExtractTemporaryFile('packjpg_dll.dll');
 ExtractTemporaryFile('packjpg_dll1.dll');
 ExtractTemporaryFile('precomp.exe');
 ExtractTemporaryFile('zlib1.dll');
 #endif
 #ifdef SrepInside
 ExtractTemporaryFile('CLS-srep.dll');
 #endif
 #ifdef facompress
 ExtractTemporaryFile('facompress.dll');
 #endif
 #ifdef records
 ExtractTemporaryFile('records.inf');
 #endif

 Comps1:=0; Comps2:=0; Comps3:=0;
 #ifdef Components
 TmpValue:=1;
 if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue;
 TmpValue:=TmpValue*2;
 if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue;
 TmpValue:=TmpValue*2;
 if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue;
 TmpValue:=TmpValue*2;
 if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue;
 #endif

 #ifdef precomp
 PCFVer:={#precomp};
 #else
 PCFVer:=0;
 #endif
 ISDoneError:=true;
 if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, 0, @ProgressCallback) then begin
 repeat
 if not SrepInit('',512,0) then break;
 if not PrecompInit('',128,PCFVer) then break;
 if not FileSearchInit(true) then break;

 (* if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data-1.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
 if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data-2.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
 if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data-3.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
 if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data-4.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
 if not ShowChangeDiskWindow ('Пожалуйста, вставьте второй диск и дождитесь его инициализации.', ExpandConstant('{src}'),'sound.fakt') then break;
 if not ISArcExtract ( 0, 0, ExpandConstant('{src}\sound.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
 if not ISArcExtract ( 0, 0, ExpandConstant('{src}\video.fakt'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
 *)
 ISDoneError:=false;
 until true;
 ImgPBDelete(ISDonePB);
 islbl2.Hide;
 islbl1.Caption:= SetupMessage(msgStatusRunProgram);
 ISDoneStop;
 end;
 WizardForm.CancelButton.Visible:=true;
 WizardForm.CancelButton.Enabled:=false;
 end;
 if (CurStep=ssPostInstall) and ISDoneError then begin
 Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
 end;
 end;

 procedure DeinitializeSetup;
 begin
 if Enabled then gdipShutdown;
 if ResultStr='' then
 WizardForm.Free;
 end;

в процедуре деинициализации инсталла, вы освобождали WizardForm в любом случае. А если строка в реестре найдена, то инициализации не происходит, поэтому WizardForm не создаётся, и сразу же идёт освобождение не созданного объекта.. Поэтому в деинициализацию нужно было добавить условие.

R.i.m.s.k.y. 12-01-2013 20:46 2065257

Подскажите, пожалуйста: установщик сам определяет нужно ли перезагружаться по окончании установки (файлы были заняты, или еще что)
И если нужно перегрузиться то последняя страница wpFinished заменяется его "перегрузить сейчас/позже"
Можно эту страницу как-то показывать после wpFinished или еще каким образом сделать так чтобы wpFinished отображалась всегда, а страница перезагрузки - при необходимости?

Gnom_aka_Lexander 12-01-2013 21:03 2065284

R.i.m.s.k.y., это та-же страница, на которой находится RunList и два радиобаттона NeedRestart. есть встроенная функция, с помощью которой ты можешь сам регламентировать необходимость перезагрузки
Цитата:

function NeedRestart(): Boolean;
Возвращает True для указания инсталлятору предложить пользователю перезагрузить систему в конце успешной установки; иначе возвращает False.
управляется точно так-же, как например, InitializeSetup, тоесть как-то так:
Код:

function NeedRestart(): Boolean;
begin
  Result := твое условие, при выполнении которого необходимо перезагрузиться.
end;


R.i.m.s.k.y. 12-01-2013 21:09 2065290

Gnom_aka_Lexander, я в курсе про needrestart
пусть эта страница отображается, можно wpwelcome отобразить раньше страницы необходимости перезагрузки? или как-то дополнить ее своими чекбоксами?

Gnom_aka_Lexander 12-01-2013 21:12 2065294

Цитата:

Цитата R.i.m.s.k.y.
раньше страницы необходимости перезагрузки? »

нету. страницы. необходимости. перезагрузки.

R.i.m.s.k.y. 12-01-2013 21:17 2065298

Цитата:

Цитата Gnom_aka_Lexander
нету. страницы. необходимости. перезагрузки. »

я что-то понять не могу
смотрю на редактор форм и вижу что два радиобатона перезагрузки под runlist находятся
если я их сдвигаю - мои чекбоксы в [run] postinstall не отображаются, но работают

Gnom_aka_Lexander 12-01-2013 21:22 2065302

R.i.m.s.k.y., именно. и показываются они в зависимости от необходимости перезагрузки, каковую необходимость ты можешь задавать сам.
function NeedRestart(): Boolean; как раз показывает-скрывает эти радиобаттноны, каковые лежат на финишной странице, ID каковой таки да, именно wpFinished.

R.i.m.s.k.y. 12-01-2013 21:42 2065315

Gnom_aka_Lexander, вот этого я и не понимаю, если в редакторе форм радиобатоны сдвигаю - перестают отображаться чекбоксы которые я делаю в секции run флагами postinstall
Пусть все вместе отображаются, мне не жалко
Просто у инно продвинутая система определения необходимости перезагрузки и нет нужды ее подменять
Мне нужно на последней финишедпаге вывести пару чекбоксов независимо от результатов needrestart

R.i.m.s.k.y. 13-01-2013 07:21 2065572

Ладно переформулируем вопрос: как создать свою страницу c чекбоксами перед wpFinished и на nextButtonClick своей страницы повесить свое действие?

Mailchik 13-01-2013 10:04 2065615

R.i.m.s.k.y., пример:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
 BeforeFinishedPage: TInputOptionWizardPage;

function NextButtonClick(CurPageID: Integer): Boolean;
 begin
  if CurPageID <> BeforeFinishedPage.ID then
  Result := True else begin
    MsgBox('Вы нажали Далее' + #13#10 + 'Название выбранного чекбокса: '
    + BeforeFinishedPage.CheckListBox.ItemCaption[BeforeFinishedPage.CheckListBox.ItemIndex],
      mbInformation, MB_OK);
    Result := True;
  end;
end;

procedure InitializeWizard();
 begin
 BeforeFinishedPage := CreateInputOptionPage(wpInfoAfter,
  'Страница перед wpFinished', 'Моё описание страницы', 'Выберите действие и нажмите Далее', False, False);
 with BeforeFinishedPage do begin
  Add('Действие:');
  with CheckListBox do begin
  ItemEnabled[0] := False;
  Checked[0] := True;
  end;
  AddEx('ЧекБокс 1', 1, True);
  AddEx('ЧекБокс 2', 1, True);
 end;
end;


Цитата:

Цитата Johny777
Скажите пожалуйста как добавлять цветные строки в TListBox.Items.Add »

может уже не нужно, но всё же (версия inno от restools от 121216):
читать дальше »
Код:

#ifdef IS_ENHANCED
  #if (Ver < 0x5020300) || (Pos('ee', IS_Ver_Str) < 1)
    #pragma error 'Enhanced edition of Inno Setup (5.2.3.ee1 or higher) is required to compile this script'
  #endif
#else
  #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
  TestListBox: TListBox;
 
procedure ListBoxDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
 with TListBox(Control).Canvas do
  begin
    case Index of
      0:
        begin
          Font.Color := clBlue;
          Brush.Color := clYellow;
        end;
      1:
        begin
          Font.Color := clRed;
          Brush.Color := clLime;
        end;
      2:
        begin
          Font.Color := clGreen;
          Brush.Color := clFuchsia;
        end;
    end;
    FillRect(Rect);
    TextOut(Rect.Left, Rect.Top, (Control as TListBox).Items[Index]);
  end;
end;

procedure InitializeWizard();
 begin
 with WizardForm do begin
  OuterNotebook.Hide;
 end;
  TestListBox := TListBox.Create(WizardForm);
  with TestListBox do begin
  Parent := WizardForm;
  SetBounds(5, 5, 300, 300);
  Items.Add('строка 1');
  Items.Add('строка 2');
  Items.Add('строка 3');
  Style := lbOwnerDrawVariable;
  OnDrawItem := @ListBoxDrawItem;
 end;
end;


R.i.m.s.k.y. 14-01-2013 10:03 2066296

Mailchik, хорошо только кнопка "назад" после установки не к месту

Vstanka 14-01-2013 11:31 2066343

alert30, попробовала еще такой вариант:

Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program
 
[_Code]
const
  PING_TIMEOUT            = 500;
  INADDR_NONE              = $FFFFFFFF;
  SOCKET_ERROR            = (-1);
 
  IP_SUCCESS              = 0;
  IP_BUF_TOO_SMALL        = (11000 + 1);
  IP_DEST_NET_UNREACHABLE  = (11000 + 2);
  IP_DEST_HOST_UNREACHABLE = (11000 + 3);
  IP_DEST_PROT_UNREACHABLE = (11000 + 4);
  IP_DEST_PORT_UNREACHABLE = (11000 + 5);
  IP_NO_RESOURCES          = (11000 + 6);
  IP_BAD_OPTION            = (11000 + 7);
  IP_HW_ERROR              = (11000 + 8);
  IP_PACKET_TOO_BIG        = (11000 + 9);
  IP_REQ_TIMED_OUT        = (11000 + 10);
  IP_BAD_REQ              = (11000 + 11);
  IP_BAD_ROUTE            = (11000 + 12);
  IP_TTL_EXPIRED_TRANSIT  = (11000 + 13);
  IP_TTL_EXPIRED_REASSEM  = (11000 + 14);
  IP_PARAM_PROBLEM        = (11000 + 15);
  IP_SOURCE_QUENCH        = (11000 + 16);
  IP_OPTION_TOO_BIG        = (11000 + 17);
  IP_BAD_DESTINATION      = (11000 + 18);
  IP_ADDR_DELETED          = (11000 + 19);
  IP_SPEC_MTU_CHANGE      = (11000 + 20);
  IP_MTU_CHANGE            = (11000 + 21);
  IP_UNLOAD                = (11000 + 22);
  IP_ADDR_ADDED            = (11000 + 23);
  IP_GENERAL_FAILURE      = (11000 + 50);
  IP_PENDING              = (11000 + 255);
 
type
  ICMP_OPTIONS = record
    Ttl        : Byte;
    Tos        : Byte;
    Flags      : Byte;
    OptionsSize : Byte;
    OptionsData : Longint;
  end;
 
  ICMP_ECHO_REPLY = record
    Address      : Longint;
    status        : Longint;
    RoundTripTime : Longint;
    DataSize      : Longint;
    Reserved      : Integer;
    DataPointer  : Longint;
    Options      : ICMP_OPTIONS;
    Data          : string;
  end;
 
function IcmpCreateFile(): HWND;
external 'IcmpCreateFile@icmp.dll stdcall';
 
function IcmpCloseHandle(IcmpHandle: Longint): Longint;
external 'IcmpCloseHandle@icmp.dll stdcall';
 
function IcmpSendEcho(IcmpHandle: HWND;
                      DestinationAddress: Longint;
                      RequestData: string;
                      RequestSize: Longint;
                      RequestOptions: Longint;
                      var ReplyBuffer: ICMP_ECHO_REPLY;
                      ReplySize: Longint;
                      Timeout: Longint): Longint;
external 'IcmpSendEcho@icmp.dll stdcall';
 
function inet_addr(sAddr: string): Longint;
external 'inet_addr@wsock32.dll stdcall';
 
function GetPingResult(status: Longint): string;
begin
  case status of
    IP_SUCCESS:              Result:= 'Ping IP: success';
    IP_BUF_TOO_SMALL:        Result:= 'Ping IP: buf too small';
    IP_DEST_NET_UNREACHABLE:  Result:= 'Ping IP: destination net unreachable';
    IP_DEST_HOST_UNREACHABLE: Result:= 'Ping IP: destination host unreachable';
    IP_DEST_PROT_UNREACHABLE: Result:= 'Ping IP: destination protocol unreachable';
    IP_DEST_PORT_UNREACHABLE: Result:= 'Ping IP: destination port unreachable';
    IP_NO_RESOURCES:          Result:= 'Ping IP: no resources';
    IP_BAD_OPTION:            Result:= 'Ping IP: bad option';
    IP_HW_ERROR:              Result:= 'Ping IP: hardware error';
    IP_PACKET_TOO_BIG:        Result:= 'Ping IP: packet too big';
    IP_REQ_TIMED_OUT:        Result:= 'Ping IP: request timed out';
    IP_BAD_REQ:              Result:= 'Ping IP: bad request';
    IP_BAD_ROUTE:            Result:= 'Ping IP: bad route';
    IP_TTL_EXPIRED_TRANSIT:  Result:= 'Ping IP: ttl expired transit';
    IP_TTL_EXPIRED_REASSEM:  Result:= 'Ping IP: ttl expired reassem';
    IP_PARAM_PROBLEM:        Result:= 'Ping IP: parameter problem';
    IP_SOURCE_QUENCH:        Result:= 'Ping IP: source quench';
    IP_OPTION_TOO_BIG:        Result:= 'Ping IP: option too big';
    IP_BAD_DESTINATION:      Result:= 'Ping IP: bad destination';
    IP_ADDR_DELETED:          Result:= 'Ping IP: address deleted';
    IP_SPEC_MTU_CHANGE:      Result:= 'Ping IP: spec mtu change';
    IP_MTU_CHANGE:            Result:= 'Ping IP: mtu change';
    IP_UNLOAD:                Result:= 'Ping IP: unload';
    IP_ADDR_ADDED:            Result:= 'Ping IP: address added';
    IP_GENERAL_FAILURE:      Result:= 'Ping IP: general failure';
    IP_PENDING:              Result:= 'Ping IP: pending';
    INADDR_NONE:              Result:= 'Ping IP: bad IP format';
    SOCKET_ERROR:            Result:= 'Ping IP: can''t open port';
  else                        Result:= 'Unknown  status';
  end;
 
end;
 
function Ping(sAddr, sendData: string): Longint;
var
  hPort: HWND;
  dwAddr: Longint;
  ECHO: ICMP_ECHO_REPLY;
begin
  dwAddr:= inet_addr(sAddr);
  if dwAddr <> INADDR_NONE then
    begin
      hPort:= IcmpCreateFile();
      if hPort <> 0 then
        begin
          IcmpSendEcho(hPort, dwAddr, sendData, Length(sendData),
                      0, ECHO, SizeOf(ECHO), PING_TIMEOUT);
          IcmpCloseHandle(hPort);
 
          Result:= ECHO.status;
        end
        else Result:= SOCKET_ERROR;
    end
    else Result:= INADDR_NONE;
end;
 
procedure InitializeWizard();
var
  str: string;
  res: Longint;
begin
  res:= Ping('172.31.100.1', 'test');
  str:= GetPingResult(res);
  MsgBox(str, mbInformation, MB_OK);
end;

Но какой бы адрес ни вводила - всегда успешное выполнение.. странно..

Raf-9600 15-01-2013 02:56 2066959

Ктонить подскажет код, чтобы инсталлятор через 10 секунд после своего запуска, распаковал в temp и запустил определённый exe?

exe-шник из папки temp ведь сможет скачать из интернета пару килобайт инфы в оперативу?

Mailchik 15-01-2013 13:19 2067161

Raf-9600,
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: MyProg.exe; Flags: dontcopy;

[Code]
var
 ResultCode: integer;

procedure MyTimer(Sender: TObject); //Таймер, который сработает через 10 секунд
 begin
  ExtractTemporaryFile('MyProg.exe'); //Распаковываем нужный exe
  Exec(ExpandConstant('{tmp}\MyProg.exe'), '',
    ExpandConstant('{tmp}'), SW_SHOW, ewNoWait, ResultCode); //Запускаем exe
  TTimer(Sender).Enabled := False; //Вырубаем таймер
end;

procedure InitializeWizard;
 begin
  with TTimer.Create(nil) do begin //Создаём таймер
  Interval := 10000;
  Enabled := True;
  OnTimer := @MyTimer;
  end;
end;


Vstanka 18-01-2013 10:35 2069349

Не подскажете, как сделать, чтобы в секции Run была задержка выполнения команды? Т.е. у меня предлагается пользователю выбрать запуск сервера БД и запуск приложения, чтобы запуск приложения осуществлялся чуть позже или после запуска сервера. Флаг waituntilterminated не подходит, т.к. сервер должен оставаться запущенным.. И от пользователя тоже не нужно ждать никаких действий.

R.i.m.s.k.y. 18-01-2013 12:30 2069445

Vstanka, я бы вставил вызов пинга там где нужно подождать
Filename: "ping.EXE"; Parameters: " 127.0.0.1 -n 20"

Vstanka 18-01-2013 15:11 2069592

R.i.m.s.k.y., а как тогда скрыть флажок, предлагающий запуск приложения, т.к. если вставить так:

Код:

Filename: "ping.EXE"; Parameters: "127.0.0.1 -n 8"; Description: "Запустить приложение после запуска сервера"; Flags: waituntilterminated runhidden postinstall;
,то будет отображаться checkbox, а если убрать postinstall, то в начале вызывается задержка, а потом предлагается запуск приложения?

R.i.m.s.k.y. 18-01-2013 19:33 2069813

Vstanka,
вариант а) батник для вызова приложения, в котором первой строчкой ожидание, второй - запуск приложения
вариант б)
Код:

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
res : integer;
begin
  if CurStep=ssDone  then begin
    if ( WizardForm.RunList.Checked[WizardForm.RunList.Items.IndexOf('Запустить приложение')] ) then begin
      Exec('ping.exe, ' 127.0.0.1 -n 20',ExpandConstant('{sys}'),SW_hide,ewWaitUntilTerminated,res)
      Exec('твояпрога.ехе, 'параметры проги ',ExpandConstant('{app}\путь до проги'),SW_SHOW,ewNoWait,res);
    end;//if
  end;//CurStep=ssDone 
end; //procedure CurStepChanged(CurStep: TSetupStep);
end.

[Run]
Filename: "сервер.ехе"; Parameters: ""; Description: "Запустить сервер"; Flags: runhidden postinstall
Filename: "ping.EXE"; Parameters: ""; Description: "Запустить приложение"; Flags: runhidden


R.i.m.s.k.y. 18-01-2013 22:42 2069957

можно как-то определить что установщик собрался перегружать комп в конце установки не переопределяя Needrestart?

Johny777 19-01-2013 15:11 2070303

R.i.m.s.k.y., на этапе ssDone WizardForm.RunList уже не существует и соответственно будут ошибки, придётся работать только с переменными
Vstanka, предлагаю такой способ:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DirExistsWarning=no
DefaultDirName={pf}\My Program

[Components]
Name: server; Description: Install Server; Types: full custom;

[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

type
  RUNLIST_BOOL_COLLECTION = record
    Application: BOOL;
    Server: BOOL;
  end;
 
var
  Run: RUNLIST_BOOL_COLLECTION;

const
  QS_KEY                  = $0001;
  QS_MOUSEMOVE            = $0002;
  QS_MOUSEBUTTON          = $0004;
  QS_POSTMESSAGE          = $0008;
  QS_TIMER                = $0010;
  QS_PAINT                = $0020;
  QS_SENDMESSAGE          = $0040;
  QS_HOTKEY              = $0080;
  QS_MOUSE = (QS_MOUSEMOVE or QS_MOUSEBUTTON);
  QS_INPUT = (QS_MOUSE or QS_KEY);
  QS_ALLEVENTS = (QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or QS_HOTKEY);
  QS_ALLINPUT = (QS_INPUT or QS_POSTMESSAGE or QS_TIMER or QS_PAINT or QS_HOTKEY or QS_SENDMESSAGE);
  STATUS_TIMEOUT          = $00000102;
  WAIT_TIMEOUT = STATUS_TIMEOUT;

function MsgWaitForMultipleObjects(nCount: DWORD; var pHandles: THandle; fWaitAll: BOOL; dwMilliseconds, dwWakeMask: DWORD): DWORD; external 'MsgWaitForMultipleObjects@user32.dll stdcall';
function CreateEvent(lpEventAttributes: Longint; bManualReset, bInitialState: BOOL; lpName: PChar): THandle; external 'CreateEvent{#A}@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function StrFromTimeInterval(var pszOut: Char; cchMax: UINT; dwTimeMS: DWORD; digits: Byte): Integer; external 'StrFromTimeIntervalA@shlwapi.dll stdcall';

function TicksToTime(Ticks: DWORD): String;
var
    i: Byte;
    arr: array [0..31] of Char;
begin
    for i := 0 to StrFromTimeInterval(arr[0], sizeof(arr), Ticks, 8)-1 do Result := Result + arr[i];
end;

procedure Delay(dwMilliseconds: DWORD; hElapstedTimeInfo: HWND);
var
  dwTick: DWORD;
  hEvent: THandle;
begin
  hEvent := CreateEvent(0, False, False, '');
  try
    dwTick := GetTickCount + dwMilliseconds;
    while (dwMilliseconds > 0) and (MsgWaitForMultipleObjects(1, hEvent, False, dwMilliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
    begin
      Application.ProcessMessages;
      dwMilliseconds := dwTick - GetTickCount;
      if hElapstedTimeInfo <> 0 then SetWindowText(hElapstedTimeInfo, 'запуск приложения через' + TicksToTime(dwMilliseconds));
    end;
  finally
    CloseHandle(hEvent);
  end;
end;



procedure RunListOnClickCheck(Sender: TObject);
begin
  with WizardForm.RunList do if (Items.IndexOf('запуск приложения') <> -1) and (Items.IndexOf('запуск сервера БД') <> -1) then
  begin
    ItemEnabled[Items.IndexOf('запуск приложения')] := Checked[Items.IndexOf('запуск сервера БД')];
    Refresh;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  ErrorCode: Integer;
  WaitingForm: TForm;
  StaticText: TNewStaticText;
begin
  if CurStep = ssDone then
  begin
    if Run.Server then Exec(ExpandConstant('{app}\server.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewNoWait, ErrorCode);
    if Run.Application then
    begin
      WaitingForm := TForm.Create(nil);
      with WaitingForm do
      begin
        ClientWidth := ScaleX(200);
        ClientHeight := ScaleY(50);
        Position := PoscreenCenter;
        BorderStyle := bsDialog;
        Caption := 'Waiting';
        StaticText := TNewStaticText.Create(WaitingForm)
        with StaticText do
        begin
          Parent := WaitingForm;
          SetBounds(ScaleX(10), ScaleY(20), ScaleX(180), ScaleY(20));
        end;
        Show;
        Delay(20000, StaticText.Handle);
      end;     
      WaitingForm.Free;
      Exec(ExpandConstant('{app}\hl.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewNoWait, ErrorCode);
    end;
  end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  if (CurPageID = wpFinished) then with WizardForm.RunList do
  begin
    if (Items.IndexOf('запуск приложения') <> -1) and (Items.IndexOf('запуск сервера БД') <> -1) then
    begin
      Run.Server := Checked[Items.IndexOf('запуск сервера БД')];
      Run.Application := ItemEnabled[Items.IndexOf('запуск приложения')] and Checked[Items.IndexOf('запуск приложения')];
      Items.Delete(Items.IndexOf('запуск сервера БД'));
      Items.Delete(Items.IndexOf('запуск приложения'));
      Result := True;
    end;
  end else Result := True;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if (CurPageID = wpFinished) and IsComponentSelected('server') then with WizardForm.RunList do
  begin
    AddCheckBox('запуск сервера БД', '', 0, True, True, False, False, nil);
    AddCheckBox('запуск приложения', '', 0, True, True, False, False, nil);
    WizardForm.RunList.OnClickCheck := @RunListOnClickCheck;
    Refresh;
    Visible := True;
  end;
end;



к тому же заметил аномалию: если вручную добавить айтемы в RunList и установить в них галки, то при разрушении WizardForm ошибки, что их нет, поэтому их нужно удалить до деинициализации

R.i.m.s.k.y. 19-01-2013 15:15 2070305

Цитата:

Цитата Johny777
на этапе ssDone WizardForm.RunList уже не существует и соответственно будут ошибки »

вообще-то это копипаста с моего заведомо рабочего кода
спецом проверил еще раз - работает

____________

Вопросик - чего при использовании bass.dll установщик падает с ошибкой в dsound.dll?
Код:

Имя сбойного модуля: dsound.dll, версия: 6.1.7600.16385, отметка времени 0x4a5bd9fd
Код исключения: 0xc0000005
Смещение ошибки: 0x00008d5f
Идентификатор сбойного процесса: 0xbc0
Время запуска сбойного приложения: 0x01cdf61ca4396b84
Путь сбойного приложения: r:\Temp\is-UK9B7.tmp\setup.tmp
Путь сбойного модуля: C:\Windows\system32\dsound.dll
Код отчета: e7c10c04-620f-11e2-b72e-d43a4e0c59f8


R.i.m.s.k.y. 19-01-2013 16:21 2070356

Цитата:

Цитата Johny777
к тому же заметил аномалию: если вручную добавить айтемы в RunList и установить в них галки, то при разрушении WizardForm ошибки, что их нет, поэтому их нужно удалить до деинициализации »

блин какие-то разные у нас инно, ничего подобного у меня нет
Пользуюсь инноультра какой-то лохматой версии, инно компилер 5.4.2.ее2(а), билд 110319

R.i.m.s.k.y. 19-01-2013 20:57 2070509

еще вопросил по bass.dll - какие форматы он умеет?
в описании чказано xm/mod, запускаю - тишина, хотя мр3 работает

insombia 20-01-2013 00:03 2070643

подскажите как правильно распаковывать файлы precomp'a,а то я запаковал а они не распаковываются через скрипт isdone,пишет не найдены файлы precomp

Mailchik 20-01-2013 01:27 2070703

Цитата:

Цитата R.i.m.s.k.y.
еще вопросил по bass.dll - какие форматы он умеет? »

WAV, AIFF, MP3, MP2, MP1, OGG, MOD, IT, XM, S3M.
Цитата:

Цитата R.i.m.s.k.y.
в описании чказано xm/mod, запускаю - тишина, хотя мр3 работает »

надо через другую функцию запускать.
вот пример накидал для xm: ссылка
Цитата:

Цитата insombia
подскажите как правильно распаковывать файлы precomp'a,а то я запаковал а они не распаковываются через скрипт isdone,пишет не найдены файлы precomp »

прекомп не пакует, он разжимает.. лучше его не использовать, пока не поймете для чего он.

insombia 20-01-2013 10:43 2070826

Mailchik а srep как распаковать?

R.i.m.s.k.y. 20-01-2013 10:50 2070831

Цитата:

Цитата insombia
а srep как распаковать »

srep.exe -d setup-1.rep setup-1.bin

Поставил на установщик скин через ISSkinEx.dll, но вот заковыка - самое начальное окно выбора языка установщика не "скинится".
Не сутба или есть способ?

Nikish X 20-01-2013 16:33 2071019

А как в модуле FreeArc сделать запрос второго диска?

neorom 20-01-2013 17:15 2071042

Как извлечь правельно скрипт из секциєю CODE(або только секцию CODE), с из исталяцийки ?

Mailchik 20-01-2013 17:30 2071053

Nikish X,
читать дальше »
Цитата:

function ShowChangeDiskWindow
Код:

function ShowChangeDiskWindow (Text, DefPath, SearchFile: string):boolean;
показывает диалог с запросом следующего диска и ожиданием появления в DefaultPath файла, указанного SearchFile. Свой текст запроса можно указать значением Text;
DefaultPath - должен обязательно указывать {src}, иначе работоспособность не гарантируется;
SearchFile - файл, который каждые 0,2 секунды ищется по указанному пути;
Существует возможность в запросе сменить путь на другой, и если там будет найден SearchFile, то все последующие {src} в функциях распаковки будут идентифицироваться как указанный в данном диалоге путь.
neorom, никак.
R.i.m.s.k.y., Ставь через простой ISSkin.dll. Пример как полностью заскинить окно выбора языка:
читать дальше »
Код:

#ifdef UNICODE
 #define A "W"
#else
 #define A "A"
#endif

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

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

[Files]
Source: ISSkin{#A}.dll; Flags: dontcopy;
Source: ISSkin.cjstyles; Flags: dontcopy;

[code]
var
 mySelectLanguageForm: TForm;
 mySelectLabel: TLabel;
 myLangCombo: TNewComboBox;
 myOKButton: TButton;
 myCancelButton: TButton;
 myIconBitmapImage: TBitmapImage;
 bCancel: Boolean;
 OldProc: Longint;

procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
 external 'LoadSkin@files:isskin{#A}.dll stdcall';
procedure UnloadSkin();
  external 'UnloadSkin@files:isskin{#A}.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
 external 'CallWindowProc{#A}@user32.dll stdcall delayload';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint;
 external 'SetWindowLong{#A}@user32.dll stdcall delayload';

function NewProc(h: hwnd; Msg, wParam, lParam: Longint): Longint;
begin
  if (Msg = $0112) then begin
    if (wParam = 61536) then begin
        myCancelButton.OnClick(myCancelButton);
        wParam := 0;
    end;
  end;
  Result := CallWindowProc(OldProc, h, Msg, wParam, lParam);
end;

procedure myOKButtonClick(Sender: TObject);
begin
  SelectLanguageForm.LangCombo.ItemIndex := myLangCombo.ItemIndex;
  mySelectLanguageForm.Close;
  SetWindowLong(mySelectLanguageForm.Handle, -4, OldProc);
end;

procedure myCancelButtonClick(Sender: TObject);
begin
  mySelectLanguageForm.Close;
  bCancel := True;
  SetWindowLong(mySelectLanguageForm.Handle, -4, OldProc);
end;

procedure mySelectLanguageFormP;
 begin
 with SelectLanguageForm do begin
  mySelectLanguageForm := TForm.Create(nil);
  with mySelectLanguageForm do begin
  ClientWidth := ScaleX(300);
  ClientHeight := ScaleY(125);
  BorderIcons := [biSystemMenu];
  BorderStyle := bsDialog;
  Caption := SelectLanguageForm.Caption;
  Position := poScreenCenter;
  end;
  mySelectLabel := TLabel.Create(mySelectLanguageForm);
  with mySelectLabel do begin
  Parent := mySelectLanguageForm;
  AutoSize := False;
  WordWrap := True;
  SetBounds(SelectLabel.Left, SelectLabel.Top,
    SelectLabel.Width, SelectLabel.Height);
  Caption := SelectLabel.Caption;
  end;
  myLangCombo := TNewComboBox.Create(mySelectLanguageForm);
  with myLangCombo do begin
  Parent := mySelectLanguageForm;
  SetBounds(LangCombo.Left, LangCombo.Top,
    LangCombo.Width, LangCombo.Height);
  Items := LangCombo.Items;
  Style := csDropDownList;
  Sorted := True;
  ItemIndex := LangCombo.ItemIndex;
  end;
  myOKButton := TButton.Create(mySelectLanguageForm);
  with myOKButton do begin
  Parent := mySelectLanguageForm;
  SetBounds(OKButton.Left, OKButton.Top,
    OKButton.Width, OKButton.Height);
  Caption := OKButton.Caption;
  OnClick := @myOKButtonClick;
  end;
  myCancelButton := TButton.Create(mySelectLanguageForm);
  with myCancelButton do begin
  Parent := mySelectLanguageForm;
  SetBounds(CancelButton.Left, CancelButton.Top,
    CancelButton.Width, CancelButton.Height);
  Caption := CancelButton.Caption;
  OnClick := @myCancelButtonClick;
  end;
  myIconBitmapImage := TBitmapImage.Create(mySelectLanguageForm);
  with myIconBitmapImage do begin
  Parent := mySelectLanguageForm;
  SetBounds(IconBitmapImage.Left, IconBitmapImage.Top,
    IconBitmapImage.Width, IconBitmapImage.Height);
  Bitmap := IconBitmapImage.Bitmap;
  end;
 end;
 OldProc := SetWindowLong(mySelectLanguageForm.Handle, -4, CallbackAddr('NewProc'));
 mySelectLanguageForm.ShowModal;
 mySelectLanguageForm.Free;
end;

function InitializeLanguageDialog(): Boolean;
begin
 ExtractTemporaryFile('ISSkin.cjstyles');
 LoadSkin(ExpandConstant('{tmp}\ISSkin.cjstyles'), '');
 mySelectLanguageFormP;
 Result := False;
end;

procedure DeinitializeSetup();
begin
 UnloadSkin();
end;

function InitializeSetup(): Boolean;
 begin
  if bCancel then
  Result := False else Result := True;
end;


alert30 20-01-2013 17:48 2071062

Цитата:

Цитата Mailchik
neorom, никак. »

Есть исключение, что какиие-нибудь программы, упакованными официальными инсталляторами (которые скачаны с оф. сайта Inno) иногда может распаковать со скриптом.

R.i.m.s.k.y. 20-01-2013 18:10 2071077

Цитата:

Цитата Mailchik
Пример как полностью заскинить окно выбора языка: »

---------------------------
Ошибка компиляции
---------------------------
Invalid prototype for 'InitializeLanguageDialog'

Цитата:

Цитата alert30
иногда может распаковать со скриптом. »

без пароля и шифрации
Секция кода только в виде bin файла

sergey3695 20-01-2013 18:41 2071099

Цитата:

Цитата R.i.m.s.k.y.
---------------------------
Ошибка компиляции
---------------------------
Invalid prototype for 'InitializeLanguageDialog' »

Поставь последнюю расширенную версию от китайцев.
Mailchik, по-моему проще было написать в mySelectLanguageForm.OnClose. чем изголятся и на крестик что-то ставить. ну хотя оно и так работать будет как надо.

neorom 20-01-2013 22:29 2071287

Возможно где-то єсть архив скриптов инсталашок для разних програм ?

Raf-9600 21-01-2013 10:38 2071512

А имя инсталлятора можно как-то вычислить? Мне его нужно передать как параметр для запуска одного файла...

Mailchik 21-01-2013 12:05 2071575

Raf-9600,
Код:

ExpandConstant('{srcexe}') - полный путь до инсталлятора
ExtractFileName(ExpandConstant('{srcexe}')) - имя инсталлятора


alert30 21-01-2013 14:12 2071676

neorom, шапка для чего или идите к богу по имени "Гугл", он все знает.

З.Ы. В соседней теме там тоже много плюшевых скриптов.

insombia 21-01-2013 18:36 2071849

блин не могу понять как среп распаковать,фриакр архивы распаковывает,а среп нет

elmariacci 23-01-2013 13:00 2073065

Доброго времени суток.Перерыл гору информации,но т.к. с программой только начал учиться работать - не все происходит быстро.
Суть проблеммы такова: в инсталяторе для одного из компонентов необходима проверка в реестре на наличие в системе Microsoft .NET Framewok 3.5 (именно 3.5, а не 4+) и библиотеки Dokan .При отсутствии их в системе должна быть установка пост-инсталлом оригинальными экзэшниками,тк Redistributable Package весят слишком много.А вот если в системе есть и то и другое,просто заканчивается сетап .Пробовал через секцию run с условием выбора компонента,но тогда в любом случае запускается instal.exe Fraimwork и Dokan.Буду премного благодарен,если кто поможет сварганить такой кусочек...

Johny777 23-01-2013 15:42 2073179

elmariacci,
Цитата:

Цитата elmariacci
необходима проверка в реестре на наличие в системе Microsoft .NET Framewok 3.5 (именно 3.5, а не 4+) »

касательно фреимворка: версия выше 3.5 содержит его в себе, поэтому имеются и соответствующие ключи для ... 3.5, 4.0 ...
можешь забить на "именно 3.5, а не 4+", те тебе нужно от 3.5 и выше
реализовал для фреиворка нужную тебе проверку, но я без понятия что такое Dokan.dll и где она должна лежать. Короче смотри пример. Думаю дальше сам разберёшься

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: comp; Description: I Need Net3.5; Types: full custom;

[Run]
Filename: {app}\dotNetFx35setup.exe; Parameters: /q /norestart; Description: Install Net v3.9; Flags: waituntilterminated; Check: NeedInstall('Net3.5');
Filename: {app}\Dokan.exe; Parameters: ; Description: Install Dokan.dll; Flags: waituntilterminated; Check: NeedInstall('Dokan.dll');

[code]
function NeedInstall(const InputParam: String): boolean;
begin
  case InputParam of
    'Net3.5': Result := IsComponentSelected('comp') and not RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Microsoft\NET Framework Setup\NDP\v3.5');
    'Dokan.dll': Result := not FileExists(ExpandConstant('{app}\Dokan.dll'));
  end;
end;



==================================================================================================== =

insombia, извиняй, срепов не знаю, помочь не могу

Mailchik 23-01-2013 22:25 2073560

insombia, в ISDone ведь наглядный пример даётся, что не понятного?
Код:

if not ISSRepExtract  ( 0, 0, ExpandConstant('{src}\data.srep') {расположение архива который нужно распаковать}, ExpandConstant('{app}\data1024.arc') {Путь распаковки}, true) then break;

audiofeel 24-01-2013 18:56 2074174

Здравствуйте, можно ли сделать маленькое окошко "DirEdit" прозрачным и чтобы пользователь смог сменить папку установки только нажав на кнопку "изменить" - то есть строчку о конечной папки не редактируемой

Mailchik 24-01-2013 19:31 2074194

audiofeel,
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
procedure InitializeWizard;
 begin
  with WizardForm.DirEdit do begin
  BorderStyle := bsNone;
  AutoSelect := False;
  ReadOnly := True;
  Color := clBtnFace;
  end;
end;


audiofeel 24-01-2013 21:09 2074249

Mailchik, все получилось, но я так понял что на "прозрачность" мне надеется не стоит = белый фон остался. Млин и "transparent" выдает ошибку = оставить что ли как есть, как вы думаете или есть другой способ

Johny777 25-01-2013 15:31 2074787

audiofeel, предлагаю так:



читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
OutputDir=.

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  MAX_PATH = 260;
  MAX_PATH_LEN = 55;

var
  PathLabel: TLabel;

function PathCompactPathEx(pszOut: String; pszSrc: String; cchMax: UINT; dwFlags: DWORD): BOOL; external 'PathCompactPathEx{#A}@shlwapi.dll stdcall';

function ShortPath(Input: String; Length: Integer): String;
begin
  Result := StringOfChar(#32, MAX_PATH);
  PathCompactPathEx(Result, Input, Length, 0);
end;

procedure DirEditOnChange(Sender: TObject);
begin
  PathLabel.Caption := ShortPath('Install Path:' + #32 + TEdit(Sender).Text, MAX_PATH_LEN);
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    PathLabel := TLabel.Create(WizardForm)
    with PathLabel do
    begin
      Parent := DirEdit.Parent;
      Caption := ShortPath('Install Path:' + #32 + DirEdit.Text, MAX_PATH_LEN);
      Transparent := True;
      Font.Size := 10;
      Left := DirEdit.Left;
      Top := DirEdit.Top + Round((DirEdit.Height - Height) div 2);
    end;
    DirEdit.OnChange := @DirEditOnChange;
    DirEdit.Hide;
  end;
end;



только значение константы MAX_PATH_LEN настрой при необходимости

audiofeel 25-01-2013 20:07 2074967

Johny777, Всё ОК. когда компилируешь - но стоит объединить с "моим скриптом" = результат DirEdit отображается на первой странице по верх моих каракуль, а мой не прозрачный как был так и есть на своем месте. P.S. по моему хватит, заброшу я его или сделаю на "адвансед инсталлер 9.8"

Johny777 26-01-2013 13:39 2075402

audiofeel, дай исходник с файлами, посмотрю что не так
Цитата:

Цитата audiofeel
заброшу я его или сделаю на "адвансед инсталлер 9.8" »

не советую менять инно на всякую фигню
инно - это тот же объект-паскаль/делфи - то бишь язык программирования, хотя и нехило урезанный. Думаю о проистекающих отсюда возможностях нетрудно догадаться (сейчас те кто знают СИ и ассемблер посмеются). Переломайся, изучи и не пожалеешь!
вот тебе демо возможностей (далеко не всех):
1. http://sendfile.su/748778
2: http://sendfile.su/748248
скачай, положи обе программы рядом, поиграйся и садись снова за инно. Будут проблемы спрашивай - чем смогу помогу

R.i.m.s.k.y. 26-01-2013 14:02 2075416

Johny777, второй не качаиццо

Johny777 26-01-2013 14:11 2075423

R.i.m.s.k.y.,
1. у меня всё качается (только-что скачал для проверки) - у тебя что-то с нетом
2. Там нет ничего, что ты не видел :grin: (те инсталл халфы - относительно старая версия)

audiofeel 27-01-2013 02:48 2075859

Johny777, что именно и куда заливать удобнее (цель та ведь моя смешная, может даже глупая - повторить максимально установщик "installshield"

Johny777 27-01-2013 03:16 2075866

audiofeel, лей на http://sendfile.su/ или на http://narod.yandex.ru/
Цитата:

Цитата audiofeel
цель та ведь моя смешная, может даже глупая - повторить максимально установщик "installshield" »

типа того есть после установки Inno Ultra в ...\Inno Setup 5\Examples\MUI_InstallShield\MUI_InstallShield.iss

alert30 27-01-2013 08:19 2075902

Цитата:

Цитата Johny777
audiofeel, лей на http://sendfile.su/ или на http://narod.yandex.ru/ »

Можно еще и http://f-bit.ru там правда прогрессбар закачек нет, но файл вечно хранятся.

insombia 27-01-2013 21:03 2076355

а можно как-то сделать чтобы файлу у которого нету иконки через скрипт его добавить когда игра будет устаноновлена?

Mailchik 28-01-2013 10:35 2076678

insombia, вопрос отлично сформулирован.
насколько понятно, вот что вы хотите:
Код:

[Icons]
Name: {commondesktop}\My Application; Filename: {app}\MyApplication.exe; WorkingDir: {app}\; IconFilename: {app}\MyApplication.exe;


kodzoyev 28-01-2013 17:07 2076996

Доброго времени суток. Требуются два скрипта к Inno Setup:
  • Пример скрипта, предназначенного для остановки (с выводом окна которое рекомендует пользователю закрыть браузер, плюс кнопки "ОК" и "Отмена") процесса установки в том случае если запущен браузер интернет. Аналогично установкам таких приложений как Adobe Flash или Unity 3D;
  • Пример скрипта добавления записи (любой) в реестр.
Спасибо.

Nikish X 29-01-2013 11:25 2077486

Кто-нибудь знает скрипт для этого инстала?

alert30 29-01-2013 13:18 2077584

Nikish X, вот этот "скрипт" (на картинках) и спроси к RG UniGamers.

by_gangster 29-01-2013 13:50 2077624

Здравствуйте, помогите пожалуйста, писал свой вопрос здесь

LordSP 29-01-2013 14:34 2077677

The answer is found

Nikish X 29-01-2013 15:14 2077718

alert30, они мне не скажут. :)

LordSP, установи Unicode, ANSI не подерживает большинство функций.

LordSP 29-01-2013 16:37 2077785

Да и на Unicode не работает большинство скриптов, не так давно было такое: У меня все нормально запускалось на Win 7 x64 а у знакомого при старте установки на его Win 7 x86 выдавала app crash, перекомпилировал ANSI, все заработало.

Dark_Delphin 30-01-2013 01:26 2078208

Всем привет.

Подскажите, пожалуйста, скрипт, чтобы вывести кнопку Дополнительно и при нажатии на неё выводятся дполнительные комопненты.

Заранее благодарен.

Johny777 31-01-2013 03:55 2079023

Dark_Delphin, Держи раннюю версию моего кода установки Халфы 1 и её офф. аддонов и офф. модов для изучения:
скрин:

код:
читать дальше »
Код:

[Setup]
SourceDir=.
OutputDir=final
AppName=GoldSource
AppVerName=GoldSource
AppVersion=GoldSource
AppPublisher=VALVE
AppCopyright=VALVE
DefaultDirName={pf}\steamapps
DefaultGroupName=GoldSource
AllowNoIcons=yes
WizardImageFile=WizardImage.bmp
WizardSmallImageFile=WizardSmallImage.bmp
OutputBaseFilename=Setup
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=none
;lzma2/ultra64
LZMAUseSeparateProcess=yes
LZMAMatchFinder=BT
LZMANumFastBytes=273
LZMADictionarySize=262144
///LZMADictionarySize=131072
InternalCompressLevel=ultra64
DiskSpanning=true
DiskSliceSize=960495616
SlicesPerDisk=1
UninstallFilesDir={app}\Uninstall


[Components]
Name: hl1; Description: Half-Life; Flags: dontinheritcheck disablenouninstallwarning
Name: hl1\en; Description: английская озвучка; Flags: exclusive disablenouninstallwarning
Name: hl1\ru; Description: русская озвучка; Flags: exclusive disablenouninstallwarning
Name: bs; Description: Half-Life Blue Shift; Flags: dontinheritcheck disablenouninstallwarning
Name: bs\en; Description: английская озвучка; Flags: exclusive disablenouninstallwarning
Name: bs\ru; Description: русская озвучка; Flags: exclusive disablenouninstallwarning
Name: of; Description: Half-Life Opposing Force; Flags: dontinheritcheck disablenouninstallwarning
Name: of\en; Description: английская озвучка; Flags: exclusive disablenouninstallwarning
Name: of\ru; Description: русская озвучка; Flags: exclusive disablenouninstallwarning
Name: dc; Description: Half-Life Decay; Flags: dontinheritcheck disablenouninstallwarning
Name: dc\en; Description: английская озвучка; Flags: exclusive disablenouninstallwarning
Name: dc\ru; Description: русская озвучка; Flags: exclusive disablenouninstallwarning
Name: cs; Description: Counter Strike; Flags: dontinheritcheck disablenouninstallwarning
Name: ds; Description: Counter Strike Condition Zero Deleted Scenes; Flags: dontinheritcheck disablenouninstallwarning
Name: ds\en; Description: английская озвучка; Flags: exclusive disablenouninstallwarning
Name: ds\ru; Description: английская озвучка + русский интерфейс; Flags: exclusive disablenouninstallwarning


[Icons]
Name: {group}\Half-Life; Filename: {app}\common\half-life\Half-Life.exe; WorkingDir: {app}\common\half-life; Check: CreateIcon('Half-Life', 'Start');
Name: {userdesktop}\Half-Life; Filename: {app}\common\half-life\Half-Life.exe; WorkingDir: {app}\common\half-life; Check: CreateIcon('Half-Life', 'Desktop');
Name: {group}\Half-Life Blue Shift; Filename: {app}\common\half-life blue shift\Half-Life Blue Shift_unlocked.exe; WorkingDir: {app}\common\half-life blue shift; Check: CreateIcon('Half-Life Blue Shift', 'Start');
Name: {userdesktop}\Half-Life Blue Shift; Filename: {app}\common\half-life blue shift\Half-Life Blue Shift_unlocked.exe; WorkingDir: {app}\common\half-life blue shift; Check: CreateIcon('Half-Life Blue Shift', 'Desktop');
Name: {group}\Half-Life Opposing Force; Filename: {app}\common\half-life opposing force\Half-Life Opposing Force.exe; WorkingDir: {app}\common\half-life opposing force; Check: CreateIcon('Half-Life Opposing Force', 'Start');
Name: {userdesktop}\Half-Life Opposing Force; Filename: {app}\common\half-life opposing force\Half-Life Opposing Force.exe; WorkingDir: {app}\common\half-life opposing force; Check: CreateIcon('Half-Life Opposing Force', 'Desktop');
Name: {group}\Half-Life Decay; Filename: {app}\common\half-life decay\Half-Life Decay.exe; WorkingDir: {app}\common\half-life decay; Check: CreateIcon('Half-Life Decay', 'Start');
Name: {userdesktop}\Half-Life Decay; Filename: {app}\common\half-life decay\Half-Life Decay.exe; WorkingDir: {app}\common\half-life decay; Check: CreateIcon('Half-Life Decay', 'Desktop');
Name: {group}\Counter Strike; Filename: {app}\common\counter strike\Counter Strike.exe; WorkingDir: {app}\common\counter strike; Check: CreateIcon('Counter Strike', 'Start');
Name: {userdesktop}\Counter Strike; Filename: {app}\common\counter strike\Counter Strike.exe; WorkingDir: {app}\common\counter strike; Check: CreateIcon('Counter Strike', 'Desktop');
Name: {group}\Counter Strike Condition Zero Deleted Scenes; Filename: {app}\common\counter strike condition zero deleted scenes\Counter Strike Condition Zero Deleted Scenes.exe; WorkingDir: {app}\common\counter strike condition zero deleted scenes; Check: CreateIcon('Counter Strike Condition Zero Deleted Scenes', 'Start');
Name: {userdesktop}\Counter Strike Condition Zero Deleted Scenes; Filename: {app}\common\counter strike condition zero deleted scenes\Counter Strike Condition Zero Deleted Scenes.exe; WorkingDir: {app}\common\counter strike condition zero deleted scenes; Check: CreateIcon('Counter Strike Condition Zero Deleted Scenes', 'Desktop');
Name: {group}\{cm:UninstallProgram,GoldSource}; Filename: {uninstallexe}


[Run]
Description: {cm:LaunchProgram, Half-Life}; Filename: {app}\common\half-life\Half-Life.exe; WorkingDir: {app}\common\half-life; Flags: nowait postinstall skipifsilent unchecked; Components: hl1
Description: {cm:LaunchProgram, Half-Life Blue Shift}; Filename: {app}\common\half-life blue shift\Half-Life Blue Shift_unlocked.exe; WorkingDir: {app}\common\half-life blue shift; Flags: nowait postinstall skipifsilent unchecked; Components: bs
Description: {cm:LaunchProgram, Half-Life Opposing Force}; Filename: {app}\common\half-life opposing force\Half-Life Opposing Force.exe; WorkingDir: {app}\common\half-life opposing force; Flags: nowait postinstall skipifsilent unchecked; Components: of
Description: {cm:LaunchProgram, Half-Life Decay}; Filename: {app}\common\half-life decay\Half-Life Decay.exe; WorkingDir: {app}\common\half-life decay; Flags: nowait postinstall skipifsilent unchecked; Components: dc
Description: {cm:LaunchProgram, Counter Strike}; Filename: {app}\common\counter strike\Counter Strike.exe; WorkingDir: {app}\common\counter strike; Flags: nowait postinstall skipifsilent unchecked; Components: cs
Description: {cm:LaunchProgram, Counter Strike Condition Zero Deleted Scenes}; Filename: {app}\common\counter strike condition zero deleted scenes\Counter Strike Condition Zero Deleted Scenes.exe; WorkingDir: {app}\common\counter strike condition zero deleted scenes; Flags: nowait postinstall skipifsilent unchecked; Components: ds


[UninstallDelete]
Type: files; Name: {app}


[  code]
var
  AddCompCcheckListBox: TNewCheckListBox;
  IconComboBox, TypeComboBox: TComboBox;
  Selected: BOOL;
   

function CreateIcon(const GameName, Folder: String): boolean;
var
  i: Integer;
begin
  with AddCompCcheckListBox do
  begin
    Result := Checked[Items.IndexOf(GameName)] and ItemEnabled[Items.IndexOf(GameName)];
    if Result then
    case Folder of
      'Desktop': Result := Checked[Items.IndexOf(GameName)+1];
      'Start': Result := Checked[Items.IndexOf(GameName)+2];
    end;
  end;
end;


procedure AddButtonOnClick(Sender: TObject);
var
  uBOOL: BOOL;
  i: Integer;
begin
  case TButton(Sender).Caption of
    'Значки':
    begin
      uBOOL := False;
      TButton(Sender).Caption := 'Скрыть';
    end;
    'Скрыть':
    begin
      uBOOL := True;
      TButton(Sender).Caption := 'Значки';
    end;
  end;
  TypeComboBox.Visible := uBOOL;
  IconComboBox.Visible := not uBOOL;
  WizardForm.ComponentsList.Visible := uBOOL;
  if uBOOL then WizardForm.ComponentsList.SetFocus;
  AddCompCcheckListBox.Visible := not uBOOL;
  if not uBOOL then with AddCompCcheckListBox do
  begin
    if WizardSelectedComponents(False) <> '' then
    for i := Items.IndexOf('Half-Life') to Items.IndexOf('Counter Strike Condition Zero Deleted Scenes') do
    begin
      if WizardForm.ComponentsList.Items.IndexOf(Items.Strings[i]) <> -1 then
      begin
        ItemEnabled[i] := WizardForm.ComponentsList.Checked[WizardForm.ComponentsList.Items.IndexOf(Items.Strings[i])];
        ItemEnabled[i+1] := WizardForm.ComponentsList.Checked[WizardForm.ComponentsList.Items.IndexOf(Items.Strings[i])];
        ItemEnabled[i+2] := WizardForm.ComponentsList.Checked[WizardForm.ComponentsList.Items.IndexOf(Items.Strings[i])];
      end;
    end
    else for i := Items.IndexOf('Создать значки для:') to Items.IndexOf('Counter Strike Condition Zero Deleted Scenes') do ItemEnabled[i] := False;
    SetFocus;
  end;
end;


procedure ComboBoxesOnClick(Sender: TObject);
var
  i: Integer;
begin
  case TComboBox(Sender) of
    IconComboBox:
    case TComboBox(Sender).Text of
      'Выбрать всё': for i := 0 to AddCompCcheckListBox.Items.Count-1 do AddCompCcheckListBox.Checked[i] := True;
      'Очистить выбор': for i := 0 to AddCompCcheckListBox.Items.Count-1 do AddCompCcheckListBox.Checked[i] := False;
    end;
    TypeComboBox: with WizardForm.ComponentsList do
    case TComboBox(Sender).Text of
      'Выбрать всё': for i := 0 to Items.Count-1 do Checked[i] := True;
      'Только игры серии Half-Life': for i := 0 to Items.Count-1 do Checked[i] := (Items.Strings[i] = 'Half-Life') or (Items.Strings[i] = 'Half-Life Opposing Force') or (Items.Strings[i] = 'Half-Life Blue Shift') or (Items.Strings[i] = 'Half-Life Decay');
      'Только игры серии Counter Strike': for i := 0 to Items.Count-1 do Checked[i] := (Items.Strings[i] = 'Counter Strike') or (Items.Strings[i] = 'Counter Strike Condition Zero Deleted Scenes');
      'Всё на русском': for i := 0 to Items.Count-1 do Checked[i] := (Items.Strings[i] = 'русская озвучка') or (Items.Strings[i] = 'английская озвучка + русский интерфейс');
      'Всё на английском':
      begin
        for i := 0 to Items.Count-1 do Checked[i] := (Items.Strings[i] = 'английская озвучка');
        Checked[Items.IndexOf('Counter Strike')];
      end;
      'Очистить выбор': for i := 0 to Items.Count-1 do Checked[i] := False;
    end;
  end;
end;                 


procedure InitializeWizard();
begin
  with WizardForm do
  begin
    with TNewButton.Create(WizardForm) do
    begin
      Parent := WizardForm.SelectComponentsPage;
      Caption := 'Значки';
      SetBounds(ScaleX(ComponentsList.Left + ComponentsList.Width - 80), ScaleY(ComponentsList.Top + ComponentsList.Height + 7), ScaleX(80), ScaleY(23));
      OnClick := @AddButtonOnClick;
    end;
    AddCompCcheckListBox := TNewCheckListBox.Create(WizardForm)
    with AddCompCcheckListBox do
    begin
      Parent := ComponentsList.Parent;
      SetBounds(ComponentsList.Left, ComponentsList.Top, ComponentsList.Width, ComponentsList.Height);
      AddCheckBox('Создать значки для:', '', 0, True, (WizardSelectedComponents(False) <> ''), False, False, nil);
        AddCheckBox('Half-Life', '', 1, True, ComponentsList.Checked[ComponentsList.Items.IndexOf('Half-Life')], False, True, nil);
          AddCheckBox('на "Рабочем Столе"', '', 2, True, ItemEnabled[Items.IndexOf('Half-Life')], False, True, nil);
          AddCheckBox('в меню "Пуск"', '', 2, True, ItemEnabled[Items.IndexOf('Half-Life')], False, True, nil);
        AddCheckBox('Half-Life Blue Shift', '', 1, True, ComponentsList.Checked[ComponentsList.Items.IndexOf('Half-Life Blue Shift')], False, True, nil);
          AddCheckBox('на "Рабочем Столе"', '', 2, True, ItemEnabled[Items.IndexOf('Half-Life Blue Shift')], False, True, nil);
          AddCheckBox('в меню "Пуск"', '', 2, True, ItemEnabled[Items.IndexOf('Half-Life Blue Shift')], False, True, nil);
        AddCheckBox('Half-Life Opposing Force', '', 1, True, ComponentsList.Checked[ComponentsList.Items.IndexOf('Half-Life Opposing Force')], False, True, nil);
          AddCheckBox('на "Рабочем Столе"', '', 2, True, ItemEnabled[Items.IndexOf('Half-Life Opposing Force')], False, True, nil);
          AddCheckBox('в меню "Пуск"', '', 2, True, ItemEnabled[Items.IndexOf('Half-Life Opposing Force')], False, True, nil);
        AddCheckBox('Half-Life Decay', '', 1, True, ComponentsList.Checked[ComponentsList.Items.IndexOf('Half-Life Decay')], False, True, nil);
          AddCheckBox('на "Рабочем Столе"', '', 2, True, ItemEnabled[Items.IndexOf('Half-Life Decay')], False, True, nil);
          AddCheckBox('в меню "Пуск"', '', 2, True, ItemEnabled[Items.IndexOf('Half-Life Decay')], False, True, nil);
        AddCheckBox('Counter Strike', '', 1, True, ComponentsList.Checked[ComponentsList.Items.IndexOf('Counter Strike')], False, True, nil);
          AddCheckBox('на "Рабочем Столе"', '', 2, True, ItemEnabled[Items.IndexOf('Counter Strike')], False, True, nil);
          AddCheckBox('в меню "Пуск"', '', 2, True, ItemEnabled[Items.IndexOf('Counter Strike')], False, True, nil);
        AddCheckBox('Counter Strike Condition Zero Deleted Scenes', '', 1, True, ComponentsList.Checked[ComponentsList.Items.IndexOf('Counter Strike Condition Zero Deleted Scenes')], False, True, nil);
          AddCheckBox('на "Рабочем Столе"', '', 2, True, ItemEnabled[Items.IndexOf('Counter Strike Condition Zero Deleted Scenes')], False, True, nil);
          AddCheckBox('в меню "Пуск"', '', 2, True, ItemEnabled[Items.IndexOf('Counter Strike Condition Zero Deleted Scenes')], False, True, nil);
      Visible := False; 
    end;
    IconComboBox := TComboBox.Create(WizardForm)
    with IconComboBox do
    begin
      Parent := TypesCombo.Parent;
      SetBounds(TypesCombo.Left, TypesCombo.Top, TypesCombo.Width, TypesCombo.Height);
      Items.Add('Выбрать всё');
      Items.Add('Очистить выбор');
      Style := csDropDownList;
      ItemIndex := 0;
      OnClick := @ComboBoxesOnClick;
    end;
    TypeComboBox := TComboBox.Create(WizardForm)
    with TypeComboBox do
    begin
      Parent := TypesCombo.Parent;
      SetBounds(TypesCombo.Left, TypesCombo.Top, TypesCombo.Width, TypesCombo.Height);
      Items.Add('Выбрать всё');
      Items.Add('Только игры серии Half-Life');
      Items.Add('Только игры серии Counter Strike');
      Items.Add('Всё на русском');
      Items.Add('Всё на английском');
      Items.Add('Очистить выбор');
      Style := csDropDownList;
      ItemIndex := -1;
      OnClick := @ComboBoxesOnClick;
    end;
    TypesCombo.Hide;
  end;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
begin
  if CurPageID = wpSelectComponents then
  begin
    Result := WizardSelectedComponents(False) <> '';
    if not Result then Result := Selected;
    if not Result then
    begin
      Result := MsgBox('Не выбрано ни одного компонента для установки. Так и должно быть?', mbConfirmation, MB_YESNO) = IDYES;
      Selected := Result;
    end;
  end else Result := True;
end;


procedure RadioRunListOnClick(Sender: TObject);
var
  i: Integer;
begin
  for i := 1 to TNewCheckListBox(Sender).Items.Count-1 do WizardForm.RunList.Checked[i-1] := TNewCheckListBox(Sender).Checked[i];
end;


procedure CurPageChanged(CurPageID: Integer);
var
  i: Integer;
begin
  if CurPageID = wpFinished then with WizardForm do if RunList.Items.Count <> 0 then
  begin
    with TNewCheckListBox.Create(WizardForm) do
    begin
      Parent := RunList.Parent;
      SetBounds(RunList.Left, RunList.Top, RunList.Width, RunList.Height);
      AddRadioButton('Ничего не запускать', '', 0, True, True, nil);
      for i := 0 to RunList.Items.Count-1 do
      begin
        AddRadioButton(RunList.Items.Strings[i], '', 0, False, True, nil);
        RunList.Checked[i] := False;
      end;
      OnClickCheck := @RadioRunListOnClick;
    end;
    RunList.Visible := False;
  end;
end;


Johny777 31-01-2013 06:29 2079031

в предыдущее сообщение не поместилось :), поэтому вот второе:
kodzoyev,
Цитата:

Цитата kodzoyev
окна которое рекомендует пользователю закрыть браузер »

Реализовал таки(пришлось напрячься :grin:):
принцип такой:
имеем тип-запись:
Код:

    BROWSER_ERROR_STRUCT = record
        ProcsToTerminate: array of String;
        ErrorForm: TForm;
    end;

именно этот тип и возвращает функция прототипа: function CreateBrowserError(const BrowserAraay, BrowserProcNames: array of String): BROWSER_ERROR_STRUCT;
где входные параметры - два динамичных массива записей:
первый содержит запись А = имя браузера
второй содержит запись А = имя процесса или путь к папке экзешника (спасибо ещё раз El Sanchez-у) выше упомянутого браузера
вот такие "пары" мы и отправляем
в функции CreateBrowserError() в цикле пробегаем по входным массивам и проверяем наличие процесса(ов) попутно, если какой-то процесс запущен заполняя два локальных массива
если массивы не пусты то в BROWSER_ERROR_STRUCT.ErrorForm создаём форму с именами работающих бразеров и кнопками
BROWSER_ERROR_STRUCT.ProcsToTerminate присваиваем массив с именами процессов оных!
полученную формы показываем модально и если в переменную ShowModal запишется mrYes из кнопки "да", то отправляем наш массив процессов BROWSER_ERROR_STRUCT.ProcsToTerminate в
function TerminateManyApps(const AppProcArray: array of String): BOOL; которая в цикле завершает процессы/закрывает окна.
Внимание: Функция TerminateManyApps возвращает булев значение короое формируется из булев значений локального массива, в каждый элемент которого пишется - завершился или не завершился тот или иной процесс. Те если из 3-х папущенных процессов не завершится 1 (очень мало вероятно ;)) то функция вернёт False!

Пользуйтесь кому надо! Буду рад!
код:
читать дальше »
Код:

[Setup]
SourceDir=.
OutputDir=final
AppName=GoldSource
AppVerName=GoldSource
AppVersion=GoldSource
AppPublisher=VALVE
AppCopyright=VALVE
DefaultDirName={pf}\steamapps
DefaultGroupName=GoldSource
AllowNoIcons=yes
WizardImageFile=WizardImage.bmp
WizardSmallImageFile=WizardSmallImage.bmp
OutputBaseFilename=Setup
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=none
;lzma2/ultra64
LZMAUseSeparateProcess=yes
LZMAMatchFinder=BT
LZMANumFastBytes=273
LZMADictionarySize=262144
///LZMADictionarySize=131072
InternalCompressLevel=ultra64
DiskSpanning=true
DiskSliceSize=960495616
SlicesPerDisk=1
UninstallFilesDir={app}\Uninstall




[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
    PROCESS_TERMINATE = $1;
    PROCESS_CREATE_THREAD = $2;
    PROCESS_VM_OPERATION = $8;
    PROCESS_VM_WRITE = $20;
    PROCESS_QUERY_INFORMATION = $400;
    SYNCHRONIZE = $100000;
    MEM_COMMIT = $1000;
    MEM_RESERVE = $2000;
    PAGE_EXECUTE_READWRITE = $40;
    TOKEN_QUERY = $8;
    TOKEN_ADJUST_PRIVILEGES = $20;
    SE_PRIVILEGE_ENABLED = $2;
    MAX_PATH = 260;
    TA_FAILED = 0;
    TA_SUCCESS_CLEAN = 1;
    TA_SUCCESS_KILL = 2;
    WM_CLOSE = $10;
    WAIT_OBJECT_0 = $0;
    WAIT_TIMEOUT = $102;

type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of char;
    end;
   
    BROWSER_ERROR_STRUCT = record
        ProcsToTerminate: array of String;
        ErrorForm: TForm;
    end;
   
    _LUID = record
        LowPart: DWORD;
        HighPart: Longint;
    end;

    _LUID_AND_ATTRIBUTES = record
        Luid: _LUID;
        Attributes: DWORD;
    end;

    _TOKEN_PRIVILEGES = record
        PrivilegeCount: DWORD;
        Privileges: array [0..0] of _LUID_AND_ATTRIBUTES;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
#ifdef UNICODE
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall';
#else
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
#endif
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall';
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function GetModuleHandle(lpModuleName: String): THandle; external 'GetModuleHandle{#A}@kernel32.dll stdcall';
function GetProcAddress(hModule: THandle; lpProcName: String): Longint; external 'GetProcAddress@kernel32.dll stdcall';
function CreateRemoteThread(hProcess: THandle; lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle; external 'CreateRemoteThread@kernel32.dll stdcall';
function GetCurrentThread(): THandle; external 'GetCurrentThread@kernel32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function OpenProcessToken(ProcessHandle: THandle; DesiredAccess: DWORD; var TokenHandle: THandle): BOOL; external 'OpenProcessToken@advapi32.dll stdcall';
function TerminateProcess(hProcess: THandle; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: THandle; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function LookupPrivilegeValue(lpSystemName, lpName: String; var lpLuid: _LUID): BOOL; external 'LookupPrivilegeValue{#A}@advapi32.dll stdcall';
function AdjustTokenPrivileges(TokenHandle: THandle; DisableAllPrivileges: BOOL; NewState: _TOKEN_PRIVILEGES; BufferLength: DWORD; var PreviousState: _TOKEN_PRIVILEGES; var ReturnLength: Longint): BOOL; external 'AdjustTokenPrivileges@advapi32.dll stdcall';
function VirtualAllocEx(hProcess: THandle; lpAddress, dwSize: Longint; flAllocationType, flProtect: DWORD): Longint; external 'VirtualAllocEx@kernel32.dll stdcall';
function WriteProcessMemory(hProcess: THandle; lpBaseAddress, lpBuffer, nSize: Longint; var lpNumberOfBytesWritten: Longint): BOOL; external 'WriteProcessMemory@kernel32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function GetWindowThreadProcessId(hWnd: HWND; var lpdwProcessId: DWORD): DWORD; external 'GetWindowThreadProcessId@user32.dll stdcall';


function IsProcessRunning(const FileName: String): Boolean; //FileName - имя exe-файла процесса
var
    hProcessSnap: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile: String;
begin
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    pe32.dwSize := sizeof(pe32);
    if not Process32First(hProcessSnap, pe32) then Exit;
    while not Result and Process32Next(hProcessSnap, pe32) do
    begin
        szExeFile := '';
        while not (pe32.szExeFile[Length(szExeFile)] = #0) do szExeFile := szExeFile + pe32.szExeFile[Length(szExeFile)];
        Result := LowerCase(FileName) = LowerCase(szExeFile);
    end;
    CloseHandle(hProcessSnap);
end;

/////////////////////////////////////////////////////////
function CharArrayToString(aChar: array of Char): String;
begin
    Result := '';
    while aChar[Length(Result)] <> #0 do Insert(aChar[Length(Result)], Result, Length(Result)+1);
end;

////////////////////////////////////////////////////////////
function EnumWindowsProc(hwnd: HWND; lParam: Longint): BOOL;
var
    dwID: DWORD;
begin
    GetWindowThreadProcessId(hwnd, dwID);
    if dwID = lParam then PostMessage(hwnd, WM_CLOSE, 0, 0);
    Result := True;
end;

////////////////////////////////////////////////////////////////////////
function TerminateApp(const szProcess: String; dwTimeout: DWORD): DWORD;
var
    hProcessSnap, hProc, hToken, hThread, lpProcName: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile: array [0..MAX_PATH-1] of Char;
    ptrProc: Longint;
    tkp: _TOKEN_PRIVILEGES;
    SeDebugNameValue: _LUID;
    lpMemory, ret: Longint;
    lpThreadId: DWORD;
begin
    ptrProc := CallbackAddr('EnumWindowsProc');
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    try
        pe32.dwSize := SizeOf(pe32);
        if not Process32First(hProcessSnap, pe32) then Exit;
        while Process32Next(hProcessSnap, pe32) do
        begin
            if CompareText(CharArrayToString(pe32.szExeFile), ExtractFileName(szProcess)) <> 0 then Continue;
            // try open process
            hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
            if hProc = TA_FAILED then
            begin
                // open process token adjust privileges
                if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then Exit;
                if not LookupPrivilegeValue('', 'SeDebugPrivilege', SeDebugNameValue) then Exit;
                try
                    // fill token privileges struct
                    tkp.PrivilegeCount := 1;
                    tkp.Privileges[0].Luid := SeDebugNameValue;
                    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
                    // set debug privileges
                    if not AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret) then Exit;
                    // try open process with debug privileges
                    hProc := OpenProcess(PROCESS_TERMINATE or PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_QUERY_INFORMATION or SYNCHRONIZE, False, pe32.th32ProcessID);
                    if hProc = TA_FAILED then Exit;
                finally
                    tkp.Privileges[0].Attributes := 0;
                    AdjustTokenPrivileges(hToken, False, tkp, SizeOf(tkp), tkp, ret);
                    CloseHandle(hToken);
                end;
            end;
            // if szProcess is full path
            if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then
            begin
                GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH);
                if CompareText(CharArrayToString(szExeFile), szProcess) <> 0 then
                begin
                    CloseHandle(hProc);
                    //Continue;
                end;
            end;
            // try stop process
            try
                EnumWindows(ptrProc, pe32.th32ProcessID);
                case WaitForSingleObject(hProc, dwTimeout) of
                    WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                    WAIT_TIMEOUT: try
                        lpProcName := GetProcAddress(GetModuleHandle('kernel32.dll'), 'ExitProcess');
                        if lpProcName = 0 then Exit;
                        //
                        lpMemory := VirtualAllocEx(hProc, 0, SizeOf(lpProcName), MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
                        if not WriteProcessMemory(hProc, lpMemory, lpProcName, SizeOf(lpProcName), ret) then Exit;
                        //
                        hThread := CreateRemoteThread(hProc, 0, 0, lpMemory, 0, 0, lpThreadId);
                        if hThread > 0 then
                        case WaitForSingleObject(hThread, dwTimeout) of
                            WAIT_OBJECT_0: Result := TA_SUCCESS_CLEAN;
                            WAIT_TIMEOUT: if TerminateProcess(hProc, 0) then Result := TA_SUCCESS_KILL;
                        end;
                    finally
                        CloseHandle(hThread);
                    end;
                end;
            finally
                CloseHandle(hProc);
                if CompareText(szProcess, ExtractFileName(szProcess)) <> 0 then Exit;
            end;
        end;
    finally
        CloseHandle(hProcessSnap);
    end;
end;



function CreateBrowserError(const BrowserAraay, BrowserProcNames: array of String): BROWSER_ERROR_STRUCT;
var
    uBrowserStringArray, uBrowserProcStringArray: array of String;
    StaticInfo: TNewStaticText;
    uString: String;
    i: Integer;
begin
    for i := 0 to GetArrayLength(BrowserAraay)-1 do
    begin
        if IsProcessRunning(BrowserProcNames[i]) then
        begin
            SetArrayLength(uBrowserStringArray, i+1);
            uBrowserStringArray[i] := BrowserAraay[i];
            SetArrayLength(uBrowserProcStringArray, i+1);
            uBrowserProcStringArray[i] := BrowserProcNames[i];
        end;
    end;
    if GetArrayLength(uBrowserStringArray) = 0 then Exit;
    Result.ErrorForm := TForm.Create(nil)
    with Result.ErrorForm do
    begin
        ClientHeight := ScaleY(100);
        Position := PoscreenCenter;
        BorderStyle := bsDialog;
        Caption := 'Error';
        StaticInfo := TNewStaticText.Create(Result.ErrorForm)
        with StaticInfo do
        begin
            Parent := Result.ErrorForm;
            Left := ScaleX(7);
            Top := ScaleY(7);
            Font.Size := 10;
            Caption := 'Запущен(ы) браузер(ы):';
            for i := 0 to GetArrayLength(uBrowserStringArray)-1 do Caption := Caption + #32 + uBrowserStringArray[i] + ',';
            uString := Caption;
            Delete(uString, Length(uString), Length(uString));
            Caption := uString + '.' + #13#10 + 'Завершить процессы?';
        end;
        ClientWidth := ScaleX(StaticInfo.Width+30);
        with TNewButton.Create(Result.ErrorForm) do
        begin
            Parent := Result.ErrorForm;
            SetBounds(ScaleX(Result.ErrorForm.Width-100), ScaleY(Result.ErrorForm.Height-60), ScaleX(80), ScaleY(25));
            Caption := SetupMessage(msgButtonNo);
            ModalResult := mrNo;
        end;
        with TNewButton.Create(Result.ErrorForm) do
        begin
            Parent := Result.ErrorForm;
            SetBounds(ScaleX(Result.ErrorForm.Width-190), ScaleY(Result.ErrorForm.Height-60), ScaleX(80), ScaleY(25));
            Caption := SetupMessage(msgButtonYes);
            ModalResult := mrYes;
        end;
    end;
    SetArrayLength(Result.ProcsToTerminate, GetArrayLength(uBrowserProcStringArray));
    Result.ProcsToTerminate := uBrowserProcStringArray;
end;

function TerminateManyApps(const AppProcArray: array of String): BOOL;
var
    bArray: array of BOOL;
    uArrayLen: Integer;
    i: Integer;
begin
    for i := 0 to GetArrayLength(AppProcArray)-1 do
    begin
        SetArrayLength(bArray, i+1);
        bArray[i] := TerminateApp(AppProcArray[i], 5000) = 1;
    end;
    Result := bArray[0];
    uArrayLen := GetArrayLength(bArray);
    if uArrayLen > 1 then for i := 1 to uArrayLen-1 do Result := Result and bArray[i];
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var
    uBROWSER_ERROR_STRUCT: BROWSER_ERROR_STRUCT;
begin
    if CurPageID = wpReady then
    begin
        uBROWSER_ERROR_STRUCT := CreateBrowserError(['Mozilla Firefox', 'Internet Explorer'], ['firefox.exe', 'iexplore.exe']);
        if uBROWSER_ERROR_STRUCT.ErrorForm <> nil then
        if uBROWSER_ERROR_STRUCT.ErrorForm.ShowModal = mrYes then
        Result := TerminateManyApps(uBROWSER_ERROR_STRUCT.ProcsToTerminate);
    end else Result := True;
end;


скрин:

Johny777 02-02-2013 13:18 2080773

Пацаны! Помогите пожалуйста скрыть (в лучшем случае заменить) системные тултипы (маленькие всплывающие подсказки "Закрыть", "Свернуть", "Развернуть").
Дело в том что я использую скин и мне удалось скрыть неактивную кнопку развернуть в правом верхнем углу формы таким образом:
1. Удаляем текстуру у кнопки свернуть и заменяем ею же кнопку развернуть- получаем 2 кнопки. Родную кнопку "Свернуть" делаем неактивной
2. При нажатии на кнопку свернуть(на самом деле развернуть) обнуляем сообщение wParam := 0 и посылаем форме сообщение свернуть.
3. Отлавливаем дополнительно двойной клик по заголовку окна и обнуляем, чтоб окно не развернулось на весь экран.
Всё это прекрасно работает, но но при наведении на новую кнопку свернуть всплывает подсказка от развернуть :(
вот здесь (Делфи) http://forum.vingrad.ru/forum/topic-...-system/0.html
нашёл решение, портировал, но не работает. Получилось только отловить наведение мыши на кнопки
всё выше описанное реализовано на default window proc ( http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx )
вот страница на МСДН о тултипах http://msdn.microsoft.com/en-us/libr...=VS.85%29.aspx
вот здесь есть простенький код на C++ http://www.codeproject.com/Articles/...-More-Tooltips
вот всё что удалось сделать:

читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  WM_MOVE = $3;

  GWL_WNDPROC = -4;
  HTMAXBUTTON = 9;
  WM_NCHITTEST        = $0084;
  HTMINBUTTON = 8;
  WM_USER            = $0400;
  TTM_ACTIVATE            = WM_USER + 1;
  MAX_PATH = 260;
  WM_CLOSE = $10;
  HTCLOSE = 20;
 
type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;

var
  OldWindowProc: Longint;
 
function IsWindowVisible(hWnd: HWND): BOOL; external 'IsWindowVisible@user32.dll stdcall';
function GetClassName(hWnd: HWND; lpClassName: PChar; nMaxCount: Integer): Integer; external 'GetClassName{#A}@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';
 
function HideSystemTooltip(Wnd: HWND; lPrm: Longint): BOOL;
var
  WndCl: String;
begin
  Result := True;
  if not IsWindowVisible(Wnd) then Exit;
  SetLength(WndCl, MAX_PATH+1);
  try
    GetClassName(Wnd, WndCl, MAX_PATH+1);
  finally
    SetLength(WndCl, 0);
  end;
end;

function EnumWindowsProc(hwnd: HWND; lParam: LPARAM): BOOL;
begin
  MsgBox('OK', mbError, MB_OK);
  SendMessage(hWnd, TTM_ACTIVATE, 0, 0);
end;



function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  case wParam of
    HTCLOSE, HTMINBUTTON, HTMAXBUTTON: EnumWindows(CallbackAddr('EnumWindowsProc'), 0);
  end;
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
  WizardForm.BorderIcons := [biSystemMenu, biMaximize];
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;



Буду очень признателен за помощь! :)

sergey3695 02-02-2013 17:09 2080967

Johny777, хм интересная идея. чето не получается. только если библу писануть. а как третий пункт сделал?

Johny777 03-02-2013 03:46 2081356

sergey3695, вот тебе полный пример. Изучай! :grin:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

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

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  WM_SYSCOMMAND = $0112;
  SC_MINIMIZE = 61472;
  SC_MAXIMIZE = 61488;
  SC_SIZE = 61440;
  SC_MOVE = 61456;
  SC_RESTORE = 61728;
  WM_NCLBUTTONDBLCLK = $00A3;
  MF_BYCOMMAND = 0;
  WM_NCLBUTTONDOWN = $00A1;
  WM_NCRBUTTONDOWN = $00A4;
  WM_NCLBUTTONUP = $00A2;
  WM_NCHITTEST = $0084;
  HTCLOSE = 20;
  HTMAXBUTTON = 9;
  SC_CLOSE = 61536;
 
  WM_JOHNY = 7777;
 
type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;

var
  OldWindowProc: Longint;
  SysPopupMenu: TPopupMenu;
 
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU; external 'GetSystemMenu@user32.dll stdcall';
function DeleteMenu(hMenu: HMENU; uPosition, uFlags: UINT): BOOL; external 'DeleteMenu@user32.dll stdcall';
function DestroyMenu(hMenu: HMENU): BOOL; external 'DestroyMenu@user32.dll stdcall';
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
 
function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
  pt: TPoint;
begin
  case Msg of
    WM_SYSCOMMAND:
    case wParam of
      SC_MAXIMIZE:
      begin
        wParam := 0;
        SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
      end;
    end;
    WM_NCLBUTTONDBLCLK: Msg := 0; // двойной клик по заголовку окна
    WM_NCRBUTTONDOWN:
    begin
      Msg := 0;
      if GetCursorPos(pt) then SysPopupMenu.Popup(pt.x, pt.y);
    end;
    WM_JOHNY: MsgBox('демо подмены кнопок от Johny777 :)', mbInformation, MB_OK);
//    WM_NCLBUTTONDOWN:
//    case wParam of
//      HTMAXBUTTON: Application.Minimize;
//    end;
  end;
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;

procedure SysMenuOnClick(Sender: TObject);
begin
  case TMenuItem(Sender).Caption of
    'MINIMIZE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    'CLOSE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
    'MOVE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MOVE, 0);
  end;
end;

procedure InitializeWizard();
var
  hSYSMENU: HWND;
  mMinimize, mClose, mMove: TMenuItem;
begin
  WizardForm.BorderIcons := [biSystemMenu, biMaximize];
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
  SysPopupMenu := TPopupMenu.Create(WizardForm);
  with SysPopupMenu do
  begin
    mMinimize := TMenuItem.Create(WizardForm);
    with mMinimize do
    begin
      Caption := 'MINIMIZE';
      SysPopupMenu.Items.Add(mMinimize);
      OnClick := @SysMenuOnClick;
    end;
    mClose := TMenuItem.Create(WizardForm);
    with mClose do
    begin
      Caption := 'CLOSE';
      SysPopupMenu.Items.Add(mClose);
      OnClick := @SysMenuOnClick;
    end;
    mMove := TMenuItem.Create(WizardForm);
    with mMove do
    begin
      Caption := 'MOVE';
      SysPopupMenu.Items.Add(mMove);
      OnClick := @SysMenuOnClick;
    end;
  end;
//  hSYSMENU := GetSystemMenu(WizardForm.Handle, False);
//  DeleteMenu(hSYSMENU, SC_MINIMIZE, MF_BYCOMMAND);
//  DeleteMenu(hSYSMENU, SC_MAXIMIZE, MF_BYCOMMAND);
//  DeleteMenu(hSYSMENU, SC_SIZE, MF_BYCOMMAND);
//  DeleteMenu(hSYSMENU, SC_RESTORE, MF_BYCOMMAND);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpWelcome then SendMessage(WizardForm.Handle, WM_JOHNY, 0, 0);
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;


Цитата:

Цитата sergey3695
только если библу писануть »

это крайность. Думаю можно и без библиотек реализовать! Истина где-то рядом...

by_gangster 03-02-2013 10:22 2081418

Всем привет, можно ли сделать инсталлятор который качает файлы из интернета в указаную папку? А сам истал весит не более 1мб, знаю что такие инсталы есть, но вот как их сделать я не знаю.

LordSP 03-02-2013 11:50 2081469

by_gangster, Скачать

Gnom_aka_Lexander 03-02-2013 11:54 2081474

LordSP, я уже давал ему эту ссылку. этот товарищ даже в примерах показывающих ровно то, что ему нужно не захотел разбираться

LordSP 03-02-2013 12:00 2081482

Gnom_aka_Lexander, Ооо, тогда это конечно, уже другой вопрос.

sov44 03-02-2013 13:32 2081533

По окончании установки Your Uninstaller с ключом
Код:

start /wait yusetup7p.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /SP-
происходит автозапуск этой программы. Подскажите ключ для полностью тихой установки программы без автозапуска её в конце установки.
инсталлятор - http://rghost.ru/43511242

Johny777 03-02-2013 14:53 2081583

зашпилил новый способ (почти новый :)) перетаскивания формы за любую область!
раньше на форму нужно было накладывать прозрачный лейбл и присваивать ему в OnMouseDown
эту процедуру:
[more]
Код:

function ReleaseCapture: Longint; external 'ReleaseCapture@user32.dll stdcall';

procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(WizardForm.Handle,$0112,$F012,0);
end;

или всем остальным компонентам, за которые нужно было таскать
вот код. никаких OnMouseDown и лейблов. Он самодостаточный для всей клиентской области вне зависимости от того что на ней лежит
читать дальше »

Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[code]
const
  WM_SYSCOMMAND = $0112;
  WM_MOUSEMOVE = $0200;
  VK_LBUTTON = 1;
  SC_DRAGMOVE = $F012;

type
  SHORT = Longint;

function GetKeyState(nVirtKey: Integer): SHORT; external 'GetKeyState@user32.dll stdcall';
function ReleaseCapture: BOOL; external 'ReleaseCapture@user32.dll stdcall';

procedure AppOnMSG(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_MOUSEMOVE then if GetKeyState(VK_LBUTTON) > 0 then
  begin
    ReleaseCapture;
    SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    Handled := False;
  end;
end;

procedure InitializeWizard();
begin
  Application.OnMessage := @AppOnMSG;
end;


Пользуйтесь кому надо! :grin:

вот ещё забавный пример! попробуйте
читать дальше »

Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[  code]
const
  WM_SYSCOMMAND = $0112;
  WM_MOUSEMOVE = $0200;
  VK_LBUTTON = 1;
  SC_DRAGMOVE = $F012;

type
  SHORT = Longint;

function GetKeyState(nVirtKey: Integer): SHORT; external 'GetKeyState@user32.dll stdcall';
function ReleaseCapture: BOOL; external 'ReleaseCapture@user32.dll stdcall';
function SetCapture(hWnd: HWND): HWND; external 'SetCapture@user32.dll stdcall';

procedure AppOnMSG(var Msg: TMsg; var Handled: Boolean);
begin
  if Msg.message = WM_MOUSEMOVE then if GetKeyState(VK_LBUTTON) > 0 then
  begin
    ReleaseCapture
    SendMessage(Msg.hwnd, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    Handled := False;
  end;
end;

procedure InitializeWizard();
begin
  Application.OnMessage := @AppOnMSG;
end;


===================================================================================

Gnom_aka_Lexander, касательно моего вопроса с пред. страницы можешь помочь?

Gnom_aka_Lexander 03-02-2013 14:56 2081587

Цитата:

Цитата sov44
инсталлятор »

скрипт нужен а не инсталлятор.
Навскидку, то что анпакером вытащил:
Код:

[Run]
Filename: "{app}\urmain.exe"; Parameters: "-buildcache"; StatusMsg: "Searching installed applications, this may take a few minutes..."; MinVersion: 0.0,5.0;
Filename: "{app}\inimerge.exe"; Parameters: """{app}\uruninstaller.ini"" ""{userappdata}\URSoft\Your Uninstaller\uruninstaller.ini"""; MinVersion: 0.0,5.0;
Filename: "{app}\autoupdater.exe"; Parameters: "/halfsilent 0"; Description: "Check for updates."; MinVersion: 0.0,5.0;
Filename: "{app}\urmain.exe"; Description: "Run Your Uninstaller!"; MinVersion: 0.0,5.0;

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

Gnom_aka_Lexander 03-02-2013 16:28 2081637

Цитата:

Цитата Johny777
касательно моего вопроса с пред. страницы можешь помочь? »

Цитата:

Цитата Johny777
это крайность. Думаю можно и без библиотек реализовать! »

Не нужно быть настолько категоричным. библиотека это всегда хорошо. Код исполняемый виндой будет работать значительно быстрее кода, который исполняет интерпретатор инно. В результате чего, для достижения быстродействия будет занимать гораздо меньше процессорного времени. (на самом деле это не совсем так, но как понятно объяснить разницу - я не знаю). Мораль - всякие каллбеки и вообще очень большие куски кода лучше все-таки делать внутри библиотек - пользователям не нравится, когда инсталлу требуется комп чуть-ли не мощнее, чем нужен для того, что он устанавливает.

Элементарный пример: простейший код, который связыет две формы между собой - при реализации из инно все мигает, пропадает и вообще всякие артефакты. Если сунуть его в длл-ку, то все работает настолько четко, что можно подумать, что это не две формы а вообще одна, по хитрому отрисованая.

by_gangster 03-02-2013 19:40 2081777

Gnom_aka_Lexander, я сидел на этими скриптами часа 2, но так и не смог разобраться, ты бы ещё хоть сам скачал и посмотрел на примерах, я вообщще не понял в какую папку он скачал файлы

insombia 03-02-2013 20:13 2081803

мне нужно чтобы файл распаковался по такому пути через isdone но можно и через секцию files http://i54.fastpic.ru/big/2013/0203/...9a93c14d49.jpg

sov44 03-02-2013 20:26 2081819

Нужна программа для распаковки последней версии Your Uninstaller! Pro 7.4.2012.05 DC 03.02.2013
innounp_plus_0.36, innounp038 не справляются http://savepic.org/2731889.jpg

Gnom_aka_Lexander 04-02-2013 12:10 2082209

by_gangster, Берем прямо первый пример из тех, что идут с библиотекой. открываем. и что мы там видим?
Код:

itd_addfile('http://www.sherlocksoftware.org/petz/files/dogz5.zip',expandconstant('{tmp}\dogz5.zip'));
что тут непонятно?
первый параметр - адрес, второй - полный путь до сохраняемого файла. если ты не знаешь, куда ведет константа {tmp}, то посмотри в справке.

insombia, ExpandConstant('{userappdata}\Theta') вопрос поднимается периодически, хотел предложить вынести константы с описаниями в шапку, но смысл - если лень посмотреть в справку, то в шапку заглянуть не менее лениво будет, мне кажется.

sov44, запусти инстал и нажми меню о программе. там видно, что скомпилено на расширенной версии инно, а для расширенной версии так никто никогда и не сделал еще анпакера.

kodzoyev 06-02-2013 09:16 2083462

Johny777, спасибо! ;) "Тихую" установку реализовали в NSIS пока-что, но за код благодарю отдельно.

mifkys 07-02-2013 10:24 2084350

Добрый день. Мне нужно установить приложение, которое меняет настройки IE. Сейчас параметры прописываются в реестре для HKCU, но мне нужно, чтобы они применялись и для остальных пользователей. Пробовал добавлять в HKLM и HKU/.DEFAULT, но параметры не подхватываются. Кто-нибудь сталкивался?

Johny777 07-02-2013 15:11 2084557

Пацаны помогите пожалуйста вместо скрытия подсказок ( http://forum.oszone.net/post-2080773-1638.html ) добавить кнопку "свернуть" в
заголовок формы ( BorderStyle := bsDialog )
а именно через функцию DrawFrameControl(..., DFCS_CAPTIONMIN, ...)
вот мой потр (не рабочий):
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  SM_CXSIZE = 30;
  SM_CYSIZE = 31;
  SM_CXFRAME = $20;
  SM_CYFRAME = 33;

  DFC_BUTTON = 4;
  DFCS_BUTTONPUSH = $10;
  DFCS_PUSHED = $200;

  WM_NCACTIVATE = $0086;
  DFCS_CAPTIONMIN = 1;


 
type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  HDC = LongWord;
  PRect = TRect;

var
  OldWindowProc: Longint;
  R: TRect;
  Press: Boolean;


function GetWindowDC(hWnd: HWND): HDC; external 'GetWindowDC@user32.dll stdcall';
function GetSystemMetrics(nIndex: Integer): Integer; external 'GetSystemMetrics@user32.dll stdcall';
function DrawFrameControl(DC: HDC; Rect: PRect; uType, uState: UINT): BOOL; external 'DrawFrameControl@user32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';


function Bounds(ALeft, ATop, AWidth, AHeight: Integer): TRect;
begin
  Result.Left := ALeft;
  Result.Top := ATop;
  Result.Right := AWidth;
  Result.Bottom := AHeight;
end;

procedure DrawBtn(Ctrl: TWinControl);
var
  WDc: HDC;
  Cx, Cy: Integer;
  XFrame, Yframe: Integer;
  iHandle: HWND;
begin
  iHandle := Ctrl.Handle;
  WDc := GetWindowDc(iHandle);
  Cx := GetSystemMetrics(SM_CXSIZE);
  Cy := GetSystemMetrics(SM_CYSIZE);
  xFrame := GetSystemMetrics(SM_CXFRAME);
  yFrame := GetSystemMetrics(SM_CYFRAME);
  R := Bounds(Ctrl.Width - xFrame - 4*Cx + 2, yFrame + 2, Cx - 2, Cy - 4);
  if Press then
    DrawFrameControl(WDc, R ,DFC_BUTTON, DFCS_CAPTIONMIN or DFCS_PUSHED)
  else
    DrawFrameControl(WDc,R, DFC_BUTTON, DFCS_CAPTIONMIN);
  ReleaseDc(iHandle,WDC);
end;


function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  if Msg = WM_NCACTIVATE then DrawBtn(WizardForm);
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
  WizardForm.BorderStyle := bsDialog;
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
//
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC or -21, OldWindowProc);
end;



очень хочу 2 нормальные кнопки в заголовке!
Буду очень признателен! :)

вот исходник на дельфи

sergey3695 07-02-2013 18:21 2084712

Цитата:

Цитата Johny777
вместо скрытия подсказок »

лучше скрыть иначе тогда еще геморойнее.
Вообщем досех пор думаю над твоим вопросом, вот функция скрытия системных хинтов на делфи
читать дальше »
Код:

unit Unit1;

interface

uses
  Windows,Messages,SysUtils,Forms;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    SysTooltip: HWND;
    procedure WMNCMouseMove(var Msg: TMessage); message WM_NCMOUSEMOVE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL; stdcall;
var
  WndCl: PChar;
begin
  Result := True;
  if not IsWindowVisible(Wnd) then Exit;
  GetMem(WndCl, 256 * SizeOf(Char));
  try
    GetClassName(Wnd, WndCl, 255);
    Result := (StrPas(WndCl) <> '#32774');
    if not Result then
      ShowWindow(Wnd, SW_HIDE);
  finally
    FreeMem(WndCl, 256 * SizeOf(Char));
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  SysTooltip := 0;
  EnumWindows(@HideSystemTooltip, 0);
end;

procedure TForm1.WMNCMouseMove(var Msg: TMessage);
begin
  if not IsWindow(SysTooltip) then
    EnumWindows(@HideSystemTooltip, 0);
  if not IsWindowVisible(SysTooltip) then Exit;
end;

end.


Опыта в делфи у меня мало (в написании библиотек), можно сказать что ноль, полный ноль. Начил изучать пока с основ. Но вопрос хотелось бы уже решить. Может кто-нибудь по-умнее может написать библеотеку для инно. Johny777, , без библы тут необойтись все-равно. (по крайней мере я так думаю)

El Sanchez 07-02-2013 18:39 2084733

Цитата:

Цитата Johny777
добавить кнопку "свернуть" в
заголовок формы ( BorderStyle := bsDialog ) »

Johny777, так пойдет?
Код:

const
    GWL_STYLE = (-16);
    WS_MINIMIZEBOX = $20000;
   
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';

procedure InitializeWizard();
begin
    WizardForm.BorderStyle := bsDialog;
    SetWindowLong(WizardForm.Handle, GWL_STYLE, GetWindowLong(WizardForm.Handle, GWL_STYLE) or WS_MINIMIZEBOX);
end;


Mailchik 07-02-2013 20:54 2084829

Цитата:

Цитата El Sanchez
Johny777, так пойдет? »

Вряд ли. Johny777 хочет только кнопку минимизации и закрытия. То есть полностью удалить кнопку максимизации.
P.S. Интересная идея, но я не видел еще таких приложений, только с кнопкой минимизации и закрытия. Если имеются таковые, можно ссылочку.
P.S.S. Чтобы именно Windows'овские системные кнопки были.

Johny777 08-02-2013 03:28 2085032

Цитата:

Цитата El Sanchez
так пойдет? »

El Sanchez, Не, не то :(
нужно скрыть неактивную сис. кнопку "развернуть" на форме и оставит только "свернуть" и "закрыть", причём чтоб они лежали рядом друг с другом без пробела
тк юзаю скин придумал извартский, но на удивление рабочий способ ( описание-( http://forum.oszone.net/post-2080773-1638.html ), реализация-( http://forum.oszone.net/post-2081356-1640.html ) ), но обломился (описание почему по первой ссылке).
Откровено говоря не знаю что пихать в библиотеку, чтоб скрыть тултипы, тк кода на 10 строк, но кажись мой порт не работает из-за замены функций GetMem(...), FreeMem(...)
И вот недавно нарвался на функцию DrawFrameControl которая может многое, включая добавление своих кнопок в заголовок формы и (внимание) стандартных - системных.
Тут же нашёлся пример по добавлении своей кнопки (исходник прикреплен в пред. сообщении), но с флагом-константой DFCS_CAPTIONMIN = 1; можно добавить по координатам
прямоугольника (TRect) стандртную кнопку "свернуть" аккурат слева от единственной кнопки "закрыть" (она одна при BorderStyle := bsDialog), но как известно из 10 раз я облaмываюсь на таких попытках 9,5 раз и это как раз тот случай.


sergey3695,
то же самое лежит здесь http://forum.vingrad.ru/forum/topic-...-system/0.html
видел уже! проблема в другом. Даже если скрыть или заменить тултип, то остаётся ст. сис. меню, вызываемое кликом правой кнопкой мыши по заголовку и левым кликом по иконке (по той, что в левом верхнем углу). А там айтем развернуть который сворчивает окно (те ещё хуже тултипа). Да его можно удалить, но тогда окну не будут посылаться сообщения "развернуть", которые мы меняем на "свернуть". Кажись фиг бы с ним, ведь у нас есть WM_NCLBUTTONDOWN с wParam = HTMAXBUTTON - нажатие на кнопку развернуть, но нажатие <> клик! Можно отловить правый клик по заголовку и обнулить сообщение WM_NCRBUTTONDOWN, но остаётся левый клик по иконке и появится снова сис. контекстное меню. Тут думаю нужно определять положение мыши (TPoint) и сравнивать с TRect-ом формы (х, у) и выполнять что-то вроде ( http://forum.oszone.net/post-2081583-1646.html )

В общем пока-что самый привлекательный способ - добавить свою кнопку :)

Mailchik 08-02-2013 18:13 2085738

Johny777, я думаю, ты понимаешь, что используя DrawFrameControl, форма будет иметь до XP'шный стиль.
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Code]
#ifdef UNICODE
 #define A "W"
 type
  PChar = PAnsiChar;
#else
 #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  DFC_CAPTION = 1;
  DFCS_CAPTIONMIN = 1;
  DFCS_PUSHED = $200;
  WM_SETFOCUS        = $0007;
  WM_NCLBUTTONDOWN    = $00A1;
  WM_NCLBUTTONUP      = $00A2;
  WM_NCACTIVATE      = $0086;
  WM_NCCALCSIZE      = $0083;
  WM_NCPAINT          = $0085;
  WM_ACTIVATE        = $0006;
  WM_WINDOWPOSCHANGING = $0046;
  WA_INACTIVE = 0;

type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  HDC = LongWord;
  SHORT = Longint;

var
  OldWindowProc: Longint;
  myPoint: TPoint;
  myRect: TRect;
  myDC: HDC;

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint;
  external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
  external 'CallWindowProc{#A}@user32.dll stdcall';
function GetCursorPos(var lpPoint: TPoint): BOOL;
  external 'GetCursorPos@user32.dll stdcall';
function GetWindowDC(hWnd: HWND): HDC;
  external 'GetWindowDC@user32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer;
  external 'ReleaseDC@user32.dll stdcall';
function DrawFrameControl(DC: HDC; const Rect: TRect; uType, uState: UINT): BOOL;
  external 'DrawFrameControl@user32.dll stdcall';

procedure DrawButton(State: Cardinal);
 begin
 myRect.Left := WizardForm.Width - ScaleX(46);
 myRect.Right := WizardForm.Width - ScaleX(27);
 myRect.Top := ScaleY(5);
 myRect.Bottom := ScaleY(22);
 myDC := GetWindowDC(WizardForm.Handle);
 try
  DrawFrameControl(myDC, myRect, DFC_CAPTION , DFCS_CAPTIONMIN or State);
 finally
  ReleaseDC(WizardForm.Handle, myDC);
 end;
end;

function PointIntoRect: boolean;
var
 myPoint: TPoint;
 begin
  GetCursorPos(myPoint);
  Result :=
    (myPoint.X - WizardForm.Left >= WizardForm.Width - ScaleX(46)) and
    (myPoint.X - WizardForm.Left <= WizardForm.Width - ScaleX(27)) and
    (myPoint.Y - WizardForm.Top >= ScaleY(5)) and
    (myPoint.Y - WizardForm.Top <= ScaleY(22));
end;

function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
 begin
  case Msg of
    WM_NCACTIVATE, WM_NCCALCSIZE, WM_ACTIVATE, WM_NCPAINT, WM_WINDOWPOSCHANGING, WM_SETFOCUS: DrawButton(0);
    //WM_NCLBUTTONDOWN: if PointIntoRect then DrawButton(DFCS_Pushed); //состояние нажатия кнопки;
    WM_NCLBUTTONDOWN: if PointIntoRect then Application.Minimize;
  end;
  if wParam = WA_INACTIVE then DrawButton(0);
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;

procedure InitializeWizard();
 begin
 with WizardForm do begin
  BorderIcons := [biSystemMenu];
 end;
 OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
end;

procedure DeinitializeSetup();
 begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;


sergey3695 09-02-2013 14:26 2086290

Johny777, вот решение твой проблемы
Спасибо большое Mailchik, за помощь. Я так и думал что где-то чето накасячил но не мог понять что. Вообщем то Johny777, он тоже тем самым что помог мне, помог и тебе. Хотя этот вопрос меня тоже заинтересовал так что мне тоже захотелось две кнопочки )
к сожалению библеотеку меньше весом не сделать. (ну я на килобайт поменьше сделал (127 кб) но это пустяк)

Johny777 09-02-2013 15:12 2086322

sergey3695, спасибо, но только-что смог таки скрыть тултипы (ведь знал же что библиотека в этом случае - перебор)
пихать в библиотеку это явно нет смысла: :)
Код:

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;

полный пример:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp


[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external
Source: steam.cjstyles; Flags: dontcopy
Source: isskin.dll; Flags: dontcopy


[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  WM_NCMOUSEMOVE = $00A0;
 
type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  SHORT = Longint;

var
  OldWindowProc: Longint;
 
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;

function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  if Msg = WM_NCMOUSEMOVE then EnumWindows(CallbackAddr('HideSystemTooltip'), 0);
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;


procedure InitializeWizard();
begin
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;


касательно сокрытия кнопки развернуть:
Mailchik, Спасибо большое за код. Знаю что стиль "Аэро" слетает, но не важно тк хотел использовать только со скином, но кнопка не текстурируется :( , поэтому
Mailchik, sergey3695, предлагаю доработанный метод подмены сообщений:
сис меню больше не вызывается при клике по иконке и за неё теперь можно таскать, + в том что сворачивание происходит при клике а не нажатии на кнопку:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

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

[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  GWL_WNDPROC = -4;
  WM_SYSCOMMAND = $0112;
  SC_MINIMIZE = 61472;
  SC_MAXIMIZE = 61488;
  SC_SIZE = 61440;
  SC_MOVE = 61456;
  WM_NCLBUTTONDBLCLK = $00A3;
  MF_BYCOMMAND = 0;
  WM_NCLBUTTONDOWN = $00A1;
  WM_NCRBUTTONDOWN = $00A4;
  WM_NCMOUSEMOVE = $00A0;
  SC_CLOSE = 61536;
  VK_LBUTTON = 1;
  SC_DRAGMOVE = $F012;
  WM_JOHNY = 7777;

type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  SHORT = Longint;

var
  OldWindowProc: Longint;
  SysPopupMenu: TPopupMenu;

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall';
function GetKeyState(nVirtKey: Integer): SHORT; external 'GetKeyState@user32.dll stdcall';
function ReleaseCapture: BOOL; external 'ReleaseCapture@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';

function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;


function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
  pt: TPoint;
  rt: TRect;
begin
  case Msg of
    WM_SYSCOMMAND:
    case wParam of
      SC_MAXIMIZE:
      begin
        wParam := 0;
        SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
      end;
    end;
    WM_NCMOUSEMOVE: EnumWindows(CallbackAddr('HideSystemTooltip'), 0);
    WM_NCLBUTTONDBLCLK: Msg := 0; // двойной клик по заголовку окна
    WM_NCRBUTTONDOWN:
    begin
      Msg := 0;
      if GetCursorPos(pt) then SysPopupMenu.Popup(pt.x, pt.y);
    end;
    WM_NCLBUTTONDOWN: if GetCursorPos(pt) and GetWindowRect(hWnd, rt) then
    if (pt.x > rt.Left) and (pt.x < rt.Right-WizardForm.Width+27) and (pt.y > rt.Top) and (pt.y < rt.Bottom-WizardForm.Height+27) then
    begin
      ReleaseCapture;
      SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);

    end;
//    WM_JOHNY: MsgBox('демо подмены кнопок от Johny777 :)', mbInformation, MB_OK);
  end;
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;

procedure SysMenuOnClick(Sender: TObject);
begin
  case TMenuItem(Sender).Caption of
    'MINIMIZE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    'CLOSE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
    'MOVE': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MOVE, 0);
  end;
end;

procedure InitializeWizard();
var
  hSYSMENU: HWND;
  mMinimize, mClose, mMove: TMenuItem;
begin
  WizardForm.BorderIcons := [biSystemMenu, biMaximize];
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
  SysPopupMenu := TPopupMenu.Create(WizardForm);
  with SysPopupMenu do
  begin
    mMinimize := TMenuItem.Create(WizardForm);
    with mMinimize do
    begin
      Caption := 'MINIMIZE';
      SysPopupMenu.Items.Add(mMinimize);
      OnClick := @SysMenuOnClick;
    end;
    mClose := TMenuItem.Create(WizardForm);
    with mClose do
    begin
      Caption := 'CLOSE';
      SysPopupMenu.Items.Add(mClose);
      OnClick := @SysMenuOnClick;
    end;
    mMove := TMenuItem.Create(WizardForm);
    with mMove do
    begin
      Caption := 'MOVE';
      SysPopupMenu.Items.Add(mMove);
      OnClick := @SysMenuOnClick;
    end;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpWelcome then SendMessage(WizardForm.Handle, WM_JOHNY, 0, 0);
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;


в сообщении sergey3695 есть перерисованный скин. Пробуйте. :) Есть рекомендации по улучшению - говорите! По возможности исправлю/добавлю

Мне осталось только доработать подменённое сис меню и добавить свои хинты (можно и через ISHint.dll)

============================================= UPDATE =========================================================

изучаю потихоньку вин апи, вот вам подарок: :)

читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[  code]
const
  FLASHW_STOP = $0;
  FLASHW_CAPTION = $1;
  FLASHW_TRAY = $2;
  FLASHW_ALL = FLASHW_CAPTION or FLASHW_TRAY;
  FLASHW_TIMER = $4;
  FLASHW_TIMERNOFG = $C;
 

type
  FLASHWINFO = record
    cbSize: UINT;
    hwnd: HWND;
    dwFlags: DWORD;
    uCount: UINT; // Число миганий
    dwTimeout: DWORD; // промежуток между миганиями
  end;


function FlashWindowEx(var pfwi: FLASHWINFO): BOOL; external 'FlashWindowEx@user32.dll stdcall';


procedure CurPageChanged(CurPageID: Integer);
var
  fl: FLASHWINFO;
begin
  fl.cbSize := SizeOf(fl);
  fl.dwTimeout := 777;
  fl.hwnd :=  Application.Handle;
  fl.uCount := 3;
  fl.dwFlags := FLASHW_TRAY;
  FlashWindowEx(fl);
end;



sergey3695 09-02-2013 15:42 2086341

Цитата:

Цитата Johny777
пихать в библиотеку это явно нет смысла »

теперь останется только поржать ))) нет слов.
Цитата:

Цитата Johny777
сис меню больше не вызывается при клике по иконке »

вызывается. (по крайней мере у меня)

Johny777 10-02-2013 17:12 2087144

Ну все! Добил код:
1. Хинтов нет. Через ISHint.dll работает как-то стрёмно (вырезал), Сам хинт создаётся через функцию CreateWindowEx(...) как здесь ( http://forum.vingrad.ru/forum/topic-...-system/0.html ), но в какой-то момент нужно отправить через SendMessage(... , LPARAM(PTOOLINFO(@g_toolItem))); адрес переменной, а вот это в инно не реализовать: LPARAM(PTOOLINFO(@g_toolItem)), а функции типа CallbackAddr(), только для переменных я не нашел. Короче забил. Думаю хинтами можно пренебречь. Лично мне они нафиг не нужны (и так понятно что крестик закрывает окно...)
2. Зато классно получилось подменённое сис. меню (var SysPopupMenu: TPopupMenu;). Принцип такой:
создаём TPopupMenu функцией NewPopupMenu(), во входном параметре которой массив из TMenuItem. Их мы создаём функцией NewItem(), во входном параметре которой строка-текст айтема, а тут
(внимание) работает ещё одна функция (изменённая и упрощённая мной под собственные нужды) от South (оригинал тут http://forum.ru-board.com/topic.cgi?...83&limit=1&m=1 )
function GetMenuItemText(const hMenu: HMENU; const uIDItem: UINT; const Default: String): String;
hMenu - хэндл меню
uIDItem - индекс айтема
Default - если функция не отработает, то вернёт это имя для айтема
короче говоря мы перекидываем имена айтемов ('Закрыть', в английской винде 'Close', в китайской иероглифы) в своё меню из системного, чтоб не писать константы сообщений!
далее: Добавил сис. картинки (закрыть, свернуть) в меню функцией SetMenuItemBitmaps()
кто хочет свои картинки, то делается это так:
читать дальше »
Код:

BitmapResource=Close:Close.bmp|Min:Min.bmp

...

var
  CloseBmp, MinBmp: TBitmap;

procedure InitializeWizard();
begin
  ...
   
  CloseBmp := TBitmap.Create;
  CloseBmp.LoadFromResourceName(HInstance, '_IS_CLOSE');
  MinBmp := TBitmap.Create;
  MinBmp.LoadFromResourceName(HInstance, '_IS_MIN');
  SetMenuItemBitmaps(SysPopupMenu.Handle, 0, MF_BYPOSITION, MinBmp.Handle, MinBmp.Handle);
  SetMenuItemBitmaps(SysPopupMenu.Handle, 1, MF_BYPOSITION, CloseBmp.Handle, CloseBmp.Handle);
end;



финальный код подмены сообщений:
читать дальше »
Код:

[Setup]
AppName=777
AppVerName=777
DefaultDirname={pf}\777


[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif


const
  GWL_WNDPROC = -4;
  WM_SYSCOMMAND = $0112;
  SC_MINIMIZE = 61472;
  SC_MAXIMIZE = 61488;
  SC_MOVE = 61456;
  WM_NCLBUTTONDBLCLK = $00A3;
  WM_NCLBUTTONDOWN = $00A1;
  WM_NCRBUTTONDOWN = $00A4;
  WM_NCMOUSEMOVE = $00A0;
  SC_CLOSE = 61536;
  SC_DRAGMOVE = $F012;
  WM_JOHNY = 7777;
  MF_BYPOSITION = $400;
  SC_SEPARATOR = 61455;
  MAX_PATH = 260;
  HBMMENU_CALLBACK = -1;
  HBMMENU_SYSTEM = 1;
  HBMMENU_MBAR_RESTORE = 2;
  HBMMENU_MBAR_MINIMIZE = 3;
  HBMMENU_MBAR_CLOSE = 5;
  HBMMENU_MBAR_CLOSE_D = 6;
  HBMMENU_MBAR_MINIMIZE_D = 7;
  HBMMENU_POPUP_CLOSE = 8;
  HBMMENU_POPUP_RESTORE = 9;
  HBMMENU_POPUP_MAXIMIZE = 10;
  HBMMENU_POPUP_MINIMIZE = 11;
   

type
  LPARAM = Integer;
  WPARAM = Integer;
  LRESULT = Integer;
  TFNWndProc = Integer;
  SHORT = Longint;
  HINST = THandle;
   

var
  OldWindowProc: Longint;
  SysPopupMenu: TPopupMenu;
   

function GetSystemMenu(hWnd: HWND; bRevert: BOOL): HMENU; external 'GetSystemMenu@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function GetCursorPos(var lpPoint: TPoint): BOOL; external 'GetCursorPos@user32.dll stdcall';
function GetWindowRect(hWnd: HWND; var lpRect: TRect): BOOL; external 'GetWindowRect@user32.dll stdcall';
function ReleaseCapture: BOOL; external 'ReleaseCapture@user32.dll stdcall';
function EnumWindows(lpEnumFunc, lParam: Longint): BOOL; external 'EnumWindows@user32.dll stdcall';
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';
function SetMenuItemBitmaps(hMenu: HMENU; uPosition, uFlags: UINT; hBitmapUnchecked: HBITMAP; hBitmapChecked: HBITMAP): BOOL; external 'SetMenuItemBitmaps@user32.dll stdcall';
function GetMenuString(hMenu: HMENU; uIDItem: UINT; lpString: PChar; nMaxCount: Integer; uFlag: UINT): Integer; external 'GetMenuString{#A}@user32.dll stdcall';
function GetMenuItemText(const hMenu: HMENU; const uIDItem: UINT; const Default: String): String; // South
var
  Buff: String;
begin
  Result := Default;
  SetLength(Buff, MAX_PATH);
  if GetMenuString(hMenu, uIDItem, PChar(Buff), MAX_PATH, MF_BYPOSITION) > 0 then Result:= String(Buff);
end;


function HideSystemTooltip(Wnd: HWND; lPrm: LPARAM): BOOL;
begin
  Result := ShowWindow(FindWindowByClassName('#32774'), SW_HIDE);
end;


function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
var
  pt: TPoint;
  rt: TRect;
begin
  case Msg of
    WM_SYSCOMMAND: if wParam = SC_MAXIMIZE then
    begin
      wParam := 0;
      SendMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    end;
    WM_NCMOUSEMOVE: EnumWindows(CallbackAddr('HideSystemTooltip'), 0);
    WM_NCLBUTTONDBLCLK: Msg := 0;
    WM_NCRBUTTONDOWN:
    begin
      Msg := 0;
      if GetCursorPos(pt) then SysPopupMenu.Popup(pt.x, pt.y);
    end;
    WM_NCLBUTTONDOWN:
    if GetCursorPos(pt) and GetWindowRect(hWnd, rt) then
    if (pt.x > rt.Left) and (pt.x < rt.Right-WizardForm.Width+27) and (pt.y > rt.Top) and (pt.y < rt.Bottom-WizardForm.Height+27) then
    begin
      Msg := 0;
      ReleaseCapture;
      SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_DRAGMOVE, 0);
    end;
    WM_JOHNY: MsgBox('демо подмены кнопок от Johny777 :)', mbInformation, MB_OK);
  end;
  Result := CallWindowProc(OldWindowProc, hWnd, Msg, wParam, lParam);
end;


procedure SysMenuOnClick(Sender: TObject);
begin
  case TMenuItem(Sender).Name of
    '_': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    'X': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_CLOSE, 0);
    'M': SendMessage(WizardForm.Handle, WM_SYSCOMMAND, SC_MOVE, 0);
    'Help', 'About': MsgBox(TMenuItem(Sender).Caption, mbError, MB_OK);
  end;
end;


procedure InitializeWizard();
var
    hSYSMENU: HWND;
begin
  WizardForm.BorderIcons := [biSystemMenu, biMaximize];
  OldWindowProc := SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('WindowProc'));
  hSYSMENU := GetSystemMenu(WizardForm.Handle, False);
  SysPopupMenu := NewPopupMenu(WizardForm, 'MyPopupMenu', paLeft, True, [
    NewItem(GetMenuItemText(hSYSMENU, 3, '&MINIMIZE'), 0, False, True, @SysMenuOnClick, 1, '_'),
    NewItem(GetMenuItemText(hSYSMENU, 6, '&CLOSE'), 0, False, True, @SysMenuOnClick, 2, 'X'),
    NewItem(GetMenuItemText(hSYSMENU, 1, '&MOVE'), 0, False, True, @SysMenuOnClick, 3, 'M'),
    NewLine,
    NewSubMenu('&Help', 0, 'mHelp', [
      NewItem('&Inno Setup Help', 0, False, True, @SysMenuOnClick, 4, 'Help'),
      NewItem('&About Inno Setup', 0, False, True, @SysMenuOnClick, 5, 'About')
    ], True)
  ]);
  SetMenuItemBitmaps(SysPopupMenu.Handle, 0, MF_BYPOSITION, HBMMENU_MBAR_MINIMIZE, HBMMENU_MBAR_MINIMIZE);
  SetMenuItemBitmaps(SysPopupMenu.Handle, 1, MF_BYPOSITION, HBMMENU_MBAR_CLOSE, HBMMENU_MBAR_CLOSE);
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpWelcome then SendMessage(WizardForm.Handle, WM_JOHNY, 0, 0);
end;


procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldWindowProc);
end;



Дальнейшие улучшения кода с моей стороны не планируются. Пользуйтесь кто хочет, буду рад, только скин не забудьте перерисовать! :grin:

==================================================================================================== ==============

sergey3695,
Цитата:

Цитата sergey3695
вызывается. (по крайней мере у меня) »

Я забыл установить Msg := 0; И если что, то нужно настраивать строку:
if (pt.x > rt.Left) and (pt.x < rt.Right-WizardForm.Width+27) and (pt.y > rt.Top) and (pt.y < rt.Bottom-WizardForm.Height+27) then
в ней должны быть точные координаты прямоугольника, в котором лежит иконка (они могут сбиться например из-за большего размера формы чем у меня ну или типа того)

Mailchik 10-02-2013 19:49 2087279

Цитата:

Цитата Johny777
Короче забил »

всё верно сделал.
один совет: в коде, используя такие строки:
Код:

#ifdef UNICODE
  #define A "W"
#else
  #define A "A"
#endif

добавляй еще PChar = PAnsiChar, т.к. Unicode компилятор инно не знает просто PChar'а. то есть должно быть так:
Код:

#ifdef UNICODE
  #define A "W"
  type
  PChar = PAnsiChar;

#else
  #define A "A"
#endif


TERMINAL 13-02-2013 14:41 2089488

Подскажите плз, как и в какой секции нужно прописать условие чтобы при отсутствии ключа в реестре (HKEY_CURRENT_USER\Software\Test, "AppData", "REG_SZ", "7890" ) установщик (ехе) вообще не стартовал или если присутствует папка С:\{E99DDD46-1221-4DB4-81F0-F24D210EB41C} тогда разрешена установка?

Нашёл командную строку как компилировать скрипт Compil32.exe /cc "С:\Proekt\тест.iss", но мне нужно каждый раз создавать новый GUID-возможно сделать автоматическую генерацию нового GUID? Лучше вопрос, для чего нужен этот GUID-я думал для регистрации в реестре, но оказалось не так. Если мне нужно скомпилировать и получить 10 разных файлов ехе, для этого нужно генерировать GUID?

insombia 13-02-2013 23:12 2089933

Gnom_aka_Lexander у тебя есть ещё IsPictures?

Gnom_aka_Lexander 14-02-2013 09:55 2090135

insombia, есть.

insombia 14-02-2013 13:53 2090300

Gnom_aka_Lexander я бы скачал от тудого но ты меня там забанил за мультиакк

El Sanchez 14-02-2013 17:38 2090436

Цитата:

Цитата TERMINAL
Подскажите плз, как и в какой секции нужно прописать условие чтобы при отсутствии ключа в реестре (HKEY_CURRENT_USER\Software\Test, "AppData", "REG_SZ", "7890" ) установщик (ехе) вообще не стартовал или если присутствует папка С:\{E99DDD46-1221-4DB4-81F0-F24D210EB41C} тогда разрешена установка? »

TERMINAL,
Код:

function InitializeSetup(): Boolean;
begin
    Result := RegKeyExists(HKCU, 'SOFTWARE\Test') or DirExists(ExpandConstant('{sd}\{{E99DDD46-1221-4DB4-81F0-F24D210EB41C}'));
end;

Цитата:

Цитата TERMINAL
для чего нужен этот GUID-я думал для регистрации в реестре, но оказалось не так. »

TERMINAL, почему не так? Все так.

Цитата:

Цитата TERMINAL
Если мне нужно скомпилировать и получить 10 разных файлов ехе, для этого нужно генерировать GUID? »

TERMINAL, можно и самому придумать 10 уникальных AppID.

Цитата:

Цитата TERMINAL
Нашёл командную строку как компилировать скрипт Compil32.exe /cc "С:\Proekt\тест.iss", но мне нужно каждый раз создавать новый GUID-возможно сделать автоматическую генерацию нового GUID? »

TERMINAL, используйте препроцессор iscc.exe для компиляции. У него есть ключ /d, который позволяет декларировать препроцессорные константы и директивы. Допустим в секции Setup директива AppId объявлена через препроцессорную константу {#AppID}:
Код:

[Setup]
AppID={#AppID}

Тогда из командной строки указать {#AppID} и скомпилировать скрипт можно так:
Код:

iscc "/dAppID=тут уникальный Application ID" "С:\Proekt\тест.iss"
Декларацию константы {#AppID} в скрипте нужно закомментировать, так как парсится позже, чем указанная через комстроку. Консольных генераторов GUID полно, осталось оформить в виде батника, например.

insombia 14-02-2013 20:01 2090543

как добавить создание новой папки сюда ?

Mailchik 14-02-2013 20:36 2090571

insombia,
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
procedure DirClick(Sender : TObject);
var
 s: string;
 begin
  if BrowseForFolder(WizardDirValue, s, True) then
  WizardForm.DirEdit.Text := s;
end;

procedure InitializeWizard;
 begin
  WizardForm.DirBrowseButton.OnClick := @DirClick;
end;


insombia 14-02-2013 20:56 2090578

как убрать кнопку отмены isdone чтобы осталась дефольтная?

Nightwishh 14-02-2013 22:38 2090657

Подскажите, как в скрипте от Johny777 (рандомный показ слайдов), сделать последовательный показ слайдов, чтобы Image_2.bmp был строго после Image_1.bmp и т.д.
Код:

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

[Files]
Source: Image_1.bmp; Flags: dontcopy solidbreak sortfilesbyextension nocompression
Source: Image_2.bmp; Flags: dontcopy solidbreak sortfilesbyextension nocompression
Source: Image_3.bmp; Flags: dontcopy solidbreak sortfilesbyextension nocompression

Source: {fonts}\*; DestDir: {app}; Flags: external

[ code]
const
  SlidesNumber=3; //количество слайдов
  SlideRenewTine=2; // задержка показа слаидов в секундах
 
var
  SplashImage: TBitmapImage;
  SlidesTimer: LongWord;
  Pic: Byte;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure ShowRandomPics;
begin
  Pic := Random(SlidesNumber);
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_' + IntToStr(Pic+1) + '.bmp'));
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
  z: Byte;
begin
  case CurStep of
    ssInstall:
    begin
      { SplashImage }
      SplashImage := TBitmapImage.Create(nil);
      with SplashImage do
      begin
        SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.Bevel.Top)
        Parent := WizardForm.InstallingPage;
        Stretch := True;
        Pic := Random(SlidesNumber);
        ExtractTemporaryFile('Image_' + IntToStr(Pic+1) + '.bmp');
        Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_' + IntToStr(Pic+1) + '.bmp'));
      end;
      WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
      for z := 1 to SlidesNumber do if not FileExists(ExpandConstant('{tmp}\Image_' + IntToStr(z) + '.bmp')) then ExtractTemporaryFile('Image_'+inttostr(z)+'.bmp');
      SlidesTimer := SetTimer(WizardForm.Handle, 7, SlideRenewTine*1000, CallbackAddr('ShowRandomPics'));
    end;
   
    ssPostInstall:
    begin
      KillTimer(WizardForm.Handle, SlidesTimer);
      SplashImage.Free;
    end;
  end;
end;

procedure DeInitializeSetup();
begin
  KillTimer(WizardForm.Handle, SlidesTimer);
end;


Gnom_aka_Lexander 14-02-2013 22:42 2090659

Nightwishh, както так:
Код:

procedure ShowRandomPics;
begin
  Pic := Pic+1;
  if Pic = SlidesNumber then Pic := 0;
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_' + IntToStr(Pic+1) + '.bmp'));
end;


Tco 03 15-02-2013 19:56 2091440

Всем привет! Подскажите, пожалуйста, кто знает или кто сталкивался, на примере этого кода:
читать дальше »
Код:

function NextButtonClick(CurPage: Integer): Boolean;
var
  sz:Integer;
  s:string;
    begin
  Result:=True;
 If CurPage=6 then
 //Проверка присутствия определенных файлов в папке с установленной программой на странице выбора папки назначения
  begin
 If (FileSearch('Main.exe', ExpandConstant('{app}'))='')
 or (FileSearch('Comp.dll', ExpandConstant('{app}')+'\data')='')
then
  begin
  s:='Извините, в директории '+ExpandConstant('{app}')+'' #13 'не обнаружены файлы, подтверждающие подлинность программы.' #13#13 'Пожалуйста, выберите правильный путь для установки обновления.';
  MsgBox(s, mbError, mb_Ok);
  Result:= False
end
else
 //И проверка размера оригинальных файлов
  begin
 If FileSize(ExpandConstant('{app}')+'\Main.exe', sz)
then
  begin
 If sz<>270336 //Проверяемый размер в байтах
then
  begin
  s:='Размер установленого компонента Main.exe не соответствует.' #13#13 'Для установки обновления требуются оригинальные файлы.';  MsgBox(s, mbCriticalError, mb_Ok);
  Result:= False
  end else
  begin
 If FileSize(ExpandConstant('{app}')+'\data\Comp.dll', sz)
then
  begin
 If sz<>3688328
then
  begin
  s:='Размер установленого компонента Comp.dll не соответствует.' #13#13 ' Для установки обновления требуются оригинальные файлы.';  MsgBox(s, mbCriticalError, mb_Ok);
  Result:= False
end;
end;
end;
end;
end;
end;
end;


Возможно ли как-то размер файлов считать с файла INI, а то файлы (по замыслу) должны загружаются через интернет всегда одним установщиком и размер файлов прописывать в установщике (по понятным причинам) бесмысленно.

Gnom_aka_Lexander 15-02-2013 20:04 2091447

функция GetIniInt, возвращает целочисленное значение. записать можно с помощью функции SetIniInt. Как ими воспользоваться - нужно посмотреть в справке, мне сейчас лень чего-то, день тяжелый был.

Tco 03 15-02-2013 23:13 2091585

Разобрался...
Вот, может кому пригодится:
IniFile:= 'C:\Program Files\Project\Bin\Version.ini';
if FileExists(IniFile) then begin
GetIniInt('sz', '587452145', 0, 0, 0, IniFile);

Nightwishh 16-02-2013 02:17 2091676

Здравствуйте, можно ли изменить цвет стандартных чекбоксов в ComponentsList-е и TasksList-е через скин (почему-то NoIconsCheck меняется, а эти нет), на стиль NoIconsCheck?

EvilAlex 16-02-2013 10:27 2091764

Вложений: 1
Доброго времени суток.
Хотел спросить, возможно ли в инно реализовать такую фишку -

alert30 16-02-2013 11:24 2091787

EvilAlex, аналогично где-то спрашивал в 4-ой части.

insombia 16-02-2013 11:49 2091801

Dima-WAR ну в принципе можно,думаю умельцы тебе подскажут

Johny777 16-02-2013 16:37 2091992

alert30, EvilAlex,


код:
читать дальше »
Код:

[Setup]
AppName=777
AppVerName=777
DefaultDirname=C:\Program Files (x86)\Source Engine 15\common\half-life 2\platform
Compression=none


[Files]
Source: C:\Program Files (x86)\Source Engine 15\common\half-life 2\hl2\maps\*; DestDir: {app}; BeforeInstall: BetterInfo();


[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  MAX_PATH = 260;
  PATH_LEN = 69;
   
var
  hInfoPath, hInfoFile: HWND;

function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function PathCompactPathEx(pszOut: String; pszSrc: String; cchMax: UINT; dwFlags: DWORD): BOOL; external 'PathCompactPathEx{#A}@shlwapi.dll stdcall';
function CompactPath(const sInput: String; const iNewLen: Integer): String;
begin
  SetLength(Result, MAX_PATH);
  if not PathCompactPathEx(Result, sInput, iNewLen, 0) then Result := sInput;
end;

procedure BetterInfo();
var
  CurrentFile: String;
begin
  CurrentFile := ExpandConstant(CurrentFilename);
  SetWindowText(hInfoPath, 'Директория:' + #32 + CompactPath(RemoveBackslash(ExtractFilePath(CurrentFile)), PATH_LEN));
  SetWindowText(hInfoFile,  StringOfChar(#32, 12) + 'Файл:' + #32 + ExtractFileName(CurrentFile));
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    with TNewStaticText.Create(WizardForm) do
    begin
      Parent := FilenameLabel.Parent;
      SetBounds(FilenameLabel.Left, ScaleY(0), ProgressGauge.Width, ScaleY(16));
      hInfoPath := Handle;
      AutoSize := False;
    end;
    with TNewStaticText.Create(WizardForm) do
    begin
      Parent := FilenameLabel.Parent;
      SetBounds(FilenameLabel.Left, ScaleY(20), ProgressGauge.Width, ScaleY(16));
      hInfoFile := Handle;
      AutoSize := False;
    end;
    FilenameLabel.Hide;
    StatusLabel.Hide;
  end;
end;



==================================================================================================== ===========

Nightwishh,
Цитата:

Цитата Nightwishh
можно ли изменить цвет стандартных чекбоксов в ComponentsList-е и TasksList-е через скин »

нет, это неисправленный косяк скинирования!
Геморно но можно создать скроллбокс и массив радиобаттонов и чекбоксов и всё это добавлять на него, через самописную функцию, если так нужен именно чеклистбокс. Короче кастомный чеклистбокс

Nightwishh 16-02-2013 20:17 2092160

Johny777, Ясно, вообщем трогать я это не буду :-) спасибо.
И последний вопрос. Можно ли запустить инсталл только один раз, т.е. при запущеном setup.exe нельзя было запустить его ещё раз и выдовалось сообщение, типо "Программа запущена". Спасибо!!!

Gnom_aka_Lexander 16-02-2013 21:37 2092208

Nightwishh, в секции сетап есть параметры мьютекса, которые для этого и служат. почитай про них в справке. еще в коде есть функции для работы с мьютексами.

ChVL 16-02-2013 22:05 2092222

Как к стандартному файлу unins000.exe прикрутить свою иконку? Именно свою, а не ту, что имеет исполняемый файл.

Знаю, как это делается через секцию [Icons], но мне это не надо. Точнее, не нужен unins000.exe в меню Пуск.
Где-то было, но потерял...

dracosha 16-02-2013 23:11 2092269

ChVL

Код:

[Setup]
UninstallIconFile={#MyAppProjectPath}\Installer\uninst.ico

В справке написано что эта функция не используется с версии 5.0, но она работает.

ChVL 16-02-2013 23:57 2092307

dracosha,
Спасибо, уже вспомнил. Сделал проще:
Код:

[Setup]
UninstallIconFile=unins.ico

В этом случае положить её надо рядом со скриптом, по аналогии с иконкой для исполняемого файла (чтоб в {app} не светились).

EvilAlex 17-02-2013 13:40 2092515

Вложений: 1
Цитата:

Цитата Johny777
alert30, EvilAlex,
код:
читать дальше » »

Супер, спасибо ! Но возник еще 1 вопрос, его можно к исдону сделать ?
Чтобы при распаковке арка или срепа, он отображал куда и что извлекает?

habib2302 17-02-2013 14:43 2092564

люди.помогите мне исправить эту ошибку

Error: Custom message name may only include alphanumeric characters and/or underscores, and cannot begin with a number.

вот часть скрипта на которую он ругается
Код:

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач;
Name: soft; Description: Установка Дополнительного ПО
Name: soft\msv; Description: Microsoft Visual C++

[CustomMessages]
Создать Ярлыки:=Create Shortcuts:
На Рабочем Столе=On the Desktop
В Панели Задач=In the Taskbar
Установка Дополнительного ПО=Install Additional Software


saurn 17-02-2013 16:25 2092628

habib2302

Надо так:


Код:

[Tasks]
Name: icons; Description: {cm:CreateShortcuts};
Name: icons\desktop; Description: {cm:OntheDesktop};
Name: icons\quicklaunchicon; Description: {cm:IntheTaskbar};
Name: soft; Description: {cm:InstallAdditionalSoftware}
Name: soft\msv; Description: Microsoft Visual C++

[CustomMessages]
CreateShortcuts=Создать Ярлыки
OntheDesktop=На Рабочем Столе
IntheTaskbar=В Панели Задач
InstallAdditionalSoftware=Установка Дополнительного ПО


habib2302 17-02-2013 16:36 2092641

saurn, оно как было на русском так и осталось.а мне нужно чтобы стало на английском

saurn 17-02-2013 16:41 2092646

habib2302,

Можно просто вот так:

Код:

[Tasks]
Name: icons; Description: Create Shortcuts:;
Name: icons\desktop; Description: On the Desktop;
Name: icons\quicklaunchicon; Description: In the Taskbar;
Name: soft; Description: Install Additional Software
Name: soft\msv; Description: Microsoft Visual C++


habib2302 17-02-2013 16:46 2092651

saurn, так любой дурак может

saurn 17-02-2013 17:21 2092691

habib2302, тебе просто нужно сделать описание задачи через кастомные сообщения, или что? Если просто описание, то я это написал в первом примере, только русские названия заменить на английские. Или нужно менять описания в зависимости от выбранного языка?

Вообщем либо, так:
читать дальше »
[Tasks]
Name: icons; Description: {cm:CreateShortcuts};
Name: icons\desktop; Description: {cm:OntheDesktop};
Name: icons\quicklaunchicon; Description: {cm:IntheTaskbar};
Name: soft; Description: {cm:InstallAdditionalSoftware}
Name: soft\msv; Description: Microsoft Visual C++

[CustomMessages]
CreateShortcuts=Create Shortcuts:
OntheDesktop=On the Desktop
IntheTaskbar=In the Taskbar
InstallAdditionalSoftware=Install Additional Software:


Либо так:
читать дальше »
[Languages]
Name: ru; MessagesFile: "compiler:Languages\Russian.isl"
Name: en; MessagesFile: "compiler:Languages\English.isl"

[Tasks]
Name: icons; Description: {cm:CreateShortcuts};
Name: icons\desktop; Description: {cm:OntheDesktop};
Name: icons\quicklaunchicon; Description: {cm:IntheTaskbar};
Name: soft; Description: {cm:InstallAdditionalSoftware}
Name: soft\msv; Description: Microsoft Visual C++

[CustomMessages]
ru.CreateShortcuts=Создать Ярлыки:
ru.OntheDesktop=На Рабочем Столе
ru.IntheTaskbar=В Панели Задач
ru.InstallAdditionalSoftware=Установка Дополнительного ПО:

en.CreateShortcuts=Create Shortcuts:
en.OntheDesktop=On the Desktop
en.IntheTaskbar=In the Taskbar
en.InstallAdditionalSoftware=Install Additional Software:

EvilAlex 18-02-2013 12:00 2093239

Вложений: 2
И последний вопрос, надеюсь поможете)))

Возможно ли сделать так как на рисунке, не вертикальным столбцом который приходиться прокручивать, а в горизонтальный ряд ?
И добавить еще 1 пункт Никнейм, чтобы было поле куда вписывать, для регистрации в реестре, если конечно есть возможность))

TERMINAL 18-02-2013 14:31 2093344

Как и где можно указать иемя файла не unins000.exe, а Uninstall.exe ?

Tco 03 18-02-2013 15:33 2093403

Всем привет.
Johny777
Вы, как я понимаю, пользуетесь (или пользовались) этим кодом. Да, действительно код хорош! :good: Не могли бы Вы, пожалуйста, подсказать, как в этом коде отделить функцию распаковки и запаковки. То есть, мне нужна только функция распаковки. Это надо, так сказать бо большому счёту для истетики :boast: чтобы в коде не было ничего лишнего. И возможно ли добавить к нему кнопку "Отмена"?

EvilAlex
Возможно так сделать, но это нужно делать отдельно, то есть нужно создавать радиобаттоны в ручную!
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.

[*Code]
var
  NewRadioButton1: TNewRadioButton;
  NewRadioButton2: TNewRadioButton;

procedure RedesignWizardForm;
begin
  NewRadioButton1 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton1 do
  begin
    Name := 'NewRadioButton1';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(256);
    Top := ScaleY(248);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Checked := true;
  end;

  NewRadioButton2 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton2 do
  begin
    Name := 'NewRadioButton2';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(256);
    Top := ScaleY(280);
    Width := ScaleX(113);
    Height := ScaleY(17);
  end;

  NewRadioButton1.TabOrder := 2;
  NewRadioButton2.TabOrder := 3;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;

Потом делать проверку что выбрано.

TERMINAL
Как вариант, могу предложить так:
читать дальше »
Код:


procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssPostInstall then
begin
  RenameFile(ExpandConstant('{app}\unins000.exe'), ExpandConstant('{app}\Uninstall.exe'));
  RenameFile(ExpandConstant('{app}\unins000.dat'), ExpandConstant('{app}\Uninstall.dat'));
end;
end;

И при неободимости в секции [Setup] пишем:
UninstallDisplayIcon={app}\Uninstall.exe

Shegorat 18-02-2013 16:34 2093455

Цитата:

Цитата TERMINAL
Как и где можно указать иемя файла не unins000.exe, а Uninstall.exe ? »

Когда-то очень давно я писал такой код
читать дальше »
Код:

#define CodeUninstallName "MyApp"

[Setup]
AppId={{4A546E5C-3484-4B20-80AC-1AB2DE5E4B81}
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
UninstallFilesDir={app}\Uninstall

[ code]
procedure RenameUninstall();
var
  UninstallDat, UninstallExe,
  NewUninstallExe, NewUninstallDat,
  RegUninstallString, RegQuietUninstallString,
  AppID: String;
begin
  UninstallDat:= ExpandConstant('{uninstallexe}');
  StringChange(UninstallDat, '.exe', '.dat');
  UninstallExe:= ExpandConstant('{uninstallexe}');
  NewUninstallExe:= ExpandConstant('{app}\Uninstall\Uninstall {#CodeUninstallName}.exe')
  NewUninstallDat:= ExpandConstant('{app}\Uninstall\Uninstall {#CodeUninstallName}.dat');
    if FileExists(NewUninstallDat) or FileExists(NewUninstallExe) then
    begin
      DeleteFile(NewUninstallDat)
      DeleteFile(NewUninstallExe)
    end;
  RenameFile(UninstallExe, NewUninstallExe);
  RenameFile(UninstallDat, NewUninstallDat);
 
  AppID:= ExpandConstant('{#SetupSetting("AppID")}');
   
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'UninstallString', RegUninstallString)
  RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'QuietUninstallString', RegQuietUninstallString)
  StringChange(RegUninstallString, UninstallExe, NewUninstallExe)
  StringChange(RegQuietUninstallString, UninstallExe, NewUninstallExe)
  RegWriteStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'UninstallString', RegUninstallString)
  RegWriteStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + AppID + '_is1', 'QuietUninstallString', RegQuietUninstallString)
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep=ssPostInstall then
    RenameUninstall();
end;


EvilAlex 18-02-2013 16:42 2093469

Цитата:

Цитата Tco 03
EvilAlex
Возможно так сделать, но это нужно делать отдельно, то есть нужно создавать радиобаттоны в ручную!
читать дальше » »

А как сделать так чтобы боттоны занли что выбирает пользователь ? надо приписывать код или это автоматически ?

Johny777 18-02-2013 16:57 2093480

Цитата:

Цитата Tco 03
чтобы в коде не было ничего лишнего »

Мне иногда страшно представить сколько лишнего(мусорного) кода содержит ассемблерный код, скомпилированный из чистого, без лишних переменных и функций скрипта тк думаю что компилятору инно далеко до например дельфи 2010 :(
вот только сжатие. Константы все наместе, тк если будет ошибка, то поймёшь что означает по имени константы
читать дальше »
Код:

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

[Files]
Source: 7-zip32.dll; Flags: ignoreversion dontcopy nocompression solidbreak sortfilesbyextension

[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
    // codes returned by SevenZipCreateArchive and SevenZipExtractArchive
    SZ_OK = 0;
    SZ_ERROR = 1;
    SZ_CANCELLED = 2;
    SZ_DLLERROR = 3;

    FNAME_MAX32 = 512;

    // these get returned as nState in the Callback function
    ARCEXTRACT_BEGIN = 0;
    ARCEXTRACT_INPROCESS = 1;
    ARCEXTRACT_END = 2;
    ARCEXTRACT_OPEN = 3;
    ARCEXTRACT_COPY = 4;

    // Errors
    ERROR_START = $8000;

    // WARNING
    ERROR_DISK_SPACE = $8005;
    ERROR_READ_ONLY = $8006;
    ERROR_USER_SKIP = $8007;
    ERROR_UNKNOWN_TYPE = $8008;
    ERROR_METHOD = $8009;
    ERROR_PASSWORD_FILE = $800A;
    ERROR_VERSION = $800B;
    ERROR_FILE_CRC = $800C;
    ERROR_FILE_OPEN = $800D;
    ERROR_MORE_FRESH = $800E;
    ERROR_NOT_EXIST = $800F;
    ERROR_ALREADY_EXIST = $8010;
    ERROR_TOO_MANY_FILES  = $8011;

    // ERROR
    ERROR_MAKEDIRECTORY = $8012;
    ERROR_CANNOT_WRITE = $8013;
    ERROR_HUFFMAN_CODE = $8014;
    ERROR_COMMENT_HEADER = $8015;
    ERROR_HEADER_CRC = $8016;
    ERROR_HEADER_BROKEN = $8017;
    ERROR_ARC_FILE_OPEN = $8018;
    ERROR_NOT_ARC_FILE = $8019;
    ERROR_CANNOT_READ  = $801A;
    ERROR_FILE_STYLE = $801B;
    ERROR_COMMAND_NAME = $801C;
    ERROR_MORE_HEAP_MEMORY = $801D;
    ERROR_ENOUGH_MEMORY = $801E;
    ERROR_ALREADY_RUNNING = $801F;
    ERROR_USER_CANCEL = $8020;
    ERROR_HARC_ISNOT_OPENED = $8021;
    ERROR_NOT_SEARCH_MODE = $8022;
    ERROR_NOT_SUPPORT = $8023;
    ERROR_TIME_STAMP = $8024;
    ERROR_TMP_OPEN = $8025;
    ERROR_LONG_FILE_NAME = $8026;
    ERROR_ARC_READ_ONLY = $8027;
    ERROR_SAME_NAME_FILE = $8028;
    ERROR_NOT_FIND_ARC_FILE = $8029;
    ERROR_RESPONSE_READ = $802A;
    ERROR_NOT_FILENAME = $802B;
    ERROR_TMP_COPY = $802C;
    ERROR_EOF = $802D;
    ERROR_ADD_TO_LARC = $802E;
    ERROR_TMP_BACK_SPACE = $802F;
    ERROR_SHARING = $8030;
    ERROR_NOT_FIND_FILE = $8031;
    ERROR_LOG_FILE = $8032;
    ERROR_NO_DEVICE = $8033;
    ERROR_GET_ATTRIBUTES = $8034;
    ERROR_SET_ATTRIBUTES = $8035;
    ERROR_GET_INFORMATION = $8036;
    ERROR_GET_POINT = $8037;
    ERROR_SET_POINT = $8038;
    ERROR_CONVERT_TIME = $8039;
    ERROR_GET_TIME = $803A;
    ERROR_SET_TIME = $803B;
    ERROR_CLOSE_FILE = $803C;
    ERROR_HEAP_MEMORY = $803D;
    ERROR_HANDLE = $803E;
    ERROR_TIME_STAMP_RANGE = $803F;
    ERROR_MAKE_ARCHIVE = $8040;
    ERROR_NOT_CONFIRM_NAME = $8041;
    ERROR_UNEXPECTED_EOF = $8042;
    ERROR_INVALID_END_MARK = $8043;
    ERROR_INVOLVED_LZH = $8044;
    ERROR_NO_END_MARK = $8045;
    ERROR_HDR_INVALID_SIZE = $8046;
    ERROR_UNKNOWN_LEVEL = $8047;
    ERROR_BROKEN_DATA = $8048;
    ERROR_7ZIP_START = $8100;
    ERROR_WARNING = $8101;
    ERROR_FATAL = $8102;
    ERROR_DURING_DECOMPRESSION = $8103;
    ERROR_DIR_FILE_WITH_64BIT_SIZE = $8104;
    ERROR_FILE_CHANGED_DURING_OPERATION = $8105;

    FA_RDONLY = $01;
    FA_HIDDEN = $02;
    FA_SYSTEM = $04;
    FA_LABEL = $08;
    FA_DIREC = $10;
    FA_ARCH = $20;
    FA_ENCRYPTED = $40;

    ARCHIVETYPE_ZIP = 1;
    ARCHIVETYPE_7Z = 2;

    WM_USER = $400;
    PBM_SETPOS = (WM_USER + 2);


type
    HARC = Longint;

    EXTRACTINGINFO = record
        dwFileSize: DWORD;                                  // Size of all the housing files. When entire size 0xFFFFFFFF (-1) it is above, 0xFFFFFFFF (-1) it houses.
        dwWriteSize: DWORD;                                // The entire size which processed with compression thawing processing. When dwFileSize 0xFFFFFFFF (-1) is, entire processing ratio (permill) it houses.
        szSourceFileName: array [0..FNAME_MAX32] of Byte;  // The housing file name which processes.
        dummy1: array [0..2] of Byte;
        szDestFileName: array [0..FNAME_MAX32] of Byte;    // The path name which actually is written.
        dummy: array [0..2] of Byte;
    end;

    // Callback func should return FALSE to cancel the archiving process, else TRUE
    ARCHIVERPROC = function(_hwnd: HWND; _uMsg: UINT; _nState: UINT; _lpEis: Longint): BOOL;

function SevenZip(const _hwnd: HWND; _szCmdLine: PAnsiChar; _szOutput: AnsiString; const _dwSize: DWORD): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
function SevenZipSetOwnerWindowEx(_hwnd: HWND; _lpArcProc: Longint): BOOL; external 'SevenZipSetOwnerWindowEx@files:7-zip32.dll stdcall';
function SevenZipKillOwnerWindowEx(_hwnd: HWND): BOOL; external 'SevenZipKillOwnerWindowEx@files:7-zip32.dll stdcall';
function RtlMoveMemory(var Destination: EXTRACTINGINFO; const Source: Longint; len: Integer): Integer; external 'RtlMoveMemory@kernel32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';


const
    CP_ACP    = 0;            { default to ANSI code page }
    CP_OEMCP  = 1;            { default to OEM  code page }

function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpDefaultChar: Integer; lpUsedDefaultChar: Integer): Longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function StringToWideString(const aStr: string; codePage: Word): string;
var
    len: Integer;
begin
    len := MultiByteToWideChar(codePage, 0, aStr, -1, '', 0);
    if len > 0 then
    begin
        SetLength(Result, (len*2)-2);
        MultiByteToWideChar(codePage, 0, aStr, -1, Result, Length(Result));
    end;
end;

function WideStringToString(const wStr: string; codePage: Word): string;
var
    len: Integer;
begin
    len := WideCharToMultiByte(codePage, 0, wStr, -1, '', 0, 0, 0);
    if len > 0 then
    begin
        SetLength(Result, len-1);
        WideCharToMultiByte(codePage, 0, wStr, -1, Result, Length(Result), 0, 0);
    end;
end;

function AnsiToDos(const SourceStr: string): string;
begin
    Result := WideStringToString(StringToWideString(SourceStr, CP_ACP), CP_OEMCP);
end;



var
    szStatus: TNewStaticText;
    ei: EXTRACTINGINFO;
    ProgressPage: TOutputProgressWizardPage;
    hProgress, hMsg1Label, hMsg2Label: HWND;
    Cancel: boolean;
    DestPath: String;
    MyPrgBar: TNewProgressBar;

function ByteArrayToString(cArray: array of Byte): String;
begin
    Result := '';
    while cArray[Length(Result)] <> 0 do Insert(Chr(cArray[Length(Result)]), Result, Length(Result)+1);
end;

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], SizeOf(pszBuf));
    except end;
end;

function ArchiverCallbackProc(_hwnd: HWND; _uMsg, _nState: UINT; _lpEis: Longint): BOOL;
var
    dwCurrentSize: Single;
begin
    Result := True;
    case _nState of
        ARCEXTRACT_BEGIN: SetWindowText(hMsg1Label, 'Status: scanning');
        ARCEXTRACT_INPROCESS:
        begin
          // if Cancel then Exit;
            RtlMoveMemory(ei, _lpEis, SizeOf(ei));
            dwCurrentSize := ei.dwWriteSize;
            PostMessage(hProgress, PBM_SETPOS, Round(65535*(dwCurrentSize/ei.dwFileSize)), 0);
            SetWindowText(hMsg1Label, 'Status: compressing');
            SetWindowText(hMsg2Label, FormatFloat('Progress: 0.#0 %', (dwCurrentSize*100)/ei.dwFileSize));
            SetWindowText(_hwnd, 'File: ' + ByteArrayToString(ei.szSourceFileName) + #13#10 +
            'Total size: ' + BytesToSize(ei.dwFileSize) + #13#10 +
            'Current size: ' + BytesToSize(ei.dwWriteSize));
            Result := not Cancel;
        end;
        ARCEXTRACT_END: Result := False;
        ARCEXTRACT_OPEN: SetWindowText(hMsg1Label, 'Status: open archive');
    end;
end;

procedure Cancel7ZipWork(Sender: TObject);
begin
    Cancel := True;
end;

/////////////////////
procedure CreateSevenZipProgressPage;
begin
    ProgressPage := CreateOutputProgressPage('7-zip', '');
    szStatus := TNewStaticText.Create(ProgressPage);
    with szStatus do
    begin
        Parent := ProgressPage.Surface;
        WordWrap := True;
        SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(30), ProgressPage.Surface.Width, ScaleY(300));
    end;
    MyPrgBar := TNewProgressBar.Create(nil)
    with MyPrgBar do
    begin
        Parent := ProgressPage.Surface;
        SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(140), ProgressPage.Surface.Width, ScaleY(27));
    end;
    with TButton.Create(nil) do
    begin
        Parent := ProgressPage.Surface;
        Caption := 'Cancel';
        SetBounds(ScaleX(0), ProgressPage.ProgressBar.Top + ScaleY(90), ScaleX(75), ScaleY(25));
        OnClick := @Cancel7ZipWork;
    end;
end;


//////////////////////////////////////////////////////
function SevenZipCreateArchive(hWnd: HWND; ArchiveFilename, BaseDirectory: String; FileList : TArrayOfString; CompressionLevel: Integer; CreateSolidArchive: Boolean; RecurseFolders: Boolean; Password, Sfx: String; ShowProgress: Boolean; Callback: Longint): Integer;
var
    S7ResultOutput, s7cmd, cwd: AnsiString;
    i: Integer;
begin
    Result := SZ_ERROR;
    if not SetCurrentDir(BaseDirectory) then Exit;
    //
    cwd := GetCurrentDir;
   
    if Callback <> 0 then ShowProgress := False;
    try
        if GetArrayLength(FileList) > 0 then
        begin
            s7cmd := 'a "' + AnsiToDos(ArchiveFilename) + '" "' + RemoveQuotes(FileList[0]) + '"';
            for i := 1 to GetArrayLength(FileList)-1 do
            begin
                s7cmd := s7cmd + ' -i';
                if RecurseFolders then s7cmd := s7cmd + 'r';
                s7cmd := s7cmd + '!"' + RemoveQuotes(FileList[i]) + '"';
            end;
        end;
        s7cmd := s7cmd + ' -mx' + IntToStr(CompressionLevel);
        if RecurseFolders then s7Cmd := s7cmd + ' -r';
        if Password <> '' then s7Cmd := s7Cmd + ' -p' + Password;
        if CreateSolidArchive then s7cmd := s7cmd + ' -ms=on' else s7cmd := s7cmd + ' -ms=off';
        if not ShowProgress then s7cmd := s7cmd + ' -hide';
        if Length(Sfx) > 0 then s7cmd := s7cmd + ' -sfx' + Sfx;
        try
            s7ResultOutput := StringOfChar(#0, 10240);
            if Callback <> 0 then
            begin
                //get handles for 7-zip callback thread
                hProgress := ProgressPage.ProgressBar.Handle;
                hMsg1Label := ProgressPage.Msg1Label.Handle;
                hMsg2Label := ProgressPage.Msg2Label.Handle;
                //show progress page
                ProgressPage.Show;
                ProgressPage.ProgressBar.Show;
                ProgressPage.Description := 'Compress';
                //set callback
                SevenZipSetOwnerWindowEx(hWnd, Callback);
            end;
            Result := SevenZip(hWnd, s7cmd, s7ResultOutput, Length(s7ResultOutput)-1);
        finally
            if Callback <> 0 then
            begin
                ProgressPage.Hide;
                SevenZipKillOwnerWindowEx(hWnd);
            end;
            //MsgBox(S7ResultOutput, mbInformation, MB_OK);
        except
            Result := SZ_DLLERROR;
        end;
    finally
        SetCurrentDir(cwd);
    end;
end;

procedure InitializeWizard();
begin
    Cancel := True;
    CreateSevenZipProgressPage;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
    if CurPageID = wpWelcome then
    begin
        Cancel := False;
        DestPath := 'c:\setup'
        // compress with callback
        SevenZipCreateArchive(szStatus.Handle, 'C:\123.7z', 'c:\setup', ['common\*'], 1, True, False, '', '', False, CallbackAddr('ArchiverCallbackProc'));
        // compress without callback
        //SevenZipCreateArchive(szStatus.Handle, 'd:\123.7z', 'd:\', 'SkypeSetupFull.exe', 1, True, False, '', '', True, 0);
        Result := True;
    end;
end;


Цитата:

Цитата Tco 03
TERMINAL
Как вариант, могу предложить так: »

его нельзя переименовывать так просто :( тк путь к экзешнику лежит в реестре и по нему, пути, вызывается удаление
TERMINAL, нужно так:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
AppId=proto_15
 
[  Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep=ssPostInstall then
  begin
    if not RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'QuietUninstallString', '"' + ExpandConstant('{app}\Uninstall.exe') + '"' + #32 + '/SILENT') then Exit;
    if RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', '"' + ExpandConstant('{app}\Uninstall.exe') + '"') then
    RenameFile(ExpandConstant('{app}\unins000.exe'), ExpandConstant('{app}\Uninstall.exe'));
    if RegWriteStringValue(HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallDataFile', '"' + ExpandConstant('{app}\Uninstall.dat') + '"') then
    RenameFile(ExpandConstant('{app}\unins000.dat'), ExpandConstant('{app}\Uninstall.dat'));
  end;
end;



UPD
Shegorat, пардон, не увидел :)

Tco 03 18-02-2013 17:37 2093516

Johny777
Цитата:

Цитата Johny777
его нельзя переименовывать так просто тк путь к экзешнику лежит в реестре и по нему, пути, вызывается удаление »

По мне так зачем это вообще нужно делать. Сразу же при повторной установке рядом создаётся файл unins000.exe Тут типа нужно делать проверку об установлееной программе или ещё что..., а так, никакой эстетики :teeth: Мысли в слух: Кому придёт в голову сразу же повторно устанавливать прогу... :crazy:

EvilAlex
Цитата:

Цитата EvilAlex
А как сделать так чтобы боттоны занли что выбирает пользователь ? надо приписывать код или это автоматически ? »

Радиобаттонами я не пользуюсь...
Вот пример проверки чекбоксов:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: 1.zip; DestDir: {app}\File1.exe; Check: NewCheckBox1Result;
Source: 2.zip; DestDir: {app}\File2.exe; Check: NewCheckBox2Result;

[  Code]
var
  NewCheckBox1: TNewCheckBox;
  NewCheckBox2: TNewCheckBox;
 
function NewCheckBox1Result: boolean;
begin
  Result:=NewCheckBox1.Checked;
end;

function NewCheckBox2Result: boolean;
begin
  Result:=NewCheckBox2.Checked;
end;

procedure NewCheckBox1Click(Sender: TObject);
begin
  if NewCheckBox1.Checked then begin
    NewCheckBox2.Checked:= false;
    NewCheckBox2.Enabled:= false;
  end
  else if not NewCheckBox1.Checked then begin
    NewCheckBox2.Enabled:= True;
  end;
end;

procedure NewCheckBox2Click(Sender: TObject);
begin
  if NewCheckBox2.Checked then begin
    NewCheckBox1.Checked:= false;
    NewCheckBox1.Enabled:= false;
  end
  else if not NewCheckBox2.Checked then begin
    NewCheckBox1.Enabled:= True;
  end;
end;

procedure RedesignWizardForm;
begin
  NewCheckBox1 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox1 do
  begin
    Name := 'NewCheckBox1';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(208);
    Top := ScaleY(208);
    Width := ScaleX(97);
    Height := ScaleY(17);
    OnClick := @NewCheckBox1Click;
  end;

  NewCheckBox2 := TNewCheckBox.Create(WizardForm);
  with NewCheckBox2 do
  begin
    Name := 'NewCheckBox2';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(208);
    Top := ScaleY(232);
    Width := ScaleX(97);
    Height := ScaleY(17);
    OnClick := @NewCheckBox2Click;
  end;

  NewCheckBox1.TabOrder := 2;
  NewCheckBox2.TabOrder := 3;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;


Вот также пример из Help-а, чекбоксы работают как радиобаттоны:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.7
DefaultDirName={pf}\My Program
OutputDir=.

[  Code]
var
Check: array [0..2] of TCheckBox;

procedure Check0(Sender: TObject);
begin
if Check[0].Checked then
begin
Check[1].Checked := False;
Check[2].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[0].Checked := True;
end;

procedure Check1(Sender: TObject);
begin
if Check[1].Checked then
begin
Check[0].Checked := False;
Check[2].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[1].Checked := True;
end;

procedure Check2(Sender: TObject);
begin
if Check[2].Checked then
begin
Check[0].Checked := False;
Check[1].Checked := False;
end;

if (Check[0].Checked = False) and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[2].Checked := True;
end;

procedure InitializeWizard();
begin
Check[0] := TCheckBox.Create(WizardForm);
with Check[0] do
begin
Parent := WizardForm.SelectDirPage;
Checked := True;
Top := ScaleY(100);
OnClick := @Check0;
Caption := 'Чекбокс №1';
end;

Check[1] := TCheckBox.Create(WizardForm);
with Check[1] do
begin
Parent := WizardForm.SelectDirPage;
Top := ScaleY(120);
OnClick := @Check1;
Caption := 'Чекбокс №2';
end;

Check[2] := TCheckBox.Create(WizardForm);
with Check[2] do
begin
Parent := WizardForm.SelectDirPage;
Top := ScaleY(140);
OnClick := @Check2;
Caption := 'Чекбокс №3';
end;
end;


EvilAlex 18-02-2013 17:56 2093538

Вложений: 1
Tco 03, мне не для файла, а для ключа реестра... =)

Tco 03 18-02-2013 18:22 2093559

Цитата:

Цитата EvilAlex
мне не для файла, а для ключа реестра... »

Ну и делайте с функцией Check всё что угодно!

В данном случаи при выборе NewCheckBox1 данные в реестре будут такие:
[Registry]
Root: HKLM; SubKey: "Software\My Programm\"; ValueType: string; ValueName: "ProductName"; ValueData: "My Programm"; Flags: uninsdeletekeyifempty; Check: NewCheckBox1Result;

При выборе NewCheckBox2 соответственно такие:
[Registry]
Root: HKLM; SubKey: "Software\No My Programm\"; ValueType: string; ValueName: "ProductName"; ValueData: "No My Programm"; Flags: uninsdeletekeyifempty; Check: NewCheckBox2Result;

EvilAlex 18-02-2013 18:59 2093591

Tco 03, он ркгаеться почемуто...

Tco 03 18-02-2013 19:32 2093620

EvilAlex
Мда... Вообщем вот, смотрите. Чтобы сделать проверку на что-то, нужно сначала создать такую функцию. Пишем:

[Registry]
Root: HKCU; SubKey: Software\Webzen\Mu\Config; ValueType: dword; ValueName: Resolution; ValueData: 0; Check: NewRadioButton1Result;

[code]
var
NewRadioButton1: TNewRadioButton;

Вот эта функция на проверку чего-либо!
////////////////////////////////////////////////
function NewRadioButton1Result: Boolean;
begin
if NewRadioButton1.Checked
then
Result:= True;
end;
////////////////////////////////////////////////

Создаём радиобаттон для этой функции:

procedure InitializeWizard();
begin
NewRadioButton1 := TNewRadioButton.Create(WizardForm);
with NewRadioButton1 do
begin
Parent := WizardForm.WelcomePage;
Left := ScaleX(10);
Top := ScaleY(30);
Width := ScaleX(113);
Height := ScaleY(17);
Caption := '640x480';
end;
end;

EvilAlex 18-02-2013 19:35 2093625

Цитата:

Цитата Tco 03
function NewRadioButton1Result: Boolean;
begin
if NewRadioButton1.Checked
then
Result:= True;
end; »

если я правильно понял, то благодаря такой функции радиобаттон должен заработать ? и для каждого свой ?

Попробовал сделать, он мне выделяет только 1 из 11 радиобаттонв...
как сделать чтобы в каждой категории был активен 1 из 2-4 радиобаттон ?

Tco 03 18-02-2013 19:47 2093635

Он и так будет работать! Для каждой радиобаттон или для каждого чекбокса НЕОБХОДИМА такая функция (если Вы хотите привязать какую-то функцию к определённому радиобатон или чекбоксу)!
Так же, к примеру:
Если нужно привязать другой ключ к другой радиобаттон, то это уже будет совсем другая функция: Check: NewRadioButton2Result
Пример:
Root: HKCU; SubKey: Software\Webzen\Mu\Config; ValueType: dword; ValueName: WindowMode; ValueData: 1; Check: NewRadioButton2Result;
И так далее...

И да, к стати, секции [Components] и [Types] тут уже НЕ НУЖНЫ!

EvilAlex 18-02-2013 20:11 2093669

Все проблема решена....
Всем кто помог спасибище !

insombia 18-02-2013 20:34 2093679

http://i53.fastpic.ru/big/2013/0218/...d026fb76c5.jpg
как сделать новую папку чтобы при нажатии на неё создавалась сразу папка с названием игры
p.s.предыдущий ответ не подходит

semiono 19-02-2013 00:15 2093927

Нет ничего дурнее в паскале нумеровать строки вручную!

Код:

var
  S: TArrayOfString;
  F: String;
begin
  F := ExpandConstant('{win}\zzz.inf');
  SetArrayLength(S, 1005);
  S[0000] := ExpandConstant('zzz');
...
  S[1004] := ExpandConstant('zzz');
  SaveStringsToFile(F, S, False);
end;

Может какой-то способ есть автозамены в блокнте? Или избавится от этого в коде как-то??

semiono 19-02-2013 04:18 2093987

Johny777, надо проверить, спасибо!

Johny777 19-02-2013 05:06 2093992

semiono, Если я правильно понял, то вот накатал тебе булев функцию замены всех искомых строк/слов на нужную строку/слово в текстовом файле:
читать дальше »
Код:

function ReplaseStringInTextFile(const FileName, FromString, ToString: String): Boolean;
var
  uText: String;
begin
  if not FileExists(FileName) then Exit;
  if LoadStringFromFile(FileName, uText) then while Pos(FromString, uText) > 0 do StringChange(uText, FromString, ToString);
  Result := SaveStringToFile(FileName, uText, False);
end;

procedure InitializeWizard();
begin
  if ReplaseStringInTextFile('C:\A.txt', 'VALVE', 'SOFTWARE') then MsgBox('OK', mbError, MB_OK);
end;



==================================================================================================== ========================

Tco 03, Вот только распаковка 7-Zip архивов http://sendfile.su/764485
Цитата:

Цитата Tco 03
Вот пример проверки чекбоксов: »

оптимизировал принятие булев значений в методы чекбокса и функцию для Check:
изучай, пригодится :)
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.

[Files]
Source: 1.zip; DestDir: {app}\File1.exe; Check: CheckBoxResult('File1');
Source: 2.zip; DestDir: {app}\File2.exe; Check: CheckBoxResult('File2');

[ Code]
var
  NewCheckBox1: TNewCheckBox;
  NewCheckBox2: TNewCheckBox;

function CheckBoxResult(const FileName: String): boolean;
begin
  case FileName of
    'File1': Result := NewCheckBox1.Checked;
    'File2': Result := NewCheckBox2.Checked;
  end;
end;

procedure NewCheckBox1Click(Sender: TObject);
begin
  if not NewCheckBox1.Checked then NewCheckBox2.Checked:= false;
  NewCheckBox2.Enabled:= not NewCheckBox1.Checked;
end;


Цитата:

Цитата Tco 03
Кому придёт в голову сразу же повторно устанавливать прогу »

ну например не сразу, но у меня в инсталле 4 игры и иногда приходится доустановливать
Цитата:

Цитата Tco 03
Сразу же при повторной установке рядом создаётся файл unins000.exe »

это я не учёл - лечится переименованием файла обратно на этапе ssInstall
Цитата:

Цитата Tco 03
По мне так зачем это вообще нужно делать »

Ну, как известно с древних времён - каждый извращается по своему :)

==================================================================================================== ==============

insombia,
Цитата:

Цитата insombia
как сделать новую папку чтобы при нажатии на неё создавалась сразу папка с названием игры »

читать дальше »
Код:

[Setup]
AppName=777
AppVerName=777
DefaultDirname=C:\Setup
Compression=none


[  code]
var
  DirTreeView: TFolderTreeView;
  Edit: TEdit;
  Reset_Path_Button: TButton;


procedure DirFolderChange(Sender: TObject);
begin
  if TFolderTreeView(Sender).Directory <> WizardDirValue then Edit.Text := AddBackslash(TFolderTreeView(Sender).Directory) + '{#SetupSetting("AppName")}' else Edit.Text := TFolderTreeView(Sender).Directory;
  Reset_Path_Button.Enabled := Edit.Text <> RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'));
end;


procedure BrowseForm_Buttons_OnClick(Sender: TObject);
begin
  case TButton(Sender).Caption of
    'Reset':
    begin
      Edit.Text := RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'));
      TButton(Sender).Enabled := False;
    end;

    SetupMessage(msgButtonNewFolder):
    begin
      DirTreeView.CreateNewDirectory('Half-Life 2');
      Edit.Text := AddBackslash(DirTreeView.Directory) + '{#SetupSetting("AppName")}';
    end;

    SetupMessage(msgButtonOK): if Edit.Text <> WizardForm.DirEdit.Text then WizardForm.DirEdit.Text := Edit.Text;
  end;
end;


procedure BrowseClick(Sender: TObject);
var
  DefaultInstallPath: String;
  BrowseForm: TForm;
begin
  DefaultInstallPath := WizardDirValue;
  BrowseForm := TForm.Create(nil);
  with BrowseForm do
  begin
    ClientWidth := ScaleX(387);
    ClientHeight := ScaleY(364);
    Position := poScreenCenter;
    Caption := #32 + SetupMessage(msgBrowseDialogTitle);

    with TLabel.Create(nil) do
    begin
      SetBounds(ScaleX(7), ScaleY(4), ScaleX(207), ScaleY(16));
      Caption := SetupMessage(msgBrowseDialogLabel);
      Parent := BrowseForm;
    end;

    DirTreeView := TFolderTreeView.Create(nil)
    with DirTreeView do
    begin
      SetBounds(ScaleX(4), ScaleY(52), ScaleX(379), ScaleY(265));
      OnChange := @DirFolderChange;
      Parent := BrowseForm;
    end;

    ActiveControl := DirTreeView;

    Edit := TEdit.Create(nil);
    with Edit do
    begin
      SetBounds(ScaleX(4), ScaleY(25), ScaleX(379), ScaleY(21));
      Text := DirTreeView.Directory;
      Parent := BrowseForm;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(4), ScaleY(330), ScaleX(90), ScaleX(22));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonCancel);
      Cursor := crHand;
      ModalResult := mrCancel;
    end;

    Reset_Path_Button := TButton.Create(nil)
    with Reset_Path_Button do
    begin
      SetBounds(ScaleX(99), ScaleY(330), ScaleX(90), ScaleY(22));
      Parent := BrowseForm;
      Caption := 'Reset';
      Enabled := Edit.Text <> RemoveBackslash(ExpandConstant('{#SetupSetting("DefaultDirName")}'))
      Cursor := crHand;
      OnClick := @BrowseForm_Buttons_OnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(194), ScaleY(330), ScaleX(90), ScaleY(22));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonNewFolder);
      Cursor := crHand;
      OnClick := @BrowseForm_Buttons_OnClick;
    end;

    with TButton.Create(nil) do
    begin
      SetBounds(ScaleX(289), ScaleY(330), ScaleX(90), ScaleY(22));
      Parent := BrowseForm;
      Caption := SetupMessage(msgButtonOK);
      OnClick := @BrowseForm_Buttons_OnClick;
      Cursor := crHand;
      ModalResult := mrOk;
    end;

    DirTreeView.ChangeDirectory(AddBackslash(DefaultInstallPath), True);

    if ShowModal = mrOk then WizardForm.DirEdit.Text := Edit.Text else WizardForm.DirEdit.Text := DefaultInstallPath;

    Free;
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.DirBrowseButton.OnClick := @BrowseClick;
end;



======================================================= UPD ============================================================

вот кому интересно - функция для максимального снижения количества оперативки используемой текущим процессом путём выгрузки страниц на жёсткий диск
например с 1900 кб до 400 кб, но это влияет на производительность, так что без необходимости не использовать
можно и настроить используемый размер памяти (увеличить/уменшить) своими цифрами

читать дальше »
Код:

[Setup]
AppName=TrimWorkingSet
AppVerName=TrimWorkingSet
DefaultDirName={pf}\TrimWorkingSet

[  Code]
function SetProcessWorkingSetSize(hProcess: THandle; dwMinimumWorkingSetSize, dwMaximumWorkingSetSize: DWORD): BOOL; external 'SetProcessWorkingSetSize@kernel32.dll stdcall';
function GetCurrentProcess(): THandle; external 'GetCurrentProcess@kernel32.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): BOOL; external 'KillTimer@user32.dll stdcall';


function TrimWorkingSet(): BOOL;
begin
  Result := SetProcessWorkingSetSize(GetCurrentProcess, DWORD(-1), DWORD(-1));
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then SetTimer(WizardForm.Handle, 16, 1, CallbackAddr('TrimWorkingSet'));
end;


insombia 19-02-2013 14:00 2094232

del

tsskz 19-02-2013 15:40 2094324

Народ подскажите плиз, в общем у меня 3 архива
1 arc без сжатия data.arc
2 srep data.srp
3 arc сжатая папка игры data1.arc

код
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data1.arc'), ExpandConstant('{app}'), '', false , '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
if not ISSRepExtract ( 0, 0, ExpandConstant('{app}\data.srp'),ExpandConstant('{app}\data.arc'), false) then break;
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.arc'), ExpandConstant('{app}'), '', false , '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

на распаковке на распаковке файлов игры(последний архив) выдает что не найдено ни одного файла указанного в ISArcExtract


2)проблема у меня при установке вместо 100% указано 300% ,как исправить?

Gnom_aka_Lexander 19-02-2013 16:10 2094349

Цитата:

Цитата tsskz
вместо 100% указано 300% ,как исправить? »

С примером идет уникальная в своей подробности справка, прочитай про records.inf в ней.
Цитата:

Цитата tsskz
файлов игры(последний архив) выдает что не найдено ни одного файла указанного в ISArcExtract »

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.arc') тут ты говоришь, что нужно искать архив рядом с инсталлом. а распаковал его перед этоим куда?
Цитата:

Цитата tsskz
if not ISSRepExtract ( 0, 0, ExpandConstant('{app}\data.srp'),ExpandConstant('{app}\data.arc'), false) then break; »

Естественно, что рядом его нету.

tsskz 19-02-2013 16:28 2094369

Цитата:

Gnom_aka_Lexander
ок,разобрался спс

insombia 19-02-2013 20:27 2094549

tsskz используй http://krinkels.org/showthread.php?t=49 и можно будет указывать только if not ISArcExtract

Lex_from_Belarus 19-02-2013 20:32 2094553

подскажите пожалуйста, как установить шрифты во время установки (.ttf и .otf)?

insombia 19-02-2013 20:35 2094560

Lex_from_Belarus в инсталл или как именно во время установки?

Lex_from_Belarus 19-02-2013 22:06 2094645

Цитата:

Цитата insombia
Lex_from_Belarus в инсталл или как именно во время установки? »

ну в систему установить шрифты, которые нужны для устанавливаемого приложения? их же просто скопировать мало, надо же ещё в реестр прописать, кароче может скриптик есть какой?

Upd: Разобрался сам

Tco 03 20-02-2013 13:42 2095029

Johny777
Цитата:

Цитата Johny777
Ну, как известно с древних времён - каждый извращается по своему »

Что верно, то верно :)

Господа, помогите, пожалйста, решить проблему, кто знает в чём дело и возможно ли избавиться от ошибки?
Суть в следующем: На странице выбора папки установки создаю кнопку, кустомную форму и чекбокс. При нажатии на кнопку проверяется свободное место на диске. Необходимое место считывается с файла .inf Если свободного места достаточно, то выдаётся сообщение "YES!!!" и выберается чекбокс - если свободного места не достаточно, то выдаётся сообщение "NO!!!" и появляется кустомная форма. Проблема в том, что это работает только со второй попытки, то есть свободного места достаточно, но при этом появляется сообщение "NO!!!" и появляется кустомная форма. Сразу же при повторном нажатии на кнопку этого больше не происходит - выдаётся сообщение "YES!!!" и выбирается чекбокс. При нехватке свободного места на диске функция работает без проблем! Почему так происходит при первом нажатии на кнопку? Вот этот самый код:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[ Code]
var
  MyForm: TSetupForm;
  MyButton: TButton;
  FreeMB, TotalMB: Cardinal;
  NewCheckBox1: TNewCheckBox;
  MyFile: String;

function MyFormExec: boolean;
var
  Path: String;
begin
  Path:= ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
 
  MyForm:= CreateCustomForm;
with MyForm do begin
  Width:= ScaleX(798);
  Height:= ScaleY(543);
  Position:= poScreenCenter;
  MyForm.ShowModal;
end;
end;

procedure MyButtonOnClick(Sender: TObject);
begin
if FreeMb < GetIniInt('Info', 'Size', 0, 0, 0, MyFile) then
begin
  MsgBox(ExpandConstant('NO!!!'), mbCriticalError, mb_Ok);
  MyFormExec;
end else begin
  MsgBox(ExpandConstant('YES!!!'), mbInformation, mb_Ok);
  NewCheckBox1.Checked:= True;
end;
end;

procedure InitializeWizard();
begin
  MyFile:= 'C:\Info.inf';
 
  MyButton:= TButton.Create(WizardForm);
with MyButton do begin
  Left:= WizardForm.DirBrowseButton.Left;
  Top:= WizardForm.DirBrowseButton.Top + ScaleY(30);
  Width:= WizardForm.DirBrowseButton.Width;
  Height:= WizardForm.DirBrowseButton.Height;
  Caption:= 'Click Me';
  OnClick:= @MyButtonOnClick;
  Parent:= WizardForm.SelectDirPage;
end;

  NewCheckBox1:= TNewCheckBox.Create(WizardForm);
with NewCheckBox1 do begin
  Left:= MyButton.Left + ScaleY(30);
  Top:= MyButton.Top + ScaleY(30);
  Width:= ScaleX(12);
  Height:= ScaleY(12);
  Parent:= WizardForm.SelectDirPage;
end;
end;


Johny777 20-02-2013 15:34 2095108

Tco 03, ну ты блин даёшь!"_": Сравниваешь значение из ини с нулём! Вылетает шибка и вызывается процедура создания формы, где ты впервые пишешь кол-во свободного места в переменную FreeMB. После этого она не пустая и соответственно идёт уже нужная проверка и выводится нужный результат!
Пойми ошибку в своём коде. Когда поймёшь вот переписал тебе твой код на свой лад, в полностью рабочем виде
Используется вин апи функция GetDiskFreeSpaceEx, которая пишет во входные переменные свободный и полный размер харда в байтах, что точнее чем округлённые значения в мегабайтах
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[  Code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

type
    _LARGE_INTEGER = record
        LowPart: Longint;
        HighPart: DWORD;
    end;
var
  NewCheckBox1: TNewCheckBox;

function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _LARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';

function Size64(QuadPart: _LARGE_INTEGER): Extended;
begin
    Result := (QuadPart.HighPart + integer(QuadPart.LowPart < 0))*4.294967296E9 + QuadPart.LowPart;
end;

function MyFormExec(): Integer;
var
  MyForm: TForm;
begin
  MyForm:= TForm.Create(nil);
  with MyForm do
  begin
    Width:= ScaleX(798);
    Height:= ScaleY(543);
    Position:= poScreenCenter;
    Result := ShowModal;
    Free;
  end;
end;

procedure MyButtonOnClick(Sender: TObject);
var
  FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _LARGE_INTEGER;
  uBOOL: Boolean;
  NeedSize: Extended;
begin
  if GetDiskFreeSpaceEx(ExtractFileDrive(WizardDirValue), FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes) then
  NeedSize := GetIniInt('Info', 'Size', 0, 0, 0, 'C:\Info.inf')*1024*1024;
  if Size64(TotalNumberOfFreeBytes) < NeedSize then
  begin
    MsgBox(ExpandConstant('NO!!!'), mbCriticalError, mb_Ok);
    MyFormExec;
  end else
  begin
    MsgBox(ExpandConstant('YES!!!'), mbInformation, mb_Ok);
    NewCheckBox1.Checked:= True;
  end;
end;

procedure InitializeWizard();
var
  MyButton: TButton;
begin
  with WizardForm do
  begin
    MyButton := TButton.Create(WizardForm)
    with MyButton do
    begin
      Parent:= DirBrowseButton.Parent;
      SetBounds(DirBrowseButton.Left, ScaleY(DirBrowseButton.Top + 30), DirBrowseButton.Width, DirBrowseButton.Height)
      Caption:= 'Click Me';
      OnClick:= @MyButtonOnClick;
    end;
    NewCheckBox1:= TNewCheckBox.Create(WizardForm);
    with NewCheckBox1 do
    begin
      Parent:= SelectDirPage;
      SetBounds(MyButton.Left + ScaleY(30), MyButton.Top + ScaleY(30), ScaleX(12), ScaleY(12));
    end;
  end;
end;


и как понимать ExpandConstant('NO!!!') ? :)

Tco 03 20-02-2013 16:28 2095156

Johny777
Ну то что я сравниваю значения с ещё несоздавшийся формы - это я догнал :shot:
Как сравнить мои FreeMB с TotalMB, тут догнать не могу :shout:
Тупо воспользуюсь Вашим кодом, чего голову ломать... :gamer:
Цитата:

Цитата Johny777
и как понимать ExpandConstant('NO!!!') ? »

Там просто: MsgBox(ExpandConstant('{cm:Error}'), mbCriticalError, mb_Ok); Ну там rus, eng: compiler:Languages

El Sanchez 20-02-2013 19:34 2095304

Цитата:

Цитата Johny777
Используется вин апи функция GetDiskFreeSpaceEx, которая пишет во входные переменные свободный и полный размер харда в байтах, что точнее чем округлённые значения в мегабайтах »

Johny777, объяви _LARGE_INTEGER вместо _ULARGE_INTEGER как показано ниже, иначе GetDiskFreeSpaceEx неправильно посчитает при отрицательном LowPart. В Inno для GetDiskFreeSpaceEx нужны знаковые 64-битные числа. , а не то, что в MSDN указано.
Код:

type
    _ULARGE_INTEGER = record
        LowPart: Longint;
        HighPart: DWORD;
    end;

function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
    Result := (QuadPart.HighPart + integer(QuadPart.LowPart < 0))*4.294967296E9 + QuadPart.LowPart;
end;


Johny777 20-02-2013 22:44 2095442

El Sanchez, Спасибо за правку. Исправил в коде инсталла халфы! :)
вот только разве не наоборот?
Код:

typedef union _LARGE_INTEGER {
  struct {
    DWORD LowPart;
    LONG  HighPart;
  };

http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

те HighPart - Longint a LowPart - DWORD

=========================================================================

Tco 03, свой предыдущий пост тоже исправил!

Lex_from_Belarus 20-02-2013 23:43 2095496

Хочу воспользоваться скриптом в Inno Setup для "выделения/снятия выделения" всех компонентов

Цитата:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: a\a; Description: Руководство пользователя; Types: full
Name: a\a\a; Description: Русский; Flags: exclusive
Name: a\a\b; Description: English; Flags: exclusive
Name: a\b; Description: Справка; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\Readme-ru.txt; DestDir: {app}; Components: a\a\a
Source: compiler:Examples\Readme-en.txt; DestDir: {app}; Components: a\a\b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a\b

[code]
var
i, k, count: Integer;

procedure btnClick(Sender: TObject);
begin
count:= WizardForm.ComponentsList.Items.Count-1;
for i:= count downto 0 do
begin
case TButton(Sender).Tag of
0: WizardForm.ComponentsList.Checked[i]:= True;
1: WizardForm.ComponentsList.Checked[i]:= False;
end;
WizardForm.ComponentsList.OnClickCheck(WizardForm.ComponentsList.ItemObject[i]);
end;
end;

procedure InitializeWizard();
begin
for i:= 0 to 1 do
with TButton.Create(WizardForm) do
begin
SetBounds(295+k,210,60,25);
OnClick:= @btnClick;
Parent:= WizardForm.SelectComponentsPage;
Tag:= i;
case i of
0: Caption:= 'Все';
1: Caption:= 'Ничего';
end;
k:= 62;
end;
end;
но у меня проблема возникла. у меня в компонентах 6 групп и в каждой по 2-3 радиобутона. я эти группы свернул флагом "Flags: Collapsed". В итоге снимается выделение и ставится только с первых 3-х групп. без этого сворачивания всё работает нормально. подскажите пожалуйста что подредактировать, чтобы скрипт заработал?

Lex_from_Belarus 21-02-2013 12:35 2095810

И ещё вопрос:
Имеется структура компонентов.

-Компонент 1
--Компонент 1.1
--Компонент 1.2
-Компонент 2
--Компонент 2.1
--Компонент 2.2
--Компонент 2.3
--Компонент 2.4

Как сделать чтобы если выбран 1.1 то доступны для выбора были 2.1 и 2.2, а если выбрано 1.2, то доступны стали 2.3 и 2.4. И соответственно при нажатии на 1.1 или 1.2 происходил выбор 2.1 или 2.3 соответственно?

El Sanchez 21-02-2013 14:01 2095868

Цитата:

Цитата Johny777
вот только разве не наоборот? »

Johny777, спасибо, все-таки _ULARGE_INTEGER, но LowPart должен быть Longint.

Johny777 21-02-2013 14:49 2095905

Lex_from_Belarus, либо я не догоняю либо код для выбора всех компонентов не дружит со свёрнутым деревом компонентов :(
в любом случае оптимизировал процедуру выбора и очиски выбора всех компонентов и ответил на вопрос в твоём последнем сообщении:
читать дальше »

Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
DirExistsWarning=no


[Components]
Name: a; Description: -Компонент 1;
Name: a\a; Description: --Компонент 1.1;
Name: a\b; Description: --Компонент 1.2;
Name: b; Description: -Компонент 2;
Name: b\d; Description: --Компонент 2.1;
Name: b\e; Description: --Компонент 2.2;
Name: b\f; Description: --Компонент 2.3;
Name: b\e; Description: --Компонент 2.4;


[  code]
procedure ComponentsOnClick(Sender: TObject);
begin
  with WizardForm.ComponentsList do
  begin
    // Как сделать чтобы если выбран 1.1 то доступны для выбора были 2.1 и 2.2, а если выбрано 1.2, то доступны стали 2.3 и 2.4
    ItemEnabled[Items.IndexOf('--Компонент 2.1')] := Checked[Items.IndexOf('--Компонент 1.1')];
    ItemEnabled[Items.IndexOf('--Компонент 2.2')] := Checked[Items.IndexOf('--Компонент 1.1')];
    ItemEnabled[Items.IndexOf('--Компонент 2.3')] := Checked[Items.IndexOf('--Компонент 1.2')];
    ItemEnabled[Items.IndexOf('--Компонент 2.4')] := Checked[Items.IndexOf('--Компонент 1.2')];

    // И соответственно при нажатии на 1.1 или 1.2 происходил выбор 2.1 или 2.3 соответственно
    if Checked[Items.IndexOf('--Компонент 1.1')] then Checked[Items.IndexOf('--Компонент 2.1')] := True;
    if Checked[Items.IndexOf('--Компонент 1.2')] then Checked[Items.IndexOf('--Компонент 2.3')] := True;
    Refresh;
  end;
end;

procedure btnClick(Sender: TObject);
var
  i: Byte;
  Check: Boolean;
begin
  Check := TButton(Sender).Caption = 'Все';
  for i := 0 to WizardForm.ComponentsList.Items.Count-1 do WizardForm.ComponentsList.Checked[i] := Check;
  WizardForm.ComponentsList.OnClickCheck(nil);
end;

procedure InitializeWizard();
var
  i, k: Byte;
begin
  for i:= 0 to 1 do with TButton.Create(WizardForm) do
  begin
    Parent:= WizardForm.SelectComponentsPage;
    SetBounds(ScaleX(295+k), ScaleY(210), ScaleX(60), ScaleY(25));
    OnClick := @btnClick;
    case i of
      0: Caption:= 'Все';
      1: Caption:= 'Ничего';
    end;
    k:= 62;
  end;
  WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClick;
  WizardForm.ComponentsList.OnClickCheck(nil);
end;


Lex_from_Belarus 21-02-2013 18:26 2096103

Цитата:

Цитата Johny777
Lex_from_Belarus, либо я не догоняю либо код для выбора всех компонентов не дружит со свёрнутым деревом компонентов
в любом случае оптимизировал процедуру выбора и очиски выбора всех компонентов и ответил на вопрос в твоём последнем сообщении: »

короче все/ничего решил убрать и использую для этих целей Type (полная установка/очистить список), получается тоже самое, только с Collapsed.

по зависимостям групп косяк какой-то, думал адаптировать на разные варианты, но что-то не получается, например:

Компонент1
Компонент2
-Компонент21 (радиобутон)
-Компонент22 (радиобутон)
-Компонент23

Так вот 21 и 22 работает когда выбран 1, а 23, когда 1 не выбран.
Подскажите как подредактировать ваш код, пожалуйста.

Johny777 21-02-2013 19:22 2096154

Цитата:

Цитата Lex_from_Belarus
все/ничего решил убрать и использую для этих целей Type »

поддерживаю! :)
Цитата:

Цитата Lex_from_Belarus
Так вот 21 и 22 работает когда выбран 1, а 23, когда 1 не выбран. »

вот тебе отдельный пример чтоб понятнее было и он по принципу работы не особо отличается от предыдущего! Изучай.
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
DirExistsWarning=no

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: b\d; Description: 21; Flags: exclusive;
Name: b\e; Description: 22; Flags: exclusive;
Name: b\f; Description: 23;

[  code]
procedure ComponentsOnClick(Sender: TObject);
begin
  with WizardForm.ComponentsList do
  begin
    ItemEnabled[Items.IndexOf('21')] := not Checked[Items.IndexOf('1')];
    ItemEnabled[Items.IndexOf('22')] := not Checked[Items.IndexOf('1')];
    ItemEnabled[Items.IndexOf('23')] := Checked[Items.IndexOf('1')];
    Refresh;
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClick;
  WizardForm.ComponentsList.OnClickCheck(nil);
end;


Gnom_aka_Lexander 21-02-2013 19:26 2096159

Цитата:

Цитата Johny777
не дружит со свёрнутым деревом компонентов »

Просто свернутые компоненты игнорируются при пересчете итемов компонент-листа, поскольку будучи свернутыми, в качестве компонентов контрола TCheckListBox они перестают существовать.

Johny777 21-02-2013 19:47 2096174

Цитата:

Цитата Gnom_aka_Lexander
качестве компонентов контрола TCheckListBox они перестают существовать »

но не полностью. Какой-то доступ к ним всё же есть. Например можно проверить отмечен тот или иной невидимый айлтем или нет и ещё кое-что:
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp
ComponentsListTVStyle=yes


[Components]
Name: en; Description: Портативный; Flags: disablenouninstallwarning exclusive collapsed
Name: ru; Description: Локализация; Flags: disablenouninstallwarning exclusive collapsed
Name: ru\8Bit; Description: 8Bit; Flags: exclusive disablenouninstallwarning
Name: ru\Fargus; Description: Fargus; Flags: exclusive disablenouninstallwarning
Name: bs\7Wolf; Description: 7Wolf; Flags: disablenouninstallwarning exclusive


[  code]
procedure InitializeWizard();
begin
  with WizardForm.ComponentsList do
  begin
    MsgBox('ItemsCount:' + #32 + IntToStr(Items.Count), mbInformation, MB_OK);
    if ItemObject[4] <> nil then MsgBox('Exist!', mbInformation, MB_OK);
    if not Checked[2] then MsgBox('Not Checked', mbInformation, MB_OK);
  end;
end;


Gnom_aka_Lexander 21-02-2013 19:50 2096178

Johny777, ключевое словсочетание:
Цитата:

Цитата Gnom_aka_Lexander
в качестве компонентов контрола TCheckListBox »

я предельно ясно и абсолютно подробно выражаю свои мысли.
Как именно реализована булевая проверка скрытых компонентов - мне без разницы, но готов спорить, что в этой проверке сам TCheckListBox вообще никак не участвует.

insombia 21-02-2013 23:25 2096344

у кого-то есть пример чтобы если инсталл уже запущен то 2 раз его нельзя запустить пока не закроется 1?

Johny777 22-02-2013 04:17 2096426

Цитата:

Цитата Gnom_aka_Lexander
готов спорить, что в этой проверке сам TCheckListBox вообще никак не участвует »

да фиг с ним! ;)

==================================================================================================== =====

Цитата:

Цитата insombia
у кого-то есть пример чтобы если инсталл уже запущен то 2 раз его нельзя запустить пока не закроется 1? »

1. через создание мьютекса встроенными средствами - CreateMutex(...): http://forum.oszone.net/post-1708051-2236.html

2. через создание семафора - CreateSemaphore(...) :
читать дальше »
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  SYNCHRONIZE = $00100000;
  STANDARD_RIGHTS_REQUIRED = $000F0000;
  SEMAPHORE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $3);
 
  SEMAPHORE_UNIQUE_NAME = 'Johny777';
   
   
function CreateSemaphore(lpSemaphoreAttributes, lInitialCount, lMaximumCount: Longint; lpName: String): THandle; external 'CreateSemaphore{#A}@kernel32.dll stdcall';
function OpenSemaphore(dwDesiredAccess: DWORD; bInheritHandle: BOOL; lpName: String): THandle; external 'OpenSemaphore{#A}@kernel32.dll stdcall';
function ReleaseSemaphore(hSemaphore: THandle; lReleaseCount: Longint; lpPreviousCount: Longint): BOOL; external 'ReleaseSemaphore@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

var
  hSemaphore: THandle;

function InitializeSetup(): Boolean;
begin
  Result := OpenSemaphore(SEMAPHORE_ALL_ACCESS, False, SEMAPHORE_UNIQUE_NAME) = 0;
  if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
  hSemaphore := CreateSemaphore(0, 1, 1, SEMAPHORE_UNIQUE_NAME);
end;


procedure DeinitializeSetup();
begin
  ReleaseSemaphore(hSemaphore, 1, 0);
  CloseHandle(hSemaphore);
end;


3. добавление строки в глобальный массив записей винды - GlobalAddAtom(...):
читать дальше »
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  ATOM_UNIQUE_NAME = 'Johny777';

type
  ATOM = Word;

function GlobalAddAtom(lpString: String): ATOM; external 'GlobalAddAtom{#A}@kernel32.dll stdcall';
function GlobalFindAtom(lpString: String): ATOM; external 'GlobalFindAtom{#A}@kernel32.dll stdcall';
function GlobalDeleteAtom(nAtom: ATOM): ATOM; external 'GlobalDeleteAtom@kernel32.dll stdcall';


var
  aAtom: ATOM;

function InitializeSetup(): Boolean;
begin
  Result := GlobalFindAtom(ATOM_UNIQUE_NAME) = 0;
  if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
  aAtom := GlobalAddAtom(ATOM_UNIQUE_NAME);
end;


procedure DeinitializeSetup();
begin
  GlobalDeleteAtom(aAtom);
end;


4. через поиск заголовка окна своей программы:
читать дальше »
Код:

function InitializeSetup(): Boolean;
begin
  Result := FindWindowByWindowName(FmtMessage(SetupMessage(msgSetupWindowTitle), ['{#SetupSetting("AppName")}'])) = 0;
  if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
end;


5. путём сохранения скрытого файла на харде, проверке его наличия и удаления по завершении работы инсталла
читать дальше »
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
  FILE_NAME = '\I_am_running';

function SetFileAttributes(lpFileName: String; dwFileAttributes: DWORD): BOOL; external 'SetFileAttributes{#A}@kernel32.dll stdcall';

var
  LaunchError: Boolean;

function InitializeSetup(): Boolean;
begin
  Result := not FileExists(ExpandConstant('{sd}') + FILE_NAME);
  LaunchError := Result;
  if not Result then MsgBox('Error. Setup is running!', mbError, MB_OK);
  SaveStringToFile(ExpandConstant('{sd}') + FILE_NAME, '', False);
  SetFileAttributes(ExpandConstant('{sd}') + FILE_NAME, FILE_ATTRIBUTE_HIDDEN or FILE_ATTRIBUTE_SYSTEM);
end;


procedure DeinitializeSetup();
begin
  if LaunchError then DeleteFile(ExpandConstant('{sd}') + FILE_NAME);
end;


6. как и по номеру 5. только сохранять ключ реестра. Извиняй, примера нет, тк с реестром у меня туго :(

7. Уверен есть ещё способы!
==================================================================================================== =================

Пацаны, подскажите пожалуйста. Хочу сохранять настройки установленной программы в реестре, на данный момент сохраняю в ини, в директории установки.
при повторном запуске гружу настройки из ини. Хочу перейти на реестр, но у меня с ним туго. Вот содержание ини:
Он заполняется единицами при необходимости
читать дальше »
Код:

procedure CreateInstallINI();
begin
  SaveStringsToFile(ExpandConstant('{#SetupSetting("UninstallFilesDir")}\Install.ini'), [
    '[Parameters]',
    'Launch_hl2=',
    'Launch_hl2_ep1=',
    'Launch_hl2_ep2=',
    'Launch_portal=',
    '',
    '[Installed]',
    ';Half-Life 2',
    'hl2=',
    'hl2_ru=',
    'hl2_ru_buka=',
    'hl2_en=',
    'hl2_ru_en=',
    'AuroraB=',
    '',
    ';Half-Life 2 Episode One',
    'ep1=',
    'ep1_ru=',
    'ep1_en=',
    'ep1_ru_en=',
    '',
    ';Half-Life 2 Episode Two',
    'ep2=',
    'ep2_ru=',
    'ep2_en=',
    'ep2_ru_en=',
    '',
    ';Portal',
    'portal=',
    'portal_ru=',
    'portal_en=',
    'portal_ru_en=',
    '',
    ';Common ',
    'Start_Folder_Exist='
  ],False);
end;


мне нужно создать ключ или ключи?
просветите пожалуйста неуча :)

Gnom_aka_Lexander 22-02-2013 09:01 2096466

Johny777, по вопросу - ты-же сохранил реестр самой игры? Вот по аналогии создавай свой куст в Software и пиши там чего хочешь, главное не забывать убирать за собой. По ответу - 5 и 6 не пойдут, поскольку процедура Deinitializesetup отработает, даже если инсталл не дошел до процедуры InitializeWizard, соответственно повторно запущеный инсталл не запустится, но он уберет ограничитель и будучи запущеным еще раз, будет уже запущен как повторный свободно. Можно конечно, добавить несколько флагов и с их помощью проверять, что именно не дало запустится инсталлятору, но это все костыли. В инно, как я уже писал, специально для этого в секции Setup есть параметры для работы с мьютексом, плюс встроенные функции создания мьютекса из секции кода. Господину insombia просто лень заглянуть в справку, там все это есть. Если никто не обратил внимания, Инсталлятор самого Inno Setup так-же использует мьютекс, пример скрипта лежит в папке установки, если устанавливаете IsPack версию, можно поизучать, если лень головой поработать.

Johny777 22-02-2013 13:46 2096652

Цитата:

Цитата Gnom_aka_Lexander
ты-же сохранил реестр самой игры? »

у меня пиратка не ориентируется на язык клиента Стима в реестре. Другие ключи не нужны, те я никакх ключей не сохраняю
Цитата:

Цитата Gnom_aka_Lexander
Вот по аналогии создавай свой куст в Software и пиши там чего хочешь »

а как насчёт ключа удаления куда инно пишет все свои данные: путь к деинсталятору, выбранные компонент, язык и пр.
Мне можно создать создать там запись? Ведь это удобно, тк при полном удалении она, инно, и мои ключи потрёт
Если да то мне создавать там куст или ключ?
Можно ли сохранить весь ини с его структурой в реестре в одной записи?
Это удобно, тк я заргузил бы его немного изменённой функцией El Sanchez-а и прочитал бы как ини и не нужно код переписывать?


Цитата:

Цитата Gnom_aka_Lexander
5 и 6 не пойдут, поскольку процедура Deinitializesetup отработает »

исправил в пред. сообщении. Хватило одной булев переменной :)

Gnom_aka_Lexander 22-02-2013 13:50 2096655

Цитата:

Цитата Johny777
Хватило одной булев переменной »

Отнюдь. Отрицательный результат функции InitializeSetup может зависеть не только от наличия контрольного файла - записи. может быть целая куча вариантов.
По реестру:
читать дальше »
// Registry functions
// проверка
function RegKeyExists(const RootKey: Integer; const SubKeyName: String): Boolean;
function RegValueExists(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;
// чтение массива
function RegGetSubkeyNames(const RootKey: Integer; const SubKeyName: String; var Names: TArrayOfString): Boolean;
function RegGetValueNames(const RootKey: Integer; const SubKeyName: String; var Names: TArrayOfString): Boolean;
// чтение
function RegQueryStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegQueryMultiStringValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: String): Boolean;
function RegQueryDWordValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultDWord: Cardinal): Boolean;
function RegQueryBinaryValue(const RootKey: Integer; const SubKeyName, ValueName: String; var ResultStr: AnsiString): Boolean;
// запись
function RegWriteStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteExpandStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteMultiStringValue(const RootKey: Integer; const SubKeyName, ValueName, Data: String): Boolean;
function RegWriteDWordValue(const RootKey: Integer; const SubKeyName, ValueName: String; const Data: Cardinal): Boolean;
function RegWriteBinaryValue(const RootKey: Integer; const SubKeyName, ValueName, Data: AnsiString): Boolean;
// удаление
function RegDeleteKeyIncludingSubkeys(const RootKey: Integer; const SubkeyName: String): Boolean;
function RegDeleteKeyIfEmpty(const RootKey: Integer; const SubkeyName: String): Boolean;
function RegDeleteValue(const RootKey: Integer; const SubKeyName, ValueName: String): Boolean;

El Sanchez 22-02-2013 18:01 2096862

Цитата:

Цитата Johny777
Хочу сохранять настройки установленной программы в реестре, на данный момент сохраняю в ини, в директории установки.
при повторном запуске гружу настройки из ини. Хочу перейти на реестр, но у меня с ним туго. »

Johny777, используй RegisterPreviousData, GetPreviousData, SetPreviousData для регистрации своих настроек в реестре.

tsskz 23-02-2013 12:25 2097244

Вложений: 1
вот такая проблемка - как в этом скрипте убрать страницу выбора компонентов ?
на нем я по тихоньку на досуге учусь,если что

insombia 23-02-2013 12:55 2097256

tsskz скрипт нужно весь заливать чтобы можно было проверить на работоспособность

tsskz 23-02-2013 13:49 2097279

Цитата:

tsskz скрипт нужно весь заливать чтобы можно было проверить на работоспособность
ок http://rghost.ru/44045130

insombia 23-02-2013 15:00 2097306

tsskz удали
читать дальше »
#ifdef Components
//=====[ SelectComponents Page ]=====\\:
SelectComponentsPnl:= TPanel.Create(WizardForm);
with SelectComponentsPnl do
begin
Parent:= WizardForm;
SetBounds(ScaleX(575), ScaleY(70), ScaleX(554), ScaleY(220));
BevelOuter:= bvNone;
end;

PanelBG[2]:= TBitmapImage.Create(WizardForm);
with PanelBG[2] do
begin
Parent:= SelectComponentsPnl;
SetBounds(ScaleX(-575), ScaleY(-70), ScaleX(554), ScaleY(290));
Bitmap:= WizardBitmapImage.Bitmap;
end;

SelectComponentsLbl:= LabelCreateEx(SelectComponentsPnl, CustomMessage('SelectComponentsLbl'), ScaleX(30), ScaleY(10), ScaleX(504), ScaleY(30), 15, 1, clBlack, $e5e5e5, false, false, taLeftJustify);
with ComponentsList do
begin
Parent:= SelectComponentsPnl;
SetBounds(ScaleX(30), ScaleY(50), ScaleX(490), ScaleY(150));
LoadBGBmpFromBitmap(WizardBitmapImage.Bitmap, ScaleX(34), ScaleY(122));
MinItemHeight:= ScaleY(20);
ItemHeightFixed:= True;
WantTabs:= True;
Font.Handle := ReFont(15, 4, 'Arial');
end;
//=====[ SelectComponents Page ]=====\\;
#endif

Raf-9600 23-02-2013 17:23 2097378

Ктонить подскажет нубу, как в секции [Cоde] можно прописать условие, чтобы определённый код срабатывал только на Win7 и выше?

insombia 23-02-2013 18:52 2097428

прикрутите кто-то мне в скрипт текстурированные кнопки,а то не получается,и при распаковке кнопка отмены стает исдоновкая а я хочу чтобы была дефольтная
http://rghost.ru/44053363

Johny777 23-02-2013 18:56 2097433

Raf-9600,
Код:

function InitializeSetup(): Boolean;  // Win7 = 6.1, Win8 = 6.2
var
  WindowsVersion: TWindowsVersion;
begin
  GetWindowsVersionEx(WindowsVersion);
  if (WindowsVersion.Major >= 6) and (WindowsVersion.Minor >= 1) then MsgBox('Заместо меня какое-то действие! :)', mbInformation, MB_OK);
end;

============================================================================================

Gnom_aka_Lexander, Зачем мне прототипы, я их уже видел .( Как раз на них и смотрел во вкладке компилятора когда ты мне их запостил :) )
Я спрашивал:
Цитата:

Цитата Johny777
как насчёт ключа удаления куда инно пишет все свои данные ... Мне можно создать там запись »

Цитата:

Цитата Johny777
Если да то мне создавать там куст или ключ? »

Цитата:

Цитата Johny777
Можно ли сохранить весь ини с его структурой в реестре в одной записи? »

===============================================================================================

El Sanchez,
Спасибо, буду разбираться! :) Эти три функции всё, что мне нужно?

tsskz 23-02-2013 20:29 2097482

Цитата:

insombia
выдает ошибку could not call proc.

insombia 23-02-2013 21:41 2097526

tsskz какое инно используешь?

El Sanchez 23-02-2013 22:34 2097560

Цитата:

Цитата Johny777
Эти три функции всё, что мне нужно? »

Johny777, да, их достаточно. Для твоего ini-файла достаточно будет 2-х регистрируемых параметров (по числу секций в ini). Не разберешься - обращайся.

Lex_from_Belarus 24-02-2013 10:56 2097754

Подскажите пожалуйста у меня в Tasks есть галочка, которую если поставить, то отключиться копирование uninstaller'a, а дальше есть 2 галочки которые добавляют ярлыки на него на рабочий стол и в Пуск, так вот как сделать так чтобы когда галочку ставишь и Uninstaller не устанавливается во время установки, то и 2 галочки на ярлыки не показывались. Когда прописываешь ярлыки на компоненты там понятно связь задаётся с компонентами через Components, а как связать Tasks не знаю.

tsskz 24-02-2013 11:07 2097759

Цитата:

insombia
Inno Setup Ultra
думаю не точно объяснил - выдает ошибку не при сборке, а при установки - при попытки перейти на страницу компонентов

Tco 03 24-02-2013 15:28 2097884

Цитата:

Цитата Johny777
Это удобно, тк я заргузил бы его немного изменённой функцией El Sanchez-а и прочитал бы как ини и не нужно код переписывать? »

А возможно ли функцией El Sanchez-а INI-файл загрузить из инсталлятора сразу в оперативную память, не извлекая его на жёсткий диск?

Johny777 25-02-2013 04:22 2098357

Tco 03,
Цитата:

Цитата Tco 03
А возможно ли функцией El Sanchez-а INI-файл загрузить из инсталлятора сразу в оперативную память, не извлекая его на жёсткий диск? »

Возможно! Благодаря функции расширенной версии инно ExtractTemporaryFileToBuffer(...).
на основе примера \Inno Setup 5\Examples\Example_ExtractTemporaryFileToBuffer.iss сделал простенькую функцию:
читать дальше »
Код:

function TempTextFileToString(const Filename: String): String;
begin
    SetLength(Result, ExtractTemporaryFileSize(FileName));
    #ifdef UNICODE
        ExtractTemporaryFileToBuffer(FileName, CastAnsiStringToInteger(Result));
    #else
        ExtractTemporaryFileToBuffer(FileName, CastStringToInteger(Result));
    #endif
end;


входной параметр - имя временного файла, содержащего текст
на выходе - строка
ну и соответственно немного изменил функцию El Sanchez-а парсинга ини-файла
оригинальный прототип - function ParseIniFile(const Filename: String): TIniFile; ( полный код тут: http://forum.oszone.net/thread-235078-93.html )
на function ConvertStringToIniFile(const uString: String): TIniFile;
код ниже использует в качестве примера ини следующего содержания:
читать дальше »

[Constructor]
Install_Pics_Off=
Backgr_Pic_Off=1
Quit_Dialog_Off=

код:
читать дальше »
Код:

#ifndef IS_ENHANCED
    #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif

[Setup]
AppName=Modified El Sanchez Ini-Parsing-Demo
AppVerName=777
CreateAppDir=no

[Files]
Source: Selfish.ini; Flags: dontcopy

[code]
type
    TIniFile = array of record
        Section: String;
        Entries: TStringList;
    end;


function ConvertStringToIniFile(const uString: String): TIniFile;
var
    iFile: TStringList;
    i, Len: Integer;
begin
    iFile := TStringList.Create;
    try
        iFile.Text := uString;
        SetArrayLength(Result, 0);
                                      //для всех непустых строк, исключая комментарии
        for i := 0 to iFile.Count-1 do if (iFile[i] <> '') and (Copy(iFile[i], 1, 1) <> ';') then
        //если строка является секцией...
        if (Pos('[', iFile[i]) = 1) and (Pos(']', iFile[i]) = Length(iFile[i])) then
        begin
            //...пишем в результат имя секции...
            Len := GetArrayLength(Result);
            SetArrayLength(Result, Len+1);
            Result[Len].Section := Copy(iFile[i], 2, Length(iFile[i])-2);
        end
            else
        begin
            //...иначе пишем пару параметр/значение
            if TObject(Result[GetArrayLength(Result)-1].Entries) = nil then
                Result[GetArrayLength(Result)-1].Entries := TStringList.Create;
            Result[GetArrayLength(Result)-1].Entries.Append(iFile[i]);
        end;
       
    finally
        iFile.Free;
    end;
end;


//своя функция для чтения значений параметров из секций
function GetIniValue(const Section, Key, Default: String; iFile: TIniFile): String;
var
    i, j: Integer;
begin
    Result := Default;
    for i := 0 to GetArrayLength(iFile)-1 do if CompareText(iFile[i].Section, Section) = 0 then
    begin
        for j := 0 to iFile[i].Entries.Count-1 do if CompareText(iFile[i].Entries.Names[j], Key) = 0 then
        begin
            Result := iFile[i].Entries.Values[Key];
            Break;
        end;
        Break;
    end;
end;


function TempTextFileToString(const Filename: String): String;
begin
    SetLength(Result, ExtractTemporaryFileSize(FileName));
    #ifdef UNICODE
        ExtractTemporaryFileToBuffer(FileName, CastAnsiStringToInteger(Result));
    #else
        ExtractTemporaryFileToBuffer(FileName, CastStringToInteger(Result));
    #endif
end;


procedure InitializeWizard();
var
    Ini: TIniFile;
begin
    Ini := ConvertStringToIniFile(TempTextFileToString('Selfish.ini'));
    MsgBox(GetIniValue('Constructor', 'Backgr_Pic_Off', '0', Ini), mbInformation, MB_OK);
end;



=========================================================================================

El Sanchez,
Цитата:

Цитата El Sanchez
да, их достаточно »

спасибо, кажись разобрался :)
результат (работает с кодом чуть выше):
читать дальше »
Код:

procedure RegisterPreviousData(PreviousDataKey: Integer);
begin
  SetPreviousData(PreviousDataKey, 'Install',
    '[Parameters]'            + #13#10 +
    'Launch_hl2=-console'              + #13#10 +  // тест
    'Launch_hl2_ep1='          + #13#10 +
    'Launch_hl2_ep2='          + #13#10 +
    'Launch_portal='          + #13#10 +
    ''                        + #13#10 +
    '[Installed]'              + #13#10 +
    ';Half-Life 2'            + #13#10 +
    'hl2='                    + #13#10 +
    'hl2_ru='                  + #13#10 +
    'hl2_ru_buka='            + #13#10 +
    'hl2_en='                  + #13#10 +
    'hl2_ru_en=1'              + #13#10 +  // тест
    'AuroraB='                + #13#10 +
    ''                        + #13#10 +
    ';Half-Life 2 Episode One' + #13#10 +
    'ep1='                    + #13#10 +
    'ep1_ru='                  + #13#10 +
    'ep1_en='                  + #13#10 +
    'ep1_ru_en='              + #13#10 +
    ''                        + #13#10 +
    ';Half-Life 2 Episode Two' + #13#10 +
    'ep2='                    + #13#10 +
    'ep2_ru='                  + #13#10 +
    'ep2_en='                  + #13#10 +
    'ep2_ru_en='              + #13#10 +
    ''                        + #13#10 +
    ';Portal'                  + #13#10 +
    'portal='                  + #13#10 +
    'portal_ru='              + #13#10 +
    'portal_en='              + #13#10 +
    'portal_ru_en='            + #13#10 +
    ''                        + #13#10 +
    ';Common '                + #13#10 +
    'Start_Folder_Exist='
  );
end;


procedure InitializeWizard();
var
  Ini: TIniFile;
begin
  Ini := ConvertStringToIniFile(GetPreviousData('Install', ''));
  MsgBox(GetIniValue('Parameters', 'Launch_hl2', '', Ini), mbInformation, MB_OK);
  MsgBox(GetIniValue('Installed', 'hl2_ru_en', '', Ini), mbInformation, MB_OK);
end;


habib2302 25-02-2013 09:11 2098407

люди.подскажите как создать несколько разделов на последней завершающей странице инсталлятора.
например:как указанно на этом скрине

alert30 25-02-2013 13:14 2098528

habib2302, не ужели так трудно распаковать оригинальный инсталлятор через Universal Extractor; и скрипты будут...

insombia 25-02-2013 17:47 2098708

кто-то может прогресс бар на iswin7 наложить?
http://rghost.ru/44102099

habib2302 25-02-2013 19:07 2098750

alert30, тоже самое что и при извлечении через ISUnpacker
скрипт получается один и тот же
вот сами скрипты

это через ISUnpacker
Код:

;InnoSetupVersion=5.2.3

[Setup]
AppName=CheMax Rus
AppVerName=CheMax Rus 13.0
AppVersion=13.0
DefaultDirName={pf}\CheMaxRus
DefaultGroupName=CheMaxRus
OutputBaseFilename=CheMax 13.0 Rus
Compression=bzip2
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp

[Files]
Source: "{app}\chemax.exe"; DestDir: "{app}";
Source: "{app}\cheats.dat"; DestDir: "{app}";
Source: "{app}\Readme.txt"; DestDir: "{app}";
Source: "{app}\Readme_ukr.txt"; DestDir: "{app}";
Source: "{app}\updater.exe"; DestDir: "{app}";

[Icons]
Name: "{group}\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база";
Name: "{group}\Readme"; Filename: "{app}\Readme.txt"; WorkingDir: "{app}"; Comment: "Прочти меня";
Name: "{group}\Удаление CheMax Rus"; Filename: "{app}\unins000.exe"; WorkingDir: "{app}"; Comment: "Удаление CheMax Rus";
Name: "{userdesktop}\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база"; Tasks: "desktopicon";
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база"; Tasks: "qlaunchicon";

[Tasks]
Name: "desktopicon"; Description: "Создать ярлык на &рабочем столе";
Name: "qlaunchicon"; Description: "Создать ярлык на &панели быстрого запуска";

[Types]
Name: "custom"; Description: "Выборочная установка";

[CustomMessages]
russian.NameAndVersion=%1, версия %2
russian.AdditionalIcons=Дополнительные значки:
russian.CreateDesktopIcon=Создать значок на &Рабочем столе
russian.CreateQuickLaunchIcon=Создать значок в &Панели быстрого запуска
russian.ProgramOnTheWeb=Сайт %1 в Интернете
russian.UninstallProgram=Деинсталлировать %1
russian.LaunchProgram=Запустить %1
russian.AssocFileExtension=Св&язать %1 с файлами, имеющими расширение %2
russian.AssocingFileExtension=Связывание %1 с файлами %2...

[Languages]
; These files are stubs
; To achieve better results after recompilation, use the real language files
Name: "russian"; MessagesFile: "embedded\russian.isl";

это через Universal Extractor
Код:

;InnoSetupVersion=5.2.3

[Setup]
AppName=CheMax Rus
AppVerName=CheMax Rus 13.0
DefaultDirName={pf}\CheMaxRus
DefaultGroupName=CheMaxRus
OutputBaseFilename=CheMax 13.0 Rus
Compression=bzip2
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp

[Files]
Source: "{app}\chemax.exe"; DestDir: "{app}";
Source: "{app}\cheats.dat"; DestDir: "{app}";
Source: "{app}\Readme.txt"; DestDir: "{app}";
Source: "{app}\Readme_ukr.txt"; DestDir: "{app}";
Source: "{app}\updater.exe"; DestDir: "{app}";

[Icons]
Name: "{group}\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база";
Name: "{group}\Readme"; Filename: "{app}\Readme.txt"; WorkingDir: "{app}"; Comment: "Прочти меня";
Name: "{group}\Удаление CheMax Rus"; Filename: "{app}\unins000.exe"; WorkingDir: "{app}"; Comment: "Удаление CheMax Rus";
Name: "{userdesktop}\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база"; Tasks: "desktopicon";
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\CheMax Rus"; Filename: "{app}\CheMax.exe"; WorkingDir: "{app}"; Comment: "CheMax Rus - Наибольшая русскоязычная чит база"; Tasks: "qlaunchicon";

[Tasks]
Name: "desktopicon"; Description: "Создать ярлык на &рабочем столе";
Name: "qlaunchicon"; Description: "Создать ярлык на &панели быстрого запуска";

[Types]
Name: "custom"; Description: "Выборочная установка";

[CustomMessages]
russian.NameAndVersion=%1, версия %2
russian.AdditionalIcons=Дополнительные значки:
russian.CreateDesktopIcon=Создать значок на &Рабочем столе
russian.CreateQuickLaunchIcon=Создать значок в &Панели быстрого запуска
russian.ProgramOnTheWeb=Сайт %1 в Интернете
russian.UninstallProgram=Деинсталлировать %1
russian.LaunchProgram=Запустить %1
russian.AssocFileExtension=Св&язать %1 с файлами, имеющими расширение %2
russian.AssocingFileExtension=Связывание %1 с файлами %2...

[Languages]
; These files are stubs
; To achieve better results after recompilation, use the real language files
Name: "russian"; MessagesFile: "embedded\russian.isl";


Tco 03 25-02-2013 20:25 2098794

Johny777
Цитата:

Цитата Johny777
немного изменил функцию El Sanchez-а парсинга ини-файла
оригинальный прототип - function ParseIniFile(const Filename: String): TIniFile; ( полный код тут: http://forum.oszone.net/thread-235078-93.html ) »

El Sanchez и господин Johny777: как всегда, красяво :up:
Тут ещё одна делема есть... Возможно ли как-то загрузить этот самый INI-файл с хоста (из интернета) сразу в оперативную память? Используя тотже отличный код господина El Sanchez-а. Либо на примере скрипта: \Inno Setup 5\Examples\CodeAutomation.iss - правда там пример про XML-файл...
А то:
Цитата:

Цитата Tco 03
файлы (по замыслу) должны загружаются через интернет всегда одним установщиком и размер файлов прописывать в установщике (по понятным причинам) бесмысленно. »

То же самое и тут - файл же всё равно будет находиться в инсталляторе и всега один и тот же... :happy: Подскажите, пожалйтста, если такое возможно :empathy:

insombia 26-02-2013 00:22 2098933

как убрать кнопку отмены isdone чтобы стандартная отвечала за отмену?

Johny777 26-02-2013 03:00 2099033

insombia, извиняй iswin7 и Isdone не знаю. :(

==================================================================================================== ==================

habib2302,
Цитата:

Цитата habib2302
люди.подскажите как создать несколько разделов на последней завершающей странице инсталлятора. »

Нужно создавать чекбоксы и проверять при нажатии на кнопку "Завершить" их статус, писать булев переменные, тк скорей всего они, чекбоксы, разрушатся и выполнять действия в зависимости от True значения перемнной. Тексты (TNewStaticText или TLabel), как и чекбоксы можешь создать в дизайнере расширенной версии.
Делай, будут непонятки - спрашивай!

и убирай пожалуйста длинные коды (как здесь http://forum.oszone.net/post-2098750-1760.html) под спойлер

==================================================================================================== ==================

Tco 03,
Цитата:

Цитата Tco 03
Возможно ли как-то загрузить этот самый INI-файл с хоста (из интернета) »

да :)
Цитата:

Цитата Tco 03
сразу в оперативную память »

не знаю как :( , а процедуру El Sanchez-а боюсь модифицировать, тк скорее всего накосячу!
Поэтому предлагаю такой вариант
используя WinApi функцию URLDownloadToFile( http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx )
вот пример простого скачивания файла (любого) куда хочешь:
читать дальше »
Код:

function DownloadFile(const URL, FileName: String): Boolean;  /// простое скачивание файла
begin
  try
    Result := UrlDownloadToFile(0, URL, FileName, 0, 0) = 0;
  except
    Result := False;
  end;
end;


но мы будем качать в темп, потом загружать из текстового файла текст в переменную типа String и удалять файл вот таким вот чудо-макаром:
читать дальше »
Код:

function TextFileFromInternetToString(const URL: String): String;
begin
  try /// если файл скачался (функция UrlDownloadToFile возвращает 0) в папку темп, в файл uTextFile, то грузим его в строку, в данном случае сразу в зарезервированную переменную Result
    if UrlDownloadToFile(0, URL, ExpandConstant('{tmp}\uTextFile'), 0, 0) = 0 then LoadStringFromFile(ExpandConstant('{tmp}\uTextFile'), Result);
  finally
    DeleteFile(ExpandConstant('{tmp}\uTextFile')); /// в конечном итоге удаляем файл
  end;
end;


полный пример:
читать дальше »
Код:

[Setup]
AppName=Download-File-Demo
AppVerName=777
CreateAppDir=no
InfoBeforeFile=compiler:license.txt


[  code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

function URLDownloadToFile(Caller: DWORD; URL, FileName: String; Reserved, StatusCB: DWORD): Longint; external 'URLDownloadToFile{#A}@UrlMon.dll stdcall';

function DownloadFile(const URL, FileName: String): Boolean;  /// простое скачивание файла
begin
  try
    Result := UrlDownloadToFile(0, URL, FileName, 0, 0) = 0;
  except
    Result := False;
  end;
end;

function TextFileFromInternetToString(const URL: String): String;
begin
  try /// если файл скачался (функция UrlDownloadToFile возвращает 0) в папку темп, в файл uTextFile, то грузим его в строку, в данном случае сразу в зарезервированную переменную Result
    if UrlDownloadToFile(0, URL, ExpandConstant('{tmp}\uTextFile'), 0, 0) = 0 then LoadStringFromFile(ExpandConstant('{tmp}\uTextFile'), Result);
  finally
    DeleteFile(ExpandConstant('{tmp}\uTextFile')); /// в конечном итоге удаляем файл
  end;
end;

procedure InitializeWizard();
begin
  DownloadFile('http://tululu.org/txt.php?id=38061', 'C:\Свихнувшееся время (Филип Дик).txt');
  WizardForm.InfoBeforeMemo.Text := TextFileFromInternetToString('http://tululu.org/txt.php?id=38061');
end;


для чтения ини используй сразу вложенность функций Ini := ConvertStringToIniFile(TextFileFromInternetToString('http://tululu.org/txt.php?id=38061'));
PS: в данном случае качается не ини. Это просто пример

alert30 26-02-2013 13:57 2099285

habib2302, насколько я помню типа: "<такая-то программа> рекомендует..." все засовано в BIN-е, если в скрипте такого нету.

Ай, какие хитроумельцы в завершающем установки такую добру делают в инсталляторе, CheMax Team!

fackessfook 26-02-2013 22:20 2099741

здравствуйте помогите с ассоциациями, как только не писал в скрипте, но после установки приложения ассоциации не срабатывают. как ассоциировать аудио файлы с плеером AIMP3? хотя бы .mp3..

insombia 26-02-2013 23:39 2099807

то что никто не знает как убрать кнопку отмены исдона чтобы отменяла стандартная?

Gnom_aka_Lexander 27-02-2013 09:48 2100043

fackessfook, Шапка. Сборник скриптов в формате .chm от Krinkels; Там пример ассоциации файлов есть. Помимо огромной кучи разных других полезных примеров, изучение которых снимет 99% вопросов.

cliff99 27-02-2013 13:06 2100194

Здравствуйте.
Я автор популярного (как все утверждают) репака Half life Cinematic Mod
Cinematic mod Ultimate
Прошу мне помочь кое в чём.
Я в установщике использую опцию выбор компонентов.

[Components]
Name: g0; Description: Half - Life 2 Cinematic Mod Models Setup; Types: full custom; Flags: disablenouninstallwarning checkablealone fixed
Name: g0\c8; Description: Установить доп контент и так далее; Types: full custom; Flags: dontinheritcheck
[Files]
Source: "E:\Setup Final ex\addons\MM\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c8
И при компиляции всё благополучно создаётся. Но эти самые компоненты ужимаются стандартными средствами inno setup.
Мне же нужно чтобы при выборе компонента он подхватывался из файла bin(arc) , допустим компонент1.bin и ужимал я его сам.
Дайте мне какой пример. Или обьясните как сделать.

GoshaPolo 27-02-2013 14:04 2100254

Подскажите пожалуйста как поменять местами порядок вывода страниц, чтобы после страницы выбора папки установки появлялась страница выбора папки в меню Пуск, а не страница выбора компонентов установки?

Johny777 27-02-2013 15:11 2100306

GoshaPolo, из своего опыта скажу - менять местами геморно. Нужно учитывать что находясь на странице
выбора директории мы находимся на странице выбора папки меню пуск и наоборот. Короче путаница. Поэтому
проще скрыть родную страницу, создать новую (где надо) и перекинуть на неё всё с родной страницы вот так:
читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\Path
DefaultGroupName=Default

[Icons]
Name: {group}\Notepad; Filename: notepad.exe


[code]
var
  NewGroupPage: TWizardPage;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := PageID = wpSelectProgramGroup;
end;

function CreateNewGroupPage(const AfterPageID: Integer): TWizardPage;
begin
  Result := CreateCustomPage(AfterPageID, SetupMessage(msgWizardSelectProgramGroup), SetupMessage(msgSelectStartMenuFolderDesc));
  with WizardForm do
  begin
    SelectGroupBitmapImage.Parent := Result.Surface;
    SelectStartMenuFolderLabel.Parent := Result.Surface;
    SelectStartMenuFolderBrowseLabel.Parent := Result.Surface;
    GroupEdit.Parent := Result.Surface;
    GroupBrowseButton.Parent := Result.Surface;
    NoIconsCheck.Parent := Result.Surface;
  end;
end;

procedure InitializeWizard();
begin
  NewGroupPage := CreateNewGroupPage(wpWelcome);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    NewGroupPage.ID: MsgBox('We are on Select Start Folder Page', mbInformation, MB_OK);
    wpSelectDir: MsgBox('We are on Select Dir Page', mbInformation, MB_OK);
  end;
end;



но если настаиваешь на том чтоб именно поменять то вот тебе пример как поменять страницы выбора директории установки и страницу выбора компонентов местами
автор этого кода Добров:
читать дальше »
Код:

[Setup]
AppName=My program
AppVerName=My program 1.5
DefaultDirName={pf}\My program
;DisableDirPage=True

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[Components]
Name: WB; Description: 'Мой компьютер' - Настройки; ExtraDiskSpaceRequired: 1048576

[code]
function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
    if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  Case CurPageID of
  wpSelectDir: if WizardForm.Tag = 1 then
    begin
        WizardForm.SelectDirPage.Notebook.ActivePage:= WizardForm.SelectComponentsPage;
        WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectComponents)
        WizardForm.Hint:= WizardForm.PageDescriptionLabel.Caption; // запомнить SetupMessage(msgSelectDirDesc)
        WizardForm.PageDescriptionLabel.Caption:= SetupMessage(msgSelectComponentsDesc)
    end;
  wpSelectComponents: if WizardForm.Tag = 1 then
    begin
        WizardForm.SelectComponentsPage.Notebook.ActivePage:= WizardForm.SelectDirPage;
        WizardForm.DiskSpaceLabel.Caption:= WizardForm.ComponentsDiskSpaceLabel.Caption;
        WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectDir)
        WizardForm.PageDescriptionLabel.Caption:= WizardForm.Hint // иначе вместо названия программы [name]
    end;
  end;
End;

Procedure InitializeWizard;
Begin
    PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage
end;



=====================================================================

cliff99, фриарками не увлекаюсь. Помочь не могу :(
Цитата:

Цитата cliff99
как все утверждают »

К таковым не отношусь. Как фанат халфы добавлю: мод в ***** тк отсебятина и тем самым поганит шедевр. На Аликс смотреть страшно :diablo:

cliff99 27-02-2013 15:48 2100345

Johny777,
Я в свою очередь как фанат халвы скажу.
Всё в моде опционально. От выбора моделей аликс. до выбора остальных моделей и карт.
А играть в стандартную Hl2 c чахлыми текстурами как то не охота.
Прошу простить за оффтоп.
А мой вопрос остаётся открытым.

TERMINAL 27-02-2013 16:07 2100362

Подскажите, стоит метод сжатия Compression=lzma2/max, но почему то сжатия нет.

Gnom_aka_Lexander 27-02-2013 16:17 2100372

TERMINAL, ну, во первых есть более высокие уровни - ultra, ultra64, есть еще непрерывное сжатие - SolidComression=yes - вроде так. Ну и во вторых бывают просто несжимаемые данные.

TERMINAL 27-02-2013 16:24 2100377

Gnom_aka_Lexander, Есть архив 90мб, я его распаковал и скомпилировал=на выходе получается размер 240мб, если сжимаю на максимуме зипом, тоже получается 90мб. А режим ультра может ошибки выдавать при распаковке на старых компах?

Gnom_aka_Lexander 27-02-2013 16:26 2100378

TERMINAL, секции Setup и Files покажи тогда.
P.S. Можешь в личку, если опасаешься чего-то. не глядя на эти секции невозможно определить почему у тебя не жмутся файлы.
Цитата:

Цитата TERMINAL
А режим ультра может ошибки выдавать при распаковке на старых компах? »

Нет,не должен. С чего-бы?

TERMINAL 27-02-2013 16:49 2100402

Gnom_aka_Lexander, спасибо-разобрался.

cliff99 27-02-2013 17:48 2100454

Цитата:

Цитата cliff99
Прошу мне помочь кое в чём.
Я в установщике использую опцию выбор компонентов.
[Components]
Name: g0; Description: Half - Life 2 Cinematic Mod Models Setup; Types: full custom; Flags: disablenouninstallwarning checkablealone fixed
Name: g0\c8; Description: Установить доп контент и так далее; Types: full custom; Flags: dontinheritcheck
[Files]
Source: "E:\Setup Final ex\addons\MM\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Components: g0\c8
И при компиляции всё благополучно создаётся. Но эти самые компоненты ужимаются стандартными средствами inno setup.
Мне же нужно чтобы при выборе компонента он подхватывался из файла bin(arc) , допустим компонент1.bin и ужимал я его сам.
Дайте мне какой пример. Или обьясните как сделать. »


Tco 03 27-02-2013 18:10 2100469

Johny777
Цитата:

Цитата Johny777
для чтения ини используй сразу вложенность функций Ini := ConvertStringToIniFile(TextFileFromInternetToString('http://tululu.org/txt.php?id=38061'));
PS: в данном случае качается не ини. Это просто пример »

:bow:

insombia
Цитата:

Цитата insombia
как убрать кнопку отмены isdone чтобы стандартная отвечала за отмену? »

Ты думаешь что автор сделал отдельную кнопку отмены, чтобы потешить своё самолюбие? Типа: -"Раз сделал свою библиотеку, дай-ка и прикручу свою кнопочку"!
Могу предложить альтернативное решение, но при распаковке, при нажатии на кнопку отмена, архивы будут продолжать распаковываться и если пользователь будет долго думать, то архивы уже распакуются :teeth: Проще сделать её точно такую же, как и оригинальная кнопка "Отмена" ибо без неё - будет уже косяк!
Если всё ещё настаиваешь, то можно сделать как-то так (на примере версии ISDone 0.6d):
читать дальше »

Убераешь кнопку MyCancelButton
В процедуре: CurStepChanged убераешь: WizardForm.CancelButton.Hide
В процедуре: HideControls убераешь: MyCancelButton.Hide
За место процедуры: CancelButtonOnClick вставляешь это:
Код:

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
  Cancel:=False;
  Confirm:=False;
if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = idYes
then begin
if not ISDoneError then begin
  SuspendProc;
  Cancel:=True;
end else begin
 ISDoneCancel:=1;
 ResumeProc;
end;
end;
end;

Не говорю что это единственное решение, так как нет предела для совершенства...


cliff99
Цитата:

Цитата cliff99
Я автор популярного (как все утверждают) »

Нет лучше рекламы, чем самореклама! :4u:
Как мне однажды ответили на соседнем форуме: -"Тебе скажи - ты потом сделаешь RePack и будешь всем хвастаться". :tongue: Мне кажется - сейчас как раз тот случай.
:off:
читать дальше »
Ну и я в свою очередь, как фанат Half-Life скажу. Этот мод как сказка - чем дальше, тем модели всё страшнее... И у автора (Juergen Vierheilig) явно что-то не в порядке... - сделал из Half-Life какую-то порнуху.

Tco 03 27-02-2013 18:49 2100496

В версии ISFreeArcExtract v.4.1 от Shegorat всё досконально ясно:
читать дальше »
Код:

[ArcFiles]
Source: {src}\*.bin; DestDir: {app}; Disk: 1;
Source: {src}\Data2.bin; DestDir: {app}\data; Disk: 1; Components: Russian;
Source: {src}\Data3.bin; DestDir: {app}\data2; Disk: 1; Components: English;
Source: {src}\Data4.bin; DestDir: {app}\data3; Disk: 2;
Source: {src}\Data5.bin; DestDir: {app}\data4; Disk: 2; Components: Russian;
Source: {src}\Data6.bin; DestDir: {app}\data5; Disk: 2; Components: Russian;

Source    - Name of the archive
DestDir    - Destination directory for unpacking archives
Components - Names of components that need for unpacking archive
Tasks      - Names of tasks that need for unpacking archive
Disk      - Number of the disk that contains the archive
Password  - Acrhive password, if archive is encrypted (temporary not supported by unarc.dll)
FilesList  - Path to textfile with filenames which need to unpack from archives (temporary not supported by unarc.dll)


cliff99 27-02-2013 18:54 2100499

Чёрт побери. Я не рекламирую ничего. Я даю понять что на доброе дело пойдёт ваша помощь.
Вот и всё.

Johny777 27-02-2013 19:42 2100539

cliff99, вот тебе пример простой распаковки архива FreeArc в зависимости от выбранных компонентов на этапе ssPostInstall с отображением прогресса распаковки
я просто упростил и немного изменил код из шапки. Надеюсь это то что тебе нужно :)

пример без кнопки отмены
читать дальше »
Код:

[Setup]
AppName=FreeArc Example
AppVerName=FreeArc Example 3.3
DefaultDirName={pf}\FreeArc Example
OutputDir=.

[Components]
Name: "main"; Description: "Main Files";
Name: "help"; Description: "Help Files";

[Files]
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy

[code]
const
  CP_ACP    = 0;         
  CP_UTF8  = 65001;       

function FreeArcExtract (callback: Longword; cmd1, cmd2, cmd3, cmd4, cmd5, cmd6, cmd7, cmd8, cmd9, cmd10: String): integer; external 'FreeArcExtract@files:unarc.dll cdecl';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpDefaultChar: Integer; lpUsedDefaultChar: Integer): Longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function AnsiToUtf8(const strSource: String): String;
var
  WideCharBuf: String;
begin
  SetLength( WideCharBuf, Length( strSource + chr(0) ) * 2 );
  SetLength( Result, Length( strSource + chr(0) ) * 2 );
  MultiByteToWideChar( CP_ACP, 0, strSource + chr(0), -1, WideCharBuf, Length(WideCharBuf) );
  WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, Result, Length(Result), 0, 0);
end;


function ArcCallBack(what: PAnsiChar; WriteSize, FileSize: Integer; str: PAnsiChar): Integer;
begin
  if (WriteSize <> 0) and (FileSize <> 0) then with WizardForm do
  begin
    ProgressGauge.Max := FileSize;
    ProgressGauge.Position := WriteSize;
    StatusLabel.Caption := 'Filesize:' + #32 + IntToStr(FileSize) + #32 + 'MB,' + #32 + 'Extracted:' + #32 + IntToStr(WriteSize) + #32 + 'MB';
  end;
  Application.ProcessMessages;
end;


procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    WizardForm.ProgressGauge.Position := 0;
    if IsComponentSelected('main') then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('C:\Users\FreeArc\FaT-170.mp4.arc'), '', '', '', '', '');
    if IsComponentSelected('help') then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('другой архив'), '', '', '', '', '');
  end;
end;



с кнопкой отмены:
читать дальше »
Код:

[Setup]
AppName=FreeArc Example
AppVerName=FreeArc Example 3.3
DefaultDirName={pf}\FreeArc Example
OutputDir=.

[Components]
Name: "main"; Description: "Main Files";
Name: "help"; Description: "Help Files";

[Files]
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy

[code]
const
  CP_ACP    = 0;         
  CP_UTF8  = 65001;

var
  CancelCode: Integer;

function FreeArcExtract (callback: Longword; cmd1, cmd2, cmd3, cmd4, cmd5, cmd6, cmd7, cmd8, cmd9, cmd10: String): integer; external 'FreeArcExtract@files:unarc.dll cdecl';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpDefaultChar: Integer; lpUsedDefaultChar: Integer): Longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function AnsiToUtf8(const strSource: String): String;
var
  WideCharBuf: String;
begin
  SetLength( WideCharBuf, Length( strSource + chr(0) ) * 2 );
  SetLength( Result, Length( strSource + chr(0) ) * 2 );
  MultiByteToWideChar( CP_ACP, 0, strSource + chr(0), -1, WideCharBuf, Length(WideCharBuf) );
  WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, Result, Length(Result), 0, 0);
end;


function ArcCallBack(what: PAnsiChar; WriteSize, FileSize: Integer; str: PAnsiChar): Integer;
begin
  if (WriteSize <> 0) and (FileSize <> 0) then with WizardForm do
  begin
    ProgressGauge.Max := FileSize;
    ProgressGauge.Position := WriteSize;
    StatusLabel.Caption := 'Filesize:' + #32 + IntToStr(FileSize) + #32 + 'MB,' + #32 + 'Extracted:' + #32 + IntToStr(WriteSize) + #32 + 'MB';
  end;
  Application.ProcessMessages;
  Result:= CancelCode;
end;

procedure CancelFreeArcextracting(Sedner: TObject);
begin
  CancelCode := -127;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    WizardForm.ProgressGauge.Position := 0;
    with TButton.Create(nil) do
    begin
      Parent := WizardForm.InstallingPage;
      Caption := SetupMessage(msgButtonCancel);
      SetBounds(ScaleX(100), ScaleY(100), ScaleX(75), ScaleY(25));
      OnClick := @CancelFreeArcextracting;
    end;
    if IsComponentSelected('main') and (CancelCode <> -127) then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('C:\Users\Âîâà\Desktop\FreeArc\FaT-170.mp4.arc'), '', '', '', '', '');
    if IsComponentSelected('help') and (CancelCode <> -127) then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('äðóãîé àðõèâ'), '', '', '', '', '');
  end;
end;


теперь из-за тебя я знаю немного фриарк модуль. Спасибо! :)
библиотеку найдёшь тут http://freearc.org/download/InnoSetu...noSetup3_5.zip

cliff99 27-02-2013 21:36 2100609

Johny777,
Спасибо. Библиотека у меня уже встроена и настроена.
Теперь просто компоненты привяжу.

Мне нужны были эти строки.

Код:

Name: "main"; Description: "Main Files"; Name: "help"; Description: "Help Files"; и if IsComponentSelected('main') then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('C:\Users\FreeArc\FaT-170.mp4.arc'), '', '', '', '', ''); if IsComponentSelected('help') then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8('другой архив'), '', '', '', '', '');

insombia 27-02-2013 21:37 2100612

Вот решил поделится своим скриптом,все кто хочет можете качать,скрипт без каких либо наворотов с подсказками в коде для новичков


cкрипт
P.S. большое спасибо Rikill/Wr0ng1eR за помощь
Обновил скрипт добавил текстурированные кнопки,музыку и на всякий случай srep самый новый

cliff99 28-02-2013 00:56 2100731

Цитата:

Цитата Johny777
вот тебе пример простой распаковки архива FreeArc в зависимости от выбранных компонентов на этапе ssPostInstall с отображением прогресса распаковки
я просто упростил и немного изменил код из шапки. Надеюсь это то что тебе нужно »

Спасибо за помощь огромное.



Johny777,
Я похоже рано обрадовался. Я сколько мучаюсь, но так и не могу подключить свой arc архив к твоим примерам.
Он мои архивы просто не подхватывает.
Мне нужно, чтобы при выборе компонента main/ Распаковывался соответственно архив main.arc лежащий в корне.
\\\
setup.exe
main.arc -------
data.bin

Johny777 28-02-2013 04:26 2100783

cliff99,
Цитата:

Цитата cliff99
Он мои архивы просто не подхватывает. »

не проблема, используй: AnsiToUtf8(AddBackslash(ExpandConstant('{src}')) + 'main.arc')
константа {src} - путь к "рядом с экзешником инсталла"

Цитата:

Цитата cliff99
Спасибо за помощь огромное. »

для этого есть кнопка "Полезное сообщение" под каждым сообщением :)

GoshaPolo 28-02-2013 12:45 2101022

Цитата:

Цитата insombia
Вот решил поделится своим скриптом,все кто хочет можете качать,скрипт без каких либо наворотов с подсказками в коде для новичков »

Спасибо, интересно посмотреть готовое решение. Только вот вопрос совсем уж новичка, который никогда не сталкивался с распаковкой архивов. Как добавить архив для распаковки?

Gnom_aka_Lexander 28-02-2013 13:53 2101066

Цитата:

Цитата Tco 03
За место процедуры: CancelButtonOnClick вставляешь это: »

Если открыть справку, которая идет к библиотеке, то там про функцию SuspendProc тоже написано. Она как раз-таки приостанавливает текущий поток распаковки или выполнения программы. Все что нужно в вашем примере - перенести ее в самое начало. Ну и переменную CurPage обязательно задействовать, во избежании ошибки. Тоесть как-то так это будет:
Код:

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID = wpInstalling then
  begin
    Cancel:=False;
    Confirm:=False;
    SuspendProc;
    if ExitSetupMsgBox then ISDoneCancel:=1;
    ResumeProc;
  end;
end;

Cancel:=True; в данном случае так делать нельзя, ибо при отмене должно выполнится удаление того, что успело распаковаться. А этого не произойдет, если провести полную отмену.

insombia 28-02-2013 13:54 2101070

GoshaPolo в справке к исдону все есть но вот пример,в файле isdone.iss найди строку
if not ISArcExtract ( 0, 00, ExpandConstant('{src}\data.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;
выделеное жирным это файл который нужно распаковать

Gnom_aka_Lexander не мог бы ты пожалуйста в тот скрипт что я выложил это вставить?

Gnom_aka_Lexander 28-02-2013 14:08 2101082

insombia, ты и сам это можешь. удалить все,что связано с кастомной кнопкой отмены и вставить этот код отмены. ничего сложного, я принципиально в чужих скриптах не ковыряюсь, с некоторого времени, уж больно это вас расслабляет: "а, там есть тот, кто за меня сделает все, можно самому и не париться с этой ересью типа справок, шапки форума и гугла".
P.S. ради интереса глянул. Действительно, разобраться там -целое дело. В таком точно ковыряться не буду.

Gnom_aka_Lexander 28-02-2013 16:14 2101178

используй встроенную функцию IsWin64. она, собственно, именно для того и предназначена, чтоб проверять битность системы.

alert30 28-02-2013 16:59 2101201

habib2302, как вариант:
Код:

[Code]
begin
  if Is64BitInstallMode then
    MsgBox('Installing in 64-bit mode', mbInformation, MB_OK)
  else
    MsgBox('Installing in 32-bit mode', mbInformation, MB_OK);
end;


Gnom_aka_Lexander 28-02-2013 17:02 2101202

alert30, Ты неправ. если заглянешь в справку,то увидишь, что Is64BitInstallMode определяет именно тип установки а не битность системы. Битность системы определяет только IsWin64.

Gnom_aka_Lexander 28-02-2013 17:15 2101213

habib2302, смотря что тебе нужно. хотя в обоих секциях-и в [Run] и в [Files] есть параметр Check. Соответственно,то что на х32 нужно,там ставишь Check: not IsWin64,где нужно х64,там Check: IsWin64 Логично-же? в коде,соответственно -
if IsWin64 then
// тут действие,если х64 система
else
// тут действие если х32 система

Gnom_aka_Lexander 28-02-2013 17:27 2101222

habib2302, дай полный свой скрипт. как я тебе,наугад чтоль делать буду?

Gnom_aka_Lexander 28-02-2013 18:04 2101256

habib2302, с такой кучей вопросов тебе тогда проще самому разобраться. открываешь справку и читаешь там все,что касается битности. там и параметры секции Setup и встроенные функции. Плюс в папке примеров есть примеры: 64Bit, 64BitTwoArch, и 64BitThreeArch. там есть абсолютно все ответы на твои вопросы.

sergey3695 28-02-2013 19:30 2101314

insombia, Хотя не это уже по аккуратнее. (Rikill/Wr0ng1eR, наверное Rikill делал скрипт).

habib2302 28-02-2013 19:41 2101321

люди помогите.у меня есть 2 exe фала для запуска.один для x86 bit,а другой для x64 bit.как сделать так,чтобы создавались ярлыки, запускались эти 2 файла после установки, реестр заносился, прога устанавливалась в папку. и все это под битность системы

insombia 28-02-2013 19:50 2101328

sergey3695 забей!

Johny777 28-02-2013 20:14 2101346

habib2302, оптимизировал код, добавил проверку разрядности. Изучай! :)
насчёт секции реестра не знаю какие ключи ты хочешь вносить в зависимости от разрядности, но помнится инно делает это сама, то бишь пишет в 64 или 32 кусты в зависимости от системы
пусть меня поправят если я гоню.

читать дальше »
Код:

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "CCleaner"
#define MyAppVersion "3.28.1913"
#define MyAppPublisher "Copyright © 2005-2013 Piriform Ltd"
#define MyAppURL "http://www.piriform.com/ccleaner"
#define AppExeName86 "CCleaner.exe"
#define AppExeName64 "CCleaner64.exe"
;(*Автор репака*);
#define AuthRep "Xabib"

[Setup]
WizardSmallImageFile={tmp}\WizardSmallImage.bmp
WizardImageFile={tmp}\WizardImage.bmp
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=true
OutputBaseFilename={#MyAppName} {#MyAppVersion}
SetupIconFile={tmp}\ico.ico
Compression=lzma2/Ultra64
SolidCompression=true
InternalCompressLevel=Ultra64
DiskSpanning=false
DiskSliceSize=736000000
ShowLanguageDialog=auto
SlicesPerDisk=4
UninstallDisplayIcon={app}\ico.ico
;Авторские права.
VersionInfoCopyright={#MyAppPublisher}
;Производитель.
AppPublisher={#MyAppPublisher}
BitmapResource=logo:logo.bmp
; "ArchitecturesInstallIn64BitMode=x64" requests that the install be
; done in "64-bit mode" on x64, meaning it should use the native
; 64-bit Program Files directory and the 64-bit view of the registry.
; On all other architectures it will install in "32-bit mode".
ArchitecturesInstallIn64BitMode=x64
; Note: We don't set ProcessorsAllowed because we want this
; installation to run on all architectures (including Itanium,
; since it's capable of running 32-bit code too).

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

[Tasks]
Name: icons; Description: Создать Ярлыки:;
Name: icons\desktop; Description: На Рабочем Столе;
Name: icons\quicklaunchicon; Description: В Панели Задач;

[Files]
;Файлы распаковываемые в папку с игрой. Необходимы для деинсталлятора
Source: WinTB.dll; Flags: dontcopy;
Source: logo.bmp; Flags: dontcopy
Source: {tmp}\SGS2.png; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: {tmp}\isgsg.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: {tmp}\WizardImage.bmp; DestDir: {app}; Flags: ignoreversion; Attribs: Hidden;
Source: {tmp}\WizardSmallImage.bmp; DestDir: {app}; Flags: ignoreversion; Attribs: Hidden;
Source: {tmp}\ico.ico; DestDir: {app}; Flags: ignoreversion
Source: {app}\{#AppExeName86}; DestDir: "{app}"; Flags: ignoreversion Check: not IsWin64();
Source: {app}\{#AppExeName64}; DestDir: "{app}"; Flags: ignoreversion Check: IsWin64();
Source: {app}\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Registry]
Root: HKLM; SubKey: SOFTWARE\Piriform\CCleaner; ValueType: string; ValueName: UpdateCheck; ValueData: 1;
Root: HKLM; SubKey: SOFTWARE\Piriform\CCleaner; ValueType: string; ValueData: "C:\Program Files\CCleaner";

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#AppExeName86}; IconFilename: {app}\ico.ico; Check: not IsWin64();
Name: {group}\{#MyAppName}; Filename: {app}\{#AppExeName64}; IconFilename: {app}\ico.ico; Check: IsWin64();
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}; IconFilename: {app}\ico.ico;
Name: {group}\Ririform.Com; Filename: {#MyAppURL}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#AppExeName86}; Tasks: icons\desktop; IconFilename: {app}\ico.ico; Check: not IsWin64();
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#AppExeName64}; Tasks: icons\desktop; IconFilename: {app}\ico.ico; Check: IsWin64();
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#AppExeName86}; Tasks: icons\quicklaunchicon; IconFilename: {app}\ico.ico; Check: not IsWin64();
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#AppExeName64}; Tasks: icons\quicklaunchicon; IconFilename: {app}\ico.ico; Check: IsWin64();

[Run]
Filename: {app}\{#AppExeName86}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent Unchecked; Check: not IsWin64();
Filename: {app}\{#AppExeName64}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent Unchecked; Check: IsWin64();

[Messages]
BeveledLabel=RePack by {#AuthRep}

[code]
procedure ShowSplashScreen(p1:HWND;p2:string;p3,p4,p5,p6,p7:integer;p8:boolean;p9:Cardinal;p10:integer); external 'ShowSplashScreen@files:isgsg.dll stdcall delayload'

procedure FolderTreeViewOnChange(Sender: TObject);
begin
  if TObject(Sender) is TFolderTreeView then WizardForm.DirEdit.Text := AddBackslash(TFolderTreeView(Sender).Directory) + '{#MyAppName}' else
  WizardForm.GroupEdit.Text := AddBackslash(TStartMenuFolderTreeView(Sender).Directory)+'{#MyAppName}';
end;


#include "WinTB.iss"

procedure InitializeWizard;
begin
  ExtractTemporaryFile('WinTB.dll');
  SetTaskBarProgressValue(0, 60);
  SetTaskBarProgressState(0, TBPF_ERROR);
  TaskBarV10(MainForm.Handle, WizardForm.Handle, false, false, 0, 0, _m_);
  ExtractTemporaryFile('SGS2.png');
  ShowSplashScreen(WizardForm.Handle, ExpandConstant('{tmp}')+'\SGS2.png', 1000, 3000, 1000, 0, 255, False, $FFFFFF, 10);

  with TFolderTreeView.Create(WizardForm) do
  begin
    Parent := WizardForm.SelectDirPage;
    Top := ScaleY(WizardForm.DirEdit.Top+28);
    Width := ScaleX(417);
    Height := ScaleY(100);
    OnChange := @FolderTreeViewOnChange;
  end;

  with TStartMenuFolderTreeView.Create(WizardForm) do
  begin
    Parent:= WizardForm.SelectProgramGroupPage;
    Top := ScaleY(WizardForm.GroupEdit.Top+28);
    Width := ScaleX(417);
    Height := ScaleY(100);
    SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
    OnChange := @FolderTreeViewOnChange;
  end;

  with TBitmapImage.Create(WizardForm) do
  begin
    Parent:= WizardForm;
    ExtractTemporaryFile('logo.bmp');
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.bmp'));
    SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42)); {первые 2 параметра - координаты левогого верхнего угла по горизонтали и вертикали, дальше ширина и высота, до которой растянуть}
    Stretch:= True;
  end;
end;

procedure DeinitializeSetup();
begin
  TaskBarDestroy;
end;

procedure InitializeUninstallProgressForm();
begin
  FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{app}\WizardSmallImage.bmp'), False);
  with UninstallProgressForm.WizardSmallBitmapImage do Bitmap.LoadFromFile(ExpandConstant('{app}\WizardSmallImage.bmp'));
  with TBitmapImage.Create(UninstallProgressForm) do
  begin
    Parent := UninstallProgressForm;
    Stretch:= true;
    SetBounds(ScaleX(20), ScaleY(315), ScaleX(154), ScaleY(42));
    Bitmap.LoadFromResourceName(HInstance, '_IS_logo');
  end;
end;



UPD: забыл добавить ArchitecturesInstallIn64BitMode=x64
Исправил

================================================================================

insombia, sergey3695,
Цитата:

Цитата insombia
sergey3695 забей! »

Цитата:

Цитата sergey3695
insombia, Хотя не это уже по аккуратнее. (Rikill/Wr0ng1eR, наверное Rikill делал скрипт). »


Какие у вас содержательные комментарии! Спасибо за активность ребята! :)

insombia 28-02-2013 21:34 2101387

sergey3695 я находил коды и вставлял,что не получалось он помогал
p.s.думаю вопрос закрыт оффтоп вне зоны

habib2302 28-02-2013 21:56 2101398

Johny777, огромное спасибо!!!!

cliff99 01-03-2013 09:16 2101575

Johny777,
Цитата:

Цитата Johny777
не проблема, используй: AnsiToUtf8(AddBackslash(ExpandConstant('{src}')) + 'main.arc')
константа {src} - путь к "рядом с экзешником инсталла" »

Всё равно не распаковывает архивы.
Код:

if IsComponentSelected('main') then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8(AddBackslash(ExpandConstant('{src}')) + 'main.arc'), '--', AnsiToUtf8(AddBackslash(ExpandConstant('{src}')) + 'main.arc'), '', '', '', '', '');
Скинь , если можно пример с уже распаковывающимся main.arc
то есть , где пути настроены.

alert30 01-03-2013 10:02 2101604

cliff99, main.arc стоит рядом с Вашим компилированным инсталлятором?

cliff99 01-03-2013 11:54 2101671

alert30,
Да, рядом.


Johny777 01-03-2013 13:59 2101784

cliff99, у меня всё извлекается. Положил рядом с экзешником инсталла data.arc и выполнил код
сам убедись. Причём у меня ещё кириллица в пути была - моё имя пользователя

читать дальше »
Код:

[Setup]
AppName=FreeArc Example
AppVerName=FreeArc Example 3.3
DefaultDirName={pf}\FreeArc Example
OutputDir=.

[Components]
Name: "main"; Description: "Main Files";
Name: "help"; Description: "Help Files";

[Files]
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy

[  code]
const
  CP_ACP    = 0;
  CP_UTF8  = 65001;

var
  CancelCode: Integer;

function FreeArcExtract (callback: Longword; cmd1, cmd2, cmd3, cmd4, cmd5, cmd6, cmd7, cmd8, cmd9, cmd10: String): integer; external 'FreeArcExtract@files:unarc.dll cdecl';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpWideCharStr: PAnsiChar; cchWideChar: Integer): Longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: PAnsiChar; cchWideChar: Integer; lpMultiByteStr: PAnsiChar; cbMultiByte: Integer; lpDefaultChar: Integer; lpUsedDefaultChar: Integer): Longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function AnsiToUtf8(const strSource: String): String;
var
  WideCharBuf: String;
begin
  SetLength( WideCharBuf, Length( strSource + chr(0) ) * 2 );
  SetLength( Result, Length( strSource + chr(0) ) * 2 );
  MultiByteToWideChar( CP_ACP, 0, strSource + chr(0), -1, WideCharBuf, Length(WideCharBuf) );
  WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, Result, Length(Result), 0, 0);
end;


function ArcCallBack(what: PAnsiChar; WriteSize, FileSize: Integer; str: PAnsiChar): Integer;
begin
  if (WriteSize <> 0) and (FileSize <> 0) then with WizardForm do
  begin
    WizardForm.ProgressGauge.Position := Round(WizardForm.ProgressGauge.Max*WriteSize/FileSize);
    StatusLabel.Caption := 'Filesize:' + #32 + IntToStr(FileSize) + #32 + 'MB,' + #32 + 'Extracted:' + #32 + IntToStr(WriteSize) + #32 + 'MB';
  end;
  Application.ProcessMessages;
  Result:= CancelCode;
end;

procedure CancelFreeArcextracting(Sedner: TObject);
begin
  CancelCode := -127;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    WizardForm.ProgressGauge.Position := 0;
    with TButton.Create(nil) do
    begin
      Parent := WizardForm.InstallingPage;
      Caption := SetupMessage(msgButtonCancel);
      SetBounds(ScaleX(100), ScaleY(100), ScaleX(75), ScaleY(25));
      OnClick := @CancelFreeArcextracting;
    end;
    WizardForm.ProgressGauge.Max := 100;
    if IsComponentSelected('main') and (CancelCode <> -127) then FreeArcExtract (CallbackAddr('ArcCallBack'), 'x', '-o+', '-dp' + AnsiToUtf8('C:\setup'), '--', AnsiToUtf8(AddBackslash(ExpandConstant('{src}')) + 'main.arc') , '', '', '', '', '');
  end;
end;


ищи у себя ошибки. С моей стороны всё в порядке!
обновил/улучшил ещё каллбэк функцию. Выделил жирным. Поменяй у себя

==============================================================================================

habib2302,
очень надеюсь, что ты изучишь пример и научишься а не просто возьмёшь готовое
чтоб не плодить благодарственные сообщения и не засорять форум есть кнопка "Полезное сообщение" под каждым сообщением

cliff99 01-03-2013 14:16 2101795

Johny777,
А, да нашёл, извлекает, только не в папку назначения а в c:\setup.
А мне нужно в ту папку, которую я буду указывать в инсталлере
Поэтому я и не видел, что извлекает.
Потом создал архив потяжелее и вижу время повысилось.
и через поиск нашёл.

saurn 01-03-2013 14:33 2101812

Здравствуйте. Была такая идея реализовать страницу с выбором типа установки, по типу - Обычный и Расширенный. По задумке, при выборе обычного типа текст кнопки далее менялся на "Установить", при выборе расширенно менялся обратно на "Далее", соответственно. Собственно реализовать-то получилось, но средствами самих радио-кнопок процедура смены надписи работала криво. Так как при переходе на страницу с выбором типа кнопка "Обычный" уже была выбрана(она checked по умолчанию) текст не менялся. Пришлось запихнуть эту задачу еще и в CurPageChanged. Это конечно не критично, задумка работает, как надо, однако может есть возможность реализовать это, как то по-проще. Кусок скрипта с кастомной страницей и радио-кнопками я прикрепил.

читать дальше »
Код:

[...Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[...Code]
var
  SelectInstallModPage: TWizardPage;
  StandardInstallMod: TNewRadioButton;
  ExtendedInstallMod: TNewRadioButton;
 
function CheckExtendedInstallMod: Boolean;
begin
  Result:=ExtendedInstallMod.Checked;
end;

function CheckStandardInstallMod: Boolean;
begin
  Result:=StandardInstallMod.Checked;
end;

procedure StandardInstallModOnClick(Sender: TObject);
begin
  if CheckStandardInstallMod then
  with WizardForm do
  begin
    NextButton.Caption := 'Установка';
  end;
end;

procedure ExtendedInstallModOnClick(Sender: TObject);
begin
  if CheckExtendedInstallMod then
  with WizardForm do
  begin
    NextButton.Caption := 'Далее';
  end;
end;


procedure InitializeWizard();
begin
  SelectInstallModPage := CreateCustomPage(wpInfoBefore, 'Заголовок', 'Подзаголовок');
  StandardInstallMod := TNewRadioButton.Create(nil);
  with StandardInstallMod do
  begin
    Parent := SelectInstallModPage.Surface;
    Left := ScaleX(0);
    Top := ScaleY(80);
    Width := ScaleX(89);
    Height := ScaleY(17);
    Caption := 'Обычный';
    Checked := True;
    OnClick:= @StandardInstallModOnClick;
  end;

  ExtendedInstallMod := TNewRadioButton.Create(nil);
  with ExtendedInstallMod do
  begin
    Parent := SelectInstallModPage.Surface;
    Left := ScaleX(0);
    Top := ScaleY(137);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'Расширенный';
    OnClick:= @ExtendedInstallModOnClick;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = SelectInstallModPage.ID then
  begin
    if CheckStandardInstallMod then
    with WizardForm do
    begin
      NextButton.Caption := 'Установка';
      if CheckExtendedInstallMod then
      with WizardForm do
      begin
        NextButton.Caption := 'Далее';
      end;
    end;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result := False;
  begin
    if CheckStandardInstallMod then
    begin
      if PageID = wpSelectDir then Result := True;
      if PageID = wpSelectComponents then Result := True;
      if PageID = wpSelectProgramGroup then Result := True;
    end;
  end;
end;


cliff99 01-03-2013 15:10 2101845

Johny777,
Freearc не покатил.
У меня он начинает конфликтовать с isdone.
И как я уже говорил распаковывает не туда куда нужно. (путь то можно исправить, но ладно)
Дело вот в чём.
Основные файлы репака, запакованы freearc, но распаковываются через isdone
Вот они:
Код:

#ifdef precomp
  PCFVer:={#precomp};
#else
  PCFVer:=0;
#endif
    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
      repeat
        if not SrepInit('',512,0) then break;
        if not PrecompInit(PCFVer) then break;
        if not FileSearchInit(false) then break;

          if not ISArcExtract    ( 0, 5, ExpandConstant('{src}\LowData.bin'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
          if not ISArcExtract    ( 0, 93, ExpandConstant('{src}\BigData.bin'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
          if not ISArcExtract    ( 0, 2, ExpandConstant('{src}\UpDate.bin'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;

То есть три архива по очереди распаковываются. LowData.bin-BigData.bin-UpDate.bin (они же arc, только расширение изменено)
Так можно ли сюда прикрутить этот самый "main.arc" , но только чтобы он распаковывался, когда в компонентах выбран main ?

В самом моём скрипте видно даже пояснение как эти компоненты оформлять.
Код:

// Подготавливаем переменную содержащую всю информацию о выбранных компонентах для ISDone.dll
// максимум 96 компонентов.
    Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
    TmpValue:=1;
    if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue;    //êîìïîíåíò 1
    TmpValue:=TmpValue*2;
    if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue;    //êîìïîíåíò 2
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue;    //êîìïîíåíò 3
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue;    //êîìïîíåíò 4
//    .....

Я как раз пытаюсь разобраться, но покуда безрезультатно.

saurn 01-03-2013 15:41 2101876

Цитата:

Цитата cliff99
Так можно ли сюда прикрутить этот самый "main.arc" , но только чтобы он распаковывался, когда в компонентах выбран main ? »

Пример из справки к ISDone, как работать с компонентами.

читать дальше »
Код:

[...Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive;
Name: text\eng; Description: Английский; Flags: exclusive;
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive;
Name: voice\eng; Description: Английский; Flags: exclusive;

....

Comps1:=0; Comps2:=0; Comps3:=0;
TmpValue:=1;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue; //компонент 1
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue; //компонент 4

....

ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
  repeat
    if not FileSearchInit(false) then break;
    if not ISArcExtract ( 0, 0, ExpandConstant('{src}\BasicData.arc'), ExpandConstant('{app}\'), '', false, '', '', '', notPCFonFLY) then break; //компонент без привязки
    if not ISArcExtract ( 1, 0, ExpandConstant('{src}\rustext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 1
    if not ISArcExtract ( 2, 0, ExpandConstant('{src}\engtext.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 2
    if not ISArcExtract ( 3, 0, ExpandConstant('{src}\rusvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 3
    if not ISArcExtract ( 4, 0, ExpandConstant('{src}\engvoice.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break; //компонент 4
    ISDoneError:=false;
  until true;
  ISDoneStop;
end;


cliff99 01-03-2013 16:05 2101900

saurn,
Спасибо, правда уже сам справился. В этой же справке пример взял.
Я с самого начала не правильно вопрос поставил. Нужно было уточнять , что у меня исдоне

insombia 01-03-2013 20:21 2102084

почему в слайдах после завершения установки вечно ругается на эту строчку?
http://i51.fastpic.ru/big/2013/0301/...525f261c8c.png

Johny777 01-03-2013 20:58 2102104

saurn,
Цитата:

Цитата saurn
может есть возможность реализовать это, как то по-проще »

function CheckStandardInstallMod: Boolean;
function CheckStandardInstallMod: Boolean;
эти функции есть тормоза - в них нет смысла
короче переписал и оптимизировал код, изучай:
читать дальше »

Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: "main"; Description: "Main Files"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Help Files"; Types: full

[  Code]
var
  SelectInstallModPage: TWizardPage;
  StandardInstallMod, ExtendedInstallMod: TNewRadioButton;

procedure InstTyprRadiosOnClick(Sender: TObject);
begin
  case TNewRadioButton(Sender).Caption of
    'Обычный': WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
    'Расширенный': WizardForm.NextButton.Caption := SetupMessage(msgButtonNext);
  end;
end;

procedure InitializeWizard();
begin
  SelectInstallModPage := CreateCustomPage(wpInfoBefore, 'Заголовок', 'Подзаголовок');
  StandardInstallMod := TNewRadioButton.Create(WizardForm);
  with StandardInstallMod do
  begin
    Parent := SelectInstallModPage.Surface;
    SetBounds(ScaleX(0), ScaleY(80), ScaleX(89), ScaleY(17));
    Caption := 'Обычный';
    Checked := True;
    OnClick:= @InstTyprRadiosOnClick;
  end;

  ExtendedInstallMod := TNewRadioButton.Create(nil);
  with ExtendedInstallMod do
  begin
    Parent := SelectInstallModPage.Surface;
    SetBounds(ScaleX(0), ScaleY(137), ScaleX(97), ScaleY(17));
    Caption := 'Расширенный';
    OnClick:= @InstTyprRadiosOnClick;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = SelectInstallModPage.ID then if StandardInstallMod.Checked then WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpReady: Result := StandardInstallMod.Checked;
  end;
end;


для пущей оптимизации можно в обработчике OnClick переключателя писать значения в глобальную булев перемененную и проверять её значение в той же ShouldSkipPage например
вот так:
читать дальше »
Код:

var
  bStandartInst: Boolean; - глобально
...

procedure InstTyprRadiosOnClick(Sender: TObject);
begin
  case TNewRadioButton(Sender).Caption of
    'Обычный':
    begin
        WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
        bStandartInst := True;
...

  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpSelectDir, wpSelectComponents, wpSelectProgramGroup, wpReady: Result := bStandartInst;
  end;
end;



==================================================================================================== ==========

insombia, прежде чем задать вопрос поставь себя мысленно на место того кто может быть тебе ответит и подумай сможет ли он это сделать на основе предоставляемой тобой информации!
по твоему вопросу:
не знаю, установить и посмотреть что не так не могу, хотя уже по скрину видно, что код перегружен. Нафига писать имена слайдов в стринглист, те они 1, 2, 3... Их можно извлесть в цикле и в цикле же грузить из темпа
ну это так навскидку.
в каллбэк функции таймера неточные типы переменных
вот так надо procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
дабы не быть голословным http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx
да и смысл в них? Один фиг не используются!

insombia 01-03-2013 21:05 2102114

Johny777 там даже в оригинальном скрипте тоже самое выкидывает

Gnom_aka_Lexander 01-03-2013 22:00 2102154

Цитата:

Цитата insombia
почему в слайдах после завершения установки вечно ругается на эту строчку? »

После завершения- только если забываешь убить таймер до выгрузки самой библиотеке. Это совершенно единственная причина, которая может дать ошибку.
Цитата:

Цитата Johny777
и в цикле же грузить из темпа »

ты так и не понял специфику работы с таймерами. Он как раз нужен,чтобы избавится от цикла. в данном случае стринг-лист избавляет от огромного количества вычислений и километра кода.
Цитата:

Цитата insombia
там даже в оригинальном скрипте тоже самое выкидывает »

Ничего подобного. примеры эти проверены десятками тысяч человек. Ты единственный, кто спустя много лет заявил, что в оригинальном примере ошибка. Да, пример мог-бы быть и по аккуратнее, но ошибок в нем нет.

insombia 01-03-2013 22:07 2102158

Цитата:

Цитата Gnom_aka_Lexander
Ничего подобного. примеры эти проверены десятками тысяч человек. Ты единственный, кто спустя много лет заявил, что в оригинальном примере ошибка. Да, пример мог-бы быть и по аккуратнее, но ошибок в нем нет. »

да,действительно в оригинале не выскакивает,ну и ладно я все равно слайды не юзаю просто решил попробовать что оно такое

cliff99 01-03-2013 22:43 2102208

Ну наконец-то всё работает на ура.
С процентами пол часа разбирался, чтоб правильно шли.

Да уж программистам мне похоже не судьба.
Хотя мои друзья, обычные пользователи и то малое, что я делаю считают космосом.

insombia 01-03-2013 23:58 2102277

Gnom_aka_Lexander пару страниц назад ты выкладывал faq по инно версии 1.4,мож скинуть все предыдущие?

saurn 02-03-2013 01:41 2102334

Johny777, спасибо за подробные примеры. На их основе переделал еще несколько функций.

Gnom_aka_Lexander 02-03-2013 09:28 2102396

Цитата:

Цитата insombia
1.4,мож скинуть все предыдущие? »

От версии к версии там только добавляются и обновляются примеры, не более.

neorom 03-03-2013 19:45 2103427

Как сделать скрипт щоб в начале появлялась катинка на нескалька секунд а потем изчезала и потом ишла самая инсталяция програми ?

Raf-9600 03-03-2013 20:07 2103453

Допустим если инсталлятор состоит не из одного файла, и файл Setup.exe находиться в одной папке, а setup-1.bin в другой. Есть ли возможность как-то при запуске Setup.exe сообщить ему о местонахождении setup-1.bin?
Нужен хоть какой-нибудь вариант.

insombia 03-03-2013 23:23 2103600

neorom issplash тебе в помощь

Mixailos 04-03-2013 00:39 2103655

Здравствуйте.
Пытаюсь заставить работать InnoTools Download на Unicode версии InnoSetup.

Заменил в it_download.iss все PChar на PAnsiChar.
Подгрузил свой перевод через ITD_LoadStrings.

В результате:


Как можно отобразить символы в правильной кодировке?

Комплект для сборки установщика https://bitbucket.org/Mixail/world-o...er/get/tip.zip
Скрипт https://bitbucket.org/Mixail/world-o.../tip/setup.iss
Отредактированный it_download.iss http://rghost.ru/44252526
Перевод ITDownload http://rghost.ru/44252533

neorom 04-03-2013 17:05 2104004

Цитата:

Цитата insombia
issplash тебе в помощь »

Я что то не понемаю, можна пример скрипта .

insombia 04-03-2013 20:24 2104151

neorom погугли

saurn 04-03-2013 20:47 2104166

Цитата:

Цитата neorom
Я что то не понемаю, можна пример скрипта . »

Пример скрипта и библиотека issplash IsSplash 1.0.1

neorom 04-03-2013 22:30 2104292

Не могу розпаковать те файли каториє я сам упаковал через Inno Setup. Ни програмой Universal Extractor ни Inno Setup Unpacker(хотя у меня файл innounp.exe версия 38) розпаковать не могу, помогите ???

habib2302 05-03-2013 01:01 2104385

люди помогите.короче в редакторе реестра есть раздел HKEY_USERS и в этом разделе есть примерно вот такой подраздел S-1-5-21-1377596772-22977529-2522162812-1000.у каждой системы этот подраздел разный.как сделать так,чтобы ключ реестра подходил каждой системе каждому подразделу

Raf-9600 05-03-2013 01:54 2104394

habib2302, Никак. Насколько я помню, в HKEY_USERS дублируются ключи из раздела HKEY_CURRENT_USER, т.е. наверно стоит с ним и работать.

Nightwishh 05-03-2013 18:49 2104808

Вложений: 1
Здравствуйте. Знаю что такой вопрос уже задовался товарищем Johny777, а проблема в скине и LoadBtnBmpFromFile http://forum.oszone.net/attachment.p...1&d=1362494756 , может получиться сделать так что-бы скин не обрабатывал ComponentsList, не ковыряясь и не исправляя сам скин.

insombia 05-03-2013 20:37 2104920

Mixailos это из-за шрифтов самой 8,у меня было такое же самое нужно ковырять языки в винде и настроить какую-то ф-ию на русский,и тогда вес будет гуд

Gnom_aka_Lexander 05-03-2013 21:08 2104939

Вложений: 1
Цитата:

Цитата habib2302
S-1-5-21-1377596772-22977529-2522162812-1000.у каждой системы этот подраздел разный »

скорей всего это SID текущего пользователя. В атаче моя поделка на эту тему.

Respin 06-03-2013 08:51 2105223

Всем здравсвуйте! Как сделать, чтобы при нажатии на кнопку открывалась папка документы пользователей?

Johny777 06-03-2013 15:00 2105504

Respin, повесь в событии OnClick кнопки это:
Код:

procedure ExploreDocsFolder(Sender: TObject);
var
  ErrorCode: Integer;
begin
  ShellExec('Explore', ExpandConstant('{userdocs}'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  //ShellExec('Explore', ExpandConstant('{commondocs}'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;


neorom 06-03-2013 18:40 2105668

Не могу розпаковать те файли каториє я сам упаковал через Inno Setup. Ни програмой Universal Extractor ни Inno Setup Unpacker(хотя у меня файл innounp.exe версия 38) розпаковать не могу, помогите ???

insombia 06-03-2013 19:07 2105683

neorom ты сами файлы или скрипт хоч разпаковать?

neorom 06-03-2013 20:50 2105746

Цитата:

Цитата insombia
ты сами файлы или скрипт хоч разпаковать? »

нужно и то и другоє ?

Gnom_aka_Lexander 06-03-2013 20:54 2105748

neorom, Можно. Только в том случае, если инсталл не в расширенной версии скомпилирован и не зашифрован.

neorom 06-03-2013 21:35 2105764

Цитата:

Цитата Gnom_aka_Lexander
Только в том случае, если инсталл не в расширенной версии скомпилирован и не зашифрован. »

Можно поподробней, и как мне єто и чем разпаковать ?

Gnom_aka_Lexander 06-03-2013 21:40 2105767

тем, чем и пытался. если инно была стандартная и инсталл не шифровался, то все распакуется. ну и для 5.5.3 не знаю, есть сейчас анпакер или нет.

neorom 06-03-2013 21:58 2105778

Єсть конкректно какаята програма ?
Мои програми http://us.ua/1057349/

Gnom_aka_Lexander 06-03-2013 22:06 2105784

тут в шапке Распаковщики инсталляторов Inno Setup

audiofeel 06-03-2013 22:37 2105800

здравствуйте, в общем "задумка" такая = после велкома пользователь должен выбрать между установкой по умолчанию (то есть программа установится в папку по умолчанию, сама где задано создаст ярлыки и т.п) и скажем так установкой для "опытных пользователей (где ему предложат выбрать папку, ярлыки, доп п.о и т.д) готового примера не нашел , вроде где то видел что то но мне нужно чтоб переключатель был как в "я принимаю лицензионное соглашение" (черт я не знаю как эти кнопочки называются, ну в общем точки) .помогите у кого есть пример

neorom 06-03-2013 22:49 2105807

Цитата:

Цитата Gnom_aka_Lexander
Распаковщики инсталляторов Inno Setup »

Нет не получилось , помогите разпаковать, очень нужни єти файли и скрипт ? http://us.ua/1057349/

Johny777 06-03-2013 23:41 2105840

audiofeel, Да было уже. Изучай: http://forum.oszone.net/post-2102104-1779.html

neorom, установить, взять файлы из директории установки, посмотреть регшотом какие ключи внеслись в реестр и написать скрипт заново не судьба? Даже если распакуешь там будут стандартные секции типа компонентов и ярлыков. Чтоб их воспроизвести Oject Pascal знать не нужно, хватит и справки.

Lex_from_Belarus 07-03-2013 00:36 2105875

if not Checked[Items.IndexOf('Compoment1')] then
begin
Checked[Items.IndexOf('Component2')] := False;
end;

данный код делает Component2 неактивным когда не выбран Compoment1
а что ещё нужно написать чтобы снималось выделение с Component2 если он ранее был выделен, а то при этом коде Component2 становится неактивным но остаётся выбранным

P.S. Component2 - это Radiobutton, если это имеет значение

audiofeel 07-03-2013 00:59 2105888

Johny777, пример рабочий , но ко мне не совсем подходит, мне хотелось эти две кнопки "стандартная" и "расширенная" поместить на "WizardForm.SelectDirPage" и пока пользователь не нажмет "расширенная" - "DirEdit" и "DirBrowseButton" не активны

Johny777 07-03-2013 04:04 2105950

audiofeel,
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: "main"; Description: "Main Files"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Help Files"; Types: full

[Code]
var
  StandardInstallMod, ExtendedInstallMod: TNewRadioButton;

procedure InstTyprRadiosOnClick(Sender: TObject);
begin
  with WizardForm do
  begin
    case TNewRadioButton(Sender).Caption of
      'стандартная': NextButton.Caption := SetupMessage(msgButtonInstall);
      'расширенная': NextButton.Caption := SetupMessage(msgButtonNext);
    end;
    DirEdit.Enabled := ExtendedInstallMod.Checked;
    DirBrowseButton.Enabled := ExtendedInstallMod.Checked;
  end;
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    StandardInstallMod := TNewRadioButton.Create(WizardForm);
    with StandardInstallMod do
    begin
      Parent := WizardForm.SelectDirPage;
      SetBounds(ScaleX(0), ScaleY(125), ScaleX(89), ScaleY(17));
      Caption := 'стандартная';
      Checked := True;
      OnClick:= @InstTyprRadiosOnClick;
    end;

    ExtendedInstallMod := TNewRadioButton.Create(nil);
    with ExtendedInstallMod do
    begin
      Parent := WizardForm.SelectDirPage;
      SetBounds(ScaleX(0), ScaleY(150), ScaleX(97), ScaleY(17));
      Caption := 'расширенная';
      OnClick:= @InstTyprRadiosOnClick;
    end;
    DirEdit.Enabled := ExtendedInstallMod.Checked;
    DirBrowseButton.Enabled := ExtendedInstallMod.Checked;
  end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then if StandardInstallMod.Checked then WizardForm.NextButton.Caption := SetupMessage(msgButtonInstall);
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpSelectComponents, wpSelectProgramGroup, wpReady: Result := StandardInstallMod.Checked;
  end;
end;


neorom 07-03-2013 22:13 2106468

Єсть ли версия програми Inno Ultra v5.5.1, єсли єсть то закиньте мне на http://us.ua/ а то не где скачать не могу .

alert30 07-03-2013 22:52 2106487

neorom, готово - полная версия Inno Ultra: http://us.ua/1058466/
Лександер, прости. (

Johny777, http://forum.oszone.net/post-2105950-1815.html
пост поправь, а код паскаля используй, как [Code] (начальная жирная квадратная скобка)

Nightwishh 08-03-2013 03:17 2106585

Вложений: 1
Разъясните пожалуйста ситуацию, можно ли заскинировать через ISSkin.dll всю область "Выбора языка установки" http://forum.oszone.net/attachment.p...1&d=1362698177 . Вот код который я стыбзил с кринкелса
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
DefaultGroupName=My Application
UninstallDisplayIcon={app}\MyProg.exe
SolidCompression=yes
Compression=lzma/ultra
OutputDir=.

[Files]
Source: ISSkin.dll; DestDir: {app}; Flags: dontcopy
Source: Skin.cjstyles; DestDir: {tmp}; Flags: dontcopy

[Icons]
Name: {group}\my application; Filename: {app}\MyProg.exe

[Code ]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:ISSkin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:ISSkin.dll stdcall';,
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
 external 'CallWindowProc@user32.dll stdcall delayload';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint;
 external 'SetWindowLong@user32.dll stdcall delayload';

function InitializeLanguageDialog(): Boolean;
begin
  ExtractTemporaryFile('Skin.cjstyles');
        LoadSkin(ExpandConstant('{tmp}\Skin.cjstyles'), '');
        Result := True;
end;

procedure DeinitializeSetup();
begin
        UnloadSkin();
end;

Спасибо.

audiofeel 08-03-2013 04:47 2106592

здравствуйте, помогите со скриптом. на "SelectProgramGroupPage" вместо кнопки "GroupBrowseButton" хотелось чтоб было как в примере, небольшое "окно" (рисунок во влажении)

Gnom_aka_Lexander 08-03-2013 07:20 2106605

Цитата:

Цитата alert30
Лександер, прости. ( »

Да ладно, я привык уже, что всем плевать на источник, и вместо того, чтоб направить в шапку, где есть ссылки, вы предпочитает заливать на лево от своего имени. Много бабла нарубил уже?

alert30 08-03-2013 07:41 2106606

Цитата:

Цитата Gnom_aka_Lexander
Много бабла нарубил уже? »

neorom сам спросил - я и залил. А за бабло, не понятно о чем речь...

neorom 08-03-2013 09:03 2106620

alert30 СПАСИБО

Respin 08-03-2013 13:51 2106755

Всем привет.
Johny777
В этом коде есть один большой недостаток! Если файл запаковать целиком (один большой файл), то он считывает размер распаковавающегося файла правильно. Но если запаковать много файлов маленького размера, он считывает не размер распаковывающихся файлов, а размер распаковывающегося архива!
Плюс ещё бы к нему прикрутить проценты распаковки...

saurn 08-03-2013 15:00 2106803

Цитата:

Цитата audiofeel
здравствуйте, помогите со скриптом. на "SelectProgramGroupPage" вместо кнопки "GroupBrowseButton" хотелось чтоб было как в примере, небольшое "окно" (рисунок во влажении) »

Пример ниже:
читать дальше »
Код:

[*Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
DefaultGroupName=MyApp
AllowNoIcons=true
Compression=none
DiskSpanning=true
DiskSliceSize=736000000

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

[*Code]
var
  SelectFolderInStartMenuLabel, SelectFolderInStartMenuLabel2: TLabel;
  StartMenuFolderTreeView: TStartMenuFolderTreeView;


procedure StartMenuFolderOnChange(Sender: TObject);
begin
WizardForm.GroupEdit.Text:= AddBackslash(StartMenuFolderTreeView.Directory)+ ExpandConstant('{#SetupSetting("DefaultGroupName")}');
end;

procedure DisableCreateStartMenuFolderOnClick(Sender: TObject);
begin
  case TObject(Sender) of
      WizardForm.NoIconsCheck:
      begin
        WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled);
        StartMenuFolderTreeView.Enabled:= WizardForm.GroupEdit.Enabled;
      end;
  end;
end;

procedure InitializeWizard();
begin

  with WizardForm.SelectGroupBitmapImage do
  begin
    Visible := False;
  end;

  SelectFolderInStartMenuLabel := TLabel.Create(WizardForm);
  with SelectFolderInStartMenuLabel do
  begin
    Parent := WizardForm.SelectProgramGroupPage;
    Caption := 'Текущая папка:';
    SetBounds(ScaleX(0), ScaleY(0), ScaleX(85), ScaleY(13));
    Transparent := False;
    WordWrap := True;
  end;

  SelectFolderInStartMenuLabel2 := TLabel.Create(WizardForm);
  with SelectFolderInStartMenuLabel2 do
  begin
    Parent := WizardForm.SelectProgramGroupPage;
    SetBounds(ScaleX(0), ScaleY(47), ScaleX(118), ScaleY(13));
    Caption := 'Существующие папки:';
    Transparent := False;
  end;


  with WizardForm.GroupBrowseButton do
  begin
    Visible := False;
  end;

  with WizardForm.GroupEdit do
  begin
    SetBounds(ScaleX(0), ScaleY(17), ScaleX(417), ScaleY(21));
    ReadOnly := True;
  end;

  with WizardForm.SelectStartMenuFolderBrowseLabel do
  begin
    Visible := False;
  end;

  with WizardForm.SelectStartMenuFolderLabel do
  begin
    Visible := False;
  end;

  with WizardForm.NoIconsCheck do
  begin
    Caption := 'Отключить создание папки в меню "Пуск"';
    WizardForm.NoIconsCheck.OnClick:= @DisableCreateStartMenuFolderOnClick;
  end;

  StartMenuFolderTreeView := TStartMenuFolderTreeView.Create(WizardForm);
  with StartMenuFolderTreeView do
  begin
    Parent := WizardForm.SelectProgramGroupPage;
    SetBounds(ScaleX(0), ScaleY(64), ScaleX(417), ScaleY(142));
    SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{userstartup}'),ExpandConstant('{commonstartup}'));
    OnChange:= @StartMenuFolderOnChange;
  end;
end;



P. S.
Это просто пример. Под свой скрипт адаптируете его сами.

neorom 08-03-2013 20:47 2106992

Как мне зделать так чтоби ета надпись не била зависима от язика исталяции програми

saurn 08-03-2013 21:26 2107016

neorom,

Код:

[Tasks]
Name: CreateLink; Description: (описание на требуемом языке) ;


neorom 08-03-2013 21:31 2107023

У неня єсть несколько язиков при инсталяции, что делать ...

alert30 08-03-2013 21:31 2107025

Цитата:

Цитата neorom
что делать »

Справку читать.

neorom 08-03-2013 21:36 2107028

Цитата:

Цитата alert30
Справку читать. »

Я слаба розбераюсь в програме

saurn 08-03-2013 21:43 2107033

neorom,

С привязкой сообщений к нескольким языкам:

Код:

[Languages]
//Здесь указываете языки инсталятора
Name: russian; MessagesFile: compiler:Languages\Russian.isl
Name: english; MessagesFile: compiler:Languages\English.isl

[Tasks]
Name: linkdesk; Description: {cm:MakeLinkDesk} //Здесь константы сообщений, которые вы изначально задаете в секции CustomMessages
Name: linkstartmenu; Description: {cm:MakeLinkStartMenu}

[CustomMessages]
//Здесь вариации сообщений для каждого языка
russian.MakeLinkDesk=Ярлык на Рабочем столе
russian.MakeLinkStartMenu=Ярлык в меню "Пуск"

english.MakeLinkDesk=Create link on Desktop
english.MakeLinkStartMenu=Create link on Start Menu

Без привязки:

Код:

[Tasks]
Name: linkdesk; Description: Ярлык на Рабочем столе
Name: linkstartmenu; Description: Ярлык в меню "Пуск"


neorom 08-03-2013 22:03 2107042

Цитата:

Цитата saurn
[CustomMessages] //Здесь вариации сообщений для каждого языка russian.MakeLinkDesk=Ярлык на Рабочем столе russian.MakeLinkStartMenu=Ярлык в меню "Пуск" english.MakeLinkDesk=Create link on Desktop english.MakeLinkStartMenu=Create link on Start Menu »

А можно что би константы сообщений, которые изначально задаете в секции CustomMessages брать из самих файлов язика

saurn 08-03-2013 22:20 2107056

Цитата:

Цитата neorom
А можно что би константы сообщений, которые изначально задаете в секции CustomMessages брать из самих файлов язика »

Из самих языковых файлов, исходя из выбранного языка, могут братся только названия стандартных контролов(кнопок, текстов и т.д.) инсталятор делает это сам. А сообщение в секции Description вы задаете сами, ведь Inno не может заранее знать, какой текст вы там напишите. Именно для этого и существует секция CustomMessages

neorom 08-03-2013 23:32 2107095

[Tasks]

Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}
Name: startmenuicon; Description: Create an additional start menu icon; GroupDescription: {cm:AdditionalIcons}



Вот єта чая часть скрипта , в третем рядке надо исправить так что би информация ишла из файла язика а не из [CustomMessages]

habib2302 09-03-2013 13:44 2107315

как довать кликабельное лого в углу инсталлятора в формате .png без фона

Tco 03 09-03-2013 20:19 2107519

Цитата:

Цитата Respin
В этом коде есть один большой недостаток! Если файл запаковать целиком (один большой файл), то он считывает размер распаковавающегося файла правильно. Но если запаковать много файлов маленького размера, он считывает не размер распаковывающихся файлов, а размер распаковывающегося архива!
Плюс ещё бы к нему прикрутить проценты распаковки... »

Чтобы добавить проценты в этот скрипт, нужно дописать: + FormatFloat('0.0%', (WriteSize*100)/FileSize) ,как исправить правильное значение множества распакованых данных (файлов) из архива я не знаю :mellow: Господин Johny777 не могли бы Вы его, пожалуйста, отрехтовать :blush2:

habib2302
botva2.dll тебе в помощь.

DragonTander@fb 10-03-2013 04:20 2107727

Здравствуйте.

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

Код, что работает на данный момент.
читать дальше »
Код:

procedure InitializeWizard();
begin
WizardForm.TasksList.Font.Color := $0000FF;
end;



Как мне покрасить только текст определенного чекбокса?

neorom 10-03-2013 13:35 2107907

Памагите созтать такой скрипт. Фото -

alert30 10-03-2013 15:07 2107969

neorom, мы не можем делать готовый код, а мы его дополняем или помогаем.

neorom 10-03-2013 15:43 2107978

Цитата:

Цитата alert30
мы не можем делать готовый код, а мы его дополняем или помогаем. »

Я не знаю из чего тут начинать , только к етому фото.

habib2302 10-03-2013 17:55 2108074

Tco 03, дай скрипт

neorom 10-03-2013 19:30 2108186

Просьба одредактироваить скрипт з єтого зделать так и разнинє папки з файлами для инсталяции

Мой скрипт (програма инсталятор должна сама определять какиє програми инстальовани и стояли там видпавиднеє галочки в окне исталяции)

[Setup]
AppName=Microsoft® Windows® XP Ukrainian User Interface Pack
AppVerName=Microsoft® Windows® XP Ukrainian Multilingual User Interface Pack
AppPublisher=Music Mix Studio© & Records Company® 2006-2008
AppPublisherURL=http://winxp.org.ua
AppSupportURL=http://winxp.org.ua
AppUpdatesURL=http://winxp.org.ua
CreateAppDir=no
OutputBaseFilename=setup1
Compression=lzma
Uninstallable=no
PrivilegesRequired=none
DisableProgramGroupPage=yes
LicenseFile=embedded\License.txt
InfoBeforeFile=embedded\InfoBefore.txt
InfoAfterFile=embedded\InfoAfter.txt
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp

[Files]
Source: {tmp}\*.*; DestDir: {tmp}\mui; Flags: ignoreversion

[Run]
Filename: {tmp}\mui\muisetup_ru_sp2.exe; Parameters: /i 0422 /d 0422 /l /f /r /s; Components: sp2comp; Tasks: sp2
Filename: {tmp}\mui\muisetup_ru_sp3.exe; Parameters: /i 0422 /d 0422 /l /f /r /s; Components: sp3comp; Tasks: sp3
Filename: {tmp}\mui\muisetup_ru_sp2.exe; Components: sp2comp; Tasks: sp2m
Filename: {tmp}\mui\muisetup_ru_sp3.exe; Components: sp3comp; Tasks: sp3m
Filename: {tmp}\mui\wmp_8_mui.cmd; Tasks: mp8
Filename: {tmp}\mui\wmp_9_mui.cmd; Tasks: mp9
Filename: {tmp}\mui\wmp_10_mui.cmd; Tasks: mp10
Filename: {tmp}\mui\wmp_11_mui.cmd; Tasks: mp11

[Tasks]
Name: sp2; Description: Автоматичне встановлення (рекомендовано); GroupDescription: Виберіть режим встановлення; Components: sp2comp
Name: sp3; Description: Автоматичне встановлення (рекомендовано); GroupDescription: Виберіть режим встановлення; Components: sp3comp
Name: sp2m; Description: Ручне встановлення; GroupDescription: Виберіть режим встановлення; Components: sp2comp
Name: sp3m; Description: Ручне встановлення; GroupDescription: Виберіть режим встановлення; Components: sp3comp
Name: mp8; Description: 8; GroupDescription: Оберіть версію встановленого Медіа Програвача
Name: mp9; Description: 9; GroupDescription: Оберіть версію встановленого Медіа Програвача
Name: mp10; Description: 10; GroupDescription: Оберіть версію встановленого Медіа Програвача
Name: mp11; Description: 11; GroupDescription: Оберіть версію встановленого Медіа Програвача

[Components]
Name: sp2comp; Description: Service Pack 2; Types: sp2os
Name: sp3comp; Description: Service Pack 3; Types: sp3os

[Types]
Name: sp3os; Description: Service Pack 3
Name: sp2os; Description: Service Pack 2

[Languages]
Name: ukrainian; MessagesFile: compiler:Languages\Ukrainian.isl

insombia 10-03-2013 19:56 2108213

neorom вот так?
Цитата:

[Tasks]
Name: sp2; Description: Автоматичне встановлення (рекомендовано); GroupDescription: Виберіть режим встановлення; Components: sp2comp
Name: sp3; Description: Автоматичне встановлення (рекомендовано); GroupDescription: Виберіть режим встановлення; Components: sp3comp
Name: sp2m; Description: Ручне встановлення; GroupDescription: Виберіть режим встановлення; Components: sp2comp
Name: sp3m; Description: Ручне встановлення; GroupDescription: Виберіть режим встановлення; Components: sp3comp
Name: mp8; Description: 8; GroupDescription: Оберіть версію встановленого Медіа Програвача
Name: mp9; Description: 9; GroupDescription: Оберіть версію встановленого Медіа Програвача
Name: mp10; Description: 10; GroupDescription: Оберіть версію встановленого Медіа Програвача
Name: mp11; Description: 11; GroupDescription: Оберіть версію встановленого Медіа Програвача

[Components]
Name: sp2comp; Description: Service Pack 2; Types: sp2os Flags: exclusive
Name: sp3comp; Description: Service Pack 3; Types: sp3os Flags: exclusive

neorom 10-03-2013 20:26 2108227

Прошу http://us.ua/1060318/

Компиляция не идьот , пишет

insombia 10-03-2013 21:53 2108290

Q: Как сделать, чтобы при распаковке файлов, инсталл убирался в маленькое окошко в углу экрана?
A: Мой вариант выглядит так
читать дальше »
[Setup]
AppName=MiniInstall
AppVersion=1.0
DefaultDirName={pf}\MiniInstall

[Files]
Source: {win}\help\*; DestDir: {app}\Files; Flags: external recursesubdirs createallsubdirs;

[code]
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';

procedure MiniInstall;
begin
with WizardForm do
begin
Bevel.Hide;
Bevel1.Hide;
MainPanel.Hide;
AutoScroll := False;
ClientHeight := ScaleY(105);
InnerNotebook.Align := alClient;
ProgressGauge.Left := ScaleX(40);
CancelButton.Top := ScaleY(70);
CancelButton.BringToFront;
// ----- Позиция инсталлятора ----- \\
Left:=GetSystemMetrics(16)-Width; // Справа
// Left:=0; // Слева
Top:=GetSystemMetrics(17)-Height; // Внизу
// Top:=0; // Вверху
//----------------------------------\\
end;
end;

procedure RestoreInstall;
begin
with WizardForm do
begin
Bevel.Show;
ClientHeight := ScaleY(360);
Position:=poScreenCenter;
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
case CurPageID of
wpInstalling: MiniInstall;
wpFinished: RestoreInstall;
end;
end;
кто-то может мне сделать чтобы кнопка отмены была в миниинсталле?а то её там нету
скрипт

Tco 03 10-03-2013 22:42 2108313

Всем привет. Господа знатоки, подскажите, если не сложно. Мне нужно, чтобы программа не устанавливалась ниже XP. Если я напишу так:
if (WindowsVersion.Major < 5) then MsgBox('Установка ниже версии XP невозможна!', mbError, MB_OK); - так будет правильно?

Цитата:

Цитата habib2302
дай скрипт »

На.
читать дальше »
Код:

#include "botva2.iss"

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: botva2.dll; Flags: dontcopy;
Source: CallbackCtrl.dll; Flags: dontcopy;
Source: 1.png; Flags: dontcopy;

[ Code]
function InitializeSetup:boolean;
begin
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
if not FileExists(ExpandConstant('{tmp}\1.png')) then ExtractTemporaryFile('1.png');
  Result:=True;
end;

procedure InitializeWizard;
begin
  ImgLoad(WizardForm.WelcomeLabel2.Handle, ExpandConstant('{tmp}\1.png'), ScaleX(110), ScaleY(70), ScaleX(64), ScaleY(64), True, True);
  ImgApplyChanges(WizardForm.WelcomeLabel2.Handle);
end;

procedure DeinitializeSetup;
begin
  gdipShutdown;
end;


Библиотеку botva2 от htuos качай тут, ну и разбирайся дальше что да как.

Цитата:

Цитата neorom
Памагите созтать такой скрипт »

Тоже самое, через botva2 можно реализовать (картинки вставить и так далее)... Что касается рамок - это просто Bevel или скорей всего таже самая картика в формате .png

insombia 10-03-2013 23:10 2108323

del

Johny777 11-03-2013 03:23 2108378

Цитата:

Цитата Tco 03
Что касается рамок - это просто Bevel»

нет, это самый натуральный TNewGroupBox на этом скрине http://forum.oszone.net/post-2107907-1837.html
аж три раза! :) Удобная штука. Посмотри в дизайнере, если интересно
Цитата:

Цитата Tco 03
Мне нужно, чтобы программа не устанавливалась ниже XP. Если я напишу так:
if (WindowsVersion.Major < 5) then MsgBox('Установка ниже версии XP невозможна!', mbError, MB_OK); - так будет правильно? »

даже не знаю
MajorVersion = 5 есть и у винды 2000 и 2003 а они старее XP. Короче вот код на определение версии винды. Не стал пользоваться встроенной
procedure GetWindowsVersionEx(var Version: TWindowsVersion); тк она сама использует вин апишную GetVersionEx + ещё какие-то процедуры/функции для заполнения нижних частей структуры TWindowsVersion (инфа о сервиспаке и тп)
короче если нужна чисто версия винды так будет быстрее, при работе напрямую с GetVersionEx(...) :
читать дальше »
Код:

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

type
  WindowsVersion = (Windows2000, Windows2003, WindowsXP, WindowsVista, Windows7, Windows8);
 
  _OSVERSIONINFO = record
    dwOSVersionInfoSize: DWORD;
    dwMajorVersion: DWORD;
    dwMinorVersion: DWORD;
    dwBuildNumber: DWORD;
    dwPlatformId: DWORD;
    szCSDVersion: array[0..127] of Char;
  end;

function GetVersionEx(var lpVersionInformation: _OSVERSIONINFO): BOOL; external 'GetVersionEx{#A}@kernel32.dll stdcall';

function GetWindowsVersion(): WindowsVersion;
var
  VersionInformation: _OSVERSIONINFO;
begin
  VersionInformation.dwOSVersionInfoSize := SizeOf(VersionInformation);
  if not GetVersionEx(VersionInformation) then Exit;
  case VersionInformation.DwMajorVersion of
    5: case VersionInformation.DwMinorVersion of
      0: Result := Windows2000;
      1: Result := WindowsXP;
      2: Result := Windows2003;
    end;
    6: case VersionInformation.DwMinorVersion of
      0: Result := WindowsVista;
      1: Result := Windows7;
      2: Result := Windows8;
    end;
  end;
end;



procedure InitializeWizard();
begin
  if GetWindowsVersion = Windows7 then MsgBox('Windows7', mbInformation, MB_OK);
  if GetWindowsVersion = WindowsXP then MsgBox('Установка ниже версии XP невозможна!', mbError, MB_OK);
end;


Цитата:

Цитата Tco 03
Johny777 не могли бы Вы его, пожалуйста, отрехтовать »

в шапке уже есть пример. Там правда можно убрать каллбэк библиотеку, тк CallBackAddr('имя процедуры/функции') встроенная в расширенную инно тоже вернёт адрес нужной процедуры/функции. Как это сделать есть у меня в примере да и много где ещё. Я б сам сделал, но времени у меня уже нет :( и думаю появится оно у меня очень нескоро

neorom 11-03-2013 04:08 2108380

insombia ну что там из скриптом, роботаєт ?(видали лишні повідомлення з скринки, бо в тебе переповнена вона і я не можу написати тобі повідомлення.)

habib2302 11-03-2013 10:55 2108464

Tco 03, и дай скрипт только для деинсталлятора

bosenkov5 12-03-2013 17:08 2109462

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

alert30 12-03-2013 19:06 2109555

bosenkov5, http://forum.oszone.net/thread-235078.html

А для фоновых рисунокв в инсталляторе используй программу GameScript Generator, он по Вашим подчинениям запишет автоматом все в скрипт Inno Setup.

neorom 12-03-2013 19:15 2109565

Tco 03 прошу, єсли можеш, поможи из скриптом (я Inno Setup только начал розбератся, и пока все я непонемаю)

bosenkov5 12-03-2013 20:36 2109639

alert30, как это автоматом?

Tco 03 12-03-2013 20:59 2109661

Ну у Вас и манеры, мистер habib2302 :kruto:
Цитата:

Цитата habib2302
Tco 03, и дай скрипт только для деинсталлятора »

Что именно тебе дать, только скрипт деинсталлятора? Или скрипт деинсталлятора приправленный botva2 ?

Цитата:

Цитата neorom
Tco 03 прошу, єсли можеш, поможи из скриптом (я Inno Setup только начал розбератся, и пока все я непонемаю) »

Тут есть люди, которые разбираются куда больше меня... :boast:
Вот, могу предложить скрип, изучив его у Вас должно всё получиться.
читать дальше »
Код:

[Languages]
Name: en; MessagesFile: compiler:Default.isl
Name: nl; MessagesFile: compiler:Languages\Dutch.isl
Name: de; MessagesFile: compiler:Languages\german.isl
Name: fr; MessagesFile: compiler:Languages\french.isl
Name: es; MessagesFile: compiler:Languages\spanish.isl
Name: po; MessagesFile: compiler:Languages\PortugueseStd.isl
Name: ko; MessagesFile: compiler:Languages\korean.isl

[Types]
Name: full; Description: Complete Install
Name: upgr; Description: Upgrade RC18
Name: serv; Description: Server Only
Name: servup; Description: Server Upgrade
Name: view; Description: Viewer Only
Name: viewup; Description: Viewer Upgrade
Name: custom; Description: Custom; Flags: iscustom

[Components]
Name: server; Description: UltraVNC Server; Types: full upgr serv servup; Flags: disablenouninstallwarning
Name: server/install; Description: Install; Types: full serv; Flags: disablenouninstallwarning exclusive
Name: server/upgrade; Description: Upgrade RC18; Types: upgr servup; Flags: disablenouninstallwarning exclusive
Name: viewer; Description: UltraVNC Viewer; Types: full upgr view viewup; Flags: disablenouninstallwarning
Name: viewer/install; Description: Install; Types: full view; Flags: disablenouninstallwarning exclusive
Name: viewer/upgrade; Description: Upgrade RC18; Types: upgr viewup; Flags: disablenouninstallwarning exclusive
Name: repeater; Description: UltraVNC Repeater; Types: full; Flags: disablenouninstallwarning
Name: driver; Description: UltraVNC Download Video Driver; MinVersion: 0,5.0.2195; Types: full serv; Flags: disablenouninstallwarning
Name: encrypt; Description: UltraVNC Download Encryption Plugin; Types: full serv view; Flags: disablenouninstallwarning

[Tasks]
Name: installservice; Description: &Register Ultr@VNC Server as a system service; GroupDescription: Server configuration:; Components: server; Flags: unchecked exclusive
Name: startservice; Description: &Start or restart Ultr@VNC service; GroupDescription: Server configuration:; Components: server; Flags: unchecked; MinVersion: 0,1
Name: desktopicon; Description: Create a Ultr@VNC &Viewer desktop icon; GroupDescription: Additional icons:; Components: viewer
Name: desktopicon2; Description: Create a Ultr@VNC &Server desktop icon; GroupDescription: Additional icons:; Components: server
Name: desktopicon3; Description: Create a Ultr@VNC &Repeater desktop icon; GroupDescription: Additional icons:; Components: Repeater
Name: associate; Description: &Associate .vnc files with Ultr@VNC Viewer; GroupDescription: File Associations:; Components: viewer


[Files]
Source: vnchooks.dll; DestDir: {app}; Components: server; Flags: ignoreversion restartreplace
Source: VNCHooks_Settings.reg; DestDir: {app}; Components: server; Flags: ignoreversion
Source: Licence.txt; DestDir: {app}
Source: vncddihk.dll; DestDir: {app}; Components: server; MinVersion: 4.0.1111,0; Flags: ignoreversion
Source: 16bithlp.exe; DestDir: {app}; MinVersion: 4.0.1111,0; Components: server; Flags: ignoreversion
Source: workgrpdomnt4.dll; DestDir: {app}; Components: server; Flags: ignoreversion
Source: authadmin.dll; DestDir: {app}; Components: server; Flags: ignoreversion
Source: winvnc.exe; DestDir: {app}; Components: server; Flags: ignoreversion restartreplace
Source: vncviewer.exe; DestDir: {app}; Flags: ignoreversion; Components: viewer
Source: Whatsnew.txt; DestDir: {app}
Source: Readme.txt; DestDir: {app}
Source: ldapauth.dll; DestDir: {app}; Flags: ignoreversion; Components: server
Source: logmessages.dll; DestDir: {app}; Flags: ignoreversion; Components: server
Source: logging.dll; DestDir: {app}; Flags: ignoreversion; Components: server
Source: ldapauthnt4.dll; DestDir: {app}; Flags: ignoreversion; Components: server
Source: UnZip32.dll; DestDir: {app}; Flags: ignoreversion; Components: viewer server
Source: Zip32.dll; DestDir: {app}; Flags: ignoreversion; Components: viewer server
Source: logging.dll; DestDir: {app}; Components: server; Flags: ignoreversion
Source: ldapauth9x.dll; DestDir: {app}; Flags: ignoreversion; Components: server
Source: repeater.exe; DestDir: {app}; Flags: ignoreversion; Components: Repeater
Source: ldapauth9x.dll; DestDir: {app}; Flags: ignoreversion; Components: server
Source: authSSP.dll; DestDir: {app}; Flags: ignoreversion; Components: server
Source: SecurityEditor.dll; DestDir: {app}; Flags: ignoreversion; Components: server
Source: MSLogonACL.exe; DestDir: {app}; Flags: ignoreversion; Components: server

Source: MSLogonACL.exe; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: SecurityEditor.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: authSSP.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: ldapauth9x.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: repeater.exe; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: ldapauth9x.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: authadmin.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: Zip32.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: UnZip32.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: ldapauthnt4.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: logmessages.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: ldapauth.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: Readme.txt; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: Whatsnew.txt; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: vncviewer.exe; DestDir: {app}; Flags: ignoreversion restartreplace; Components: viewer/upgrade
Source: winvnc.exe; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: logging.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: workgrpdomnt4.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: 16bithlp.exe; DestDir: {app}; Flags: ignoreversion restartreplace; MinVersion: 4.0.1111,0; Components: server/upgrade
Source: vncddihk.dll; DestDir: {app}; Flags: ignoreversion restartreplace; MinVersion: 4.0.1111,0; Components: server/upgrade
Source: Licence.txt; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: VNCHooks_Settings.reg; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: vnchooks.dll; DestDir: {app}; Flags: ignoreversion restartreplace; Components: server/upgrade
Source: vncdrv.dll; DestDir: {sys}; Flags: restartreplace ignoreversion; Components: server/upgrade

Source: {tmp}\install.bat; DestDir: {app}\driver; Components: driver; Flags: external skipifsourcedoesntexist
Source: {tmp}\install_silent.bat; DestDir: {app}\driver; Components: driver; Flags: external skipifsourcedoesntexist
Source: {tmp}\uninstall.bat; DestDir: {app}\driver; Components: driver; Flags: external skipifsourcedoesntexist
Source: {tmp}\uninstall_silent.bat; DestDir: {app}\driver; Components: driver; Flags: external skipifsourcedoesntexist
Source: {tmp}\setupdrv.exe; DestDir: {app}\driver; Components: driver; Flags: external skipifsourcedoesntexist
Source: {tmp}\vnccom.sys; DestDir: {app}\driver; Components: driver; Flags: external skipifsourcedoesntexist
Source: {tmp}\vncdrv.dll; DestDir: {app}\driver; Components: driver; Flags: external skipifsourcedoesntexist
Source: {tmp}\vncdrv.inf; DestDir: {app}\driver; Components: driver; Flags: external skipifsourcedoesntexist
Source: {tmp}\vncdrv.sys; DestDir: {app}\driver; Components: driver; Flags: external skipifsourcedoesntexist
Source: {tmp}\vnchelp.dll; DestDir: {app}\driver; Components: driver; Flags: external skipifsourcedoesntexist
Source: {tmp}\MSRC4Plugin.dsm; DestDir: {app}; Components: encrypt; Flags: external skipifsourcedoesntexist

Source: english.dll; DestDir: {app}; Components: viewer; Languages: nl en; DestName: lang.dll
Source: french.dll; DestDir: {app}; Languages: fr; Components: viewer; DestName: lang.dll
Source: german.dll; DestDir: {app}; Languages: de; Components: viewer; DestName: lang.dll
Source: portugees.dll; DestDir: {app}; Languages: po; Components: viewer; DestName: lang.dll
Source: spanish.dll; DestDir: {app}; Languages: es; Components: viewer; DestName: lang.dll
Source: korean.dll; DestDir: {app}; Languages: ko; Components: viewer; DestName: lang.dll
Source: english.dll; DestDir: {app}\lang; Components: viewer
Source: french.dll; DestDir: {app}\lang; Components: viewer
Source: german.dll; DestDir: {app}\lang; Components: viewer
Source: portugees.dll; DestDir: {app}\lang; Components: viewer
Source: spanish.dll; DestDir: {app}\lang; Components: viewer
Source: korean.dll; DestDir: {app}\lang; Components: viewer


habib2302 12-03-2013 21:49 2109739

Tco 03, чтобы лого срабатывало во время удаления тоже без фона (с botva2)
тем более в том скрипте выдает ошибку.вот скрин с ошибкой

Tco 03 12-03-2013 22:22 2109782

Цитата:

Цитата habib2302
тем более тот скрипт который ты мне дал,он не работает!!! »

То что я тебе дал ещё как работает! А вот куда ты его впиндюрил, тем более на обычный инсталл, естественно работать не будет.
Я тебе дал просто пример и сказал: -"Дальше разбирёшься сам".
botva2 в идеале работает с:
OuterNotebook.Hide;
InnerNotebook.Hide;
И если ты скачал библиотеку по той ссылке, по которой я тебя отправил, читай справку находящуюся в этой библиотеки. Там всё почти подробно описано. Чесно говоря не знаю в какой версии, но и пример деинсталлятора тоже идёт вместе с библиотекой.

Добавленно:
В моём примере я написал: #include "botva2.iss" то есть нужно подключить модуль botva2, скрипт ботвы должен находиться рядом с твоим скриптом. Или же в свой скрипт вписывай то, что тебе нужно. В твоём случаи это всего лишь:
читать дальше »
function ImgLoad(Wnd :HWND; FileName :PAnsiChar; Left, Top, Width, Height :integer; Stretch, IsBkg :boolean) :Longint; external 'ImgLoad@files:botva2.dll stdcall delayload';
procedure ImgApplyChanges(h:HWND); external 'ImgApplyChanges@files:botva2.dll stdcall delayload';

И не забуть добавить:
procedure gdipShutdown; external 'gdipShutdown@files:botva2.dll stdcall delayload';

procedure DeinitializeSetup();
begin
gdipShutdown;
end;

А то наделаешь косячных репаков: Для справки: gdipShutdown; выгружает botva2.dll без этой фунции, временная папка созданная Inno, не удалиться!

habib2302 12-03-2013 22:55 2109816

Tco 03, выдает ошибку

Tco 03 12-03-2013 23:15 2109840

habib2302
Специально для тебя, чтобы ты не порочил моё доброе имя :hi:
Незабудь только добавить:
procedure DeinitializeSetup();
begin
gdipShutdown;
end;
P.S. Только не говори, что лейблы криво отображаются! Создавай свои или поправляй имеющийся! :moil:

alert30 13-03-2013 04:32 2109957

Цитата:

Цитата bosenkov5
как это автоматом? »

Скачайте эту программу, сделайте Ваш слайд-шоу и сохраните. Сохраняется в скрипт Inno Setup.
Ну "автоматом", это я придумал, более этого смысла не мог подумать.

neorom 13-03-2013 10:56 2110079

Цитата:

Цитата Tco 03
Тут есть люди, которые разбираются куда больше меня... »

Да я вижу, людей здесь очень много коториє готови помочь мне но ни один что то и досехпор реально не помог ...

audiofeel 13-03-2013 11:04 2110082

здравствуйте, помогите - допустим (только допустим) есть фаилы общий размер которых превышает DVD5, нужно что бы они копировались как внешние (Flags: external overwritereadonly ignoreversion). а теперь сам вопрос - как заставить этот Inno Setup что бы он попросил поменять, ну или перевернуть диск

Tco 03 13-03-2013 12:05 2110122

audiofeel
Вот, когда-то, где-то нашёл вот такой скрипт.
читать дальше »
Код:

Скрипт для установки архивов, записанных на двух DVD. На примере показано извлечение из 7z SFX-архивов.

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
OutputBaseFilename=setup
Compression=none
OutputDir=C:\Output
SolidCompression=no

[Files]
;На диске рядом с инсталлятором размещаем папку EmptyFiles, в которую помещаем "файлы-пустышки" игры.
;Сначала выполняется первый архив (последовательность AfterInstall должна быть такой)
Source: "{src}\EmptyFiles\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs external; AfterInstall: InstallFirstArchive
;А затем второй
Source: "{src}\EmptyFiles\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs external; AfterInstall: CheckSelectedDisk

[ Code]
//На странице установки отключаем подтверждающее сообщение (чтобы не было проблем с откатом)
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel:=True;
If CurPage=12 then
begin
Confirm:=False;
end;
end;

//Устанавливаем первый 7z SFX (Pack1.exe) архив, находящийся на первом диске (рядом с инсталлятором)
//Никаких сообщений об ошибках и т.д. не применяем, т.к. вся ответственность должна лежать на распространителе
procedure InstallFirstArchive;
var
res:Integer;
s,s1:string;
begin
s:=ExpandConstant('{app}');
s1:=ExpandConstant('{src}')+'\Pack1.exe';
Exec(s1, '-y -o"'+ s + '"', '', SW_SHOWNORMAL, ewWaitUntilTerminated, Res);
end;

//Затем выводим соответствующее сообщение для вставки второго диска со вторым архивом
procedure CheckSelectedDisk;
var
res:Integer;
s,s2:string;
Confirm: Boolean;
begin
s:=ExpandConstant('{app}');
s2:=ExpandConstant('{src}')+'\Pack2.exe';
//Если второго архива рядом нету (мало ли, в будущем игра будет записана на двуслойном диске)
if not Exec(s2, '-y -o"'+ s + '"', '', SW_SHOWNORMAL, ewWaitUntilTerminated, Res) then
//то тогда выводим сообщение
case MsgBox('Для дальнейшей установки требуется файл '''+ s2 +'''!'#13#13 +
'Вставьте второй DVD, содержащий архив, и нажмите "OK".' #13#13 +
'Нажмите "Отмена", чтобы прекратить дальнейшую установку.', mbInformation, MB_OKCANCEL)
of IDCANCEL:
begin
//Выполняем откат действий при отмене
Confirm:=False;
WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
end
IDOK:
begin
CheckSelectedDisk;
end;
end;
end;


saurn 13-03-2013 12:13 2110128

neorom

читать дальше »
Код:

[Setup]
AppName=Microsoft® Windows® XP Ukrainian User Interface Pack
AppVerName=Microsoft® Windows® XP Ukrainian Multilingual User Interface Pack
AppPublisher=Music Mix Studio© & Records Company® 2006-2008
AppPublisherURL=http://winxp.org.ua
AppSupportURL=http://winxp.org.ua
AppUpdatesURL=http://winxp.org.ua
CreateAppDir=no
OutputBaseFilename=setup1
Compression=lzma
Uninstallable=no
PrivilegesRequired=none
DisableProgramGroupPage=yes
LicenseFile=embedded\License.txt
InfoBeforeFile=embedded\InfoBefore.txt
InfoAfterFile=embedded\InfoAfter.txt
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp

[Files]
Source: {tmp}\*.*; DestDir: {tmp}\mui; Flags: ignoreversion;

[Run]
Filename: {tmp}\mui\muisetup_ru_sp2.exe; Parameters: /i 0422 /d 0422 /l /f /r /s; Components: sp2comp; Tasks: sp2;
Filename: {tmp}\mui\muisetup_ru_sp3.exe; Parameters: /i 0422 /d 0422 /l /f /r /s; Components: sp3comp; Tasks: sp3;
Filename: {tmp}\mui\muisetup_ru_sp2.exe; Components: sp2comp; Tasks: sp2m;
Filename: {tmp}\mui\muisetup_ru_sp3.exe; Components: sp3comp; Tasks: sp3m;
Filename: {tmp}\mui\wmp_8_mui.cmd; Tasks: mp8;
Filename: {tmp}\mui\wmp_9_mui.cmd; Tasks: mp9;
Filename: {tmp}\mui\wmp_10_mui.cmd; Tasks: mp10;
Filename: {tmp}\mui\wmp_11_mui.cmd; Tasks: mp11;

[Tasks]
Name: sp2; Description: Автоматичне встановлення (рекомендовано); GroupDescription: Виберіть режим встановлення; Components: sp2comp; Flags: exclusive;
Name: sp3; Description: Автоматичне встановлення (рекомендовано); GroupDescription: Виберіть режим встановлення; Components: sp3comp; Flags: exclusive;
Name: sp2m; Description: Ручне встановлення; GroupDescription: Виберіть режим встановлення; Components: sp2comp; Flags: exclusive unchecked;
Name: sp3m; Description: Ручне встановлення; GroupDescription: Виберіть режим встановлення; Components: sp3comp; Flags: exclusive unchecked;
Name: mp8; Description: 8; GroupDescription: Оберіть версію встановленого Медіа Програвача; Flags: exclusive unchecked;
Name: mp9; Description: 9; GroupDescription: Оберіть версію встановленого Медіа Програвача; Flags: exclusive unchecked;
Name: mp10; Description: 10; GroupDescription: Оберіть версію встановленого Медіа Програвача; Flags: exclusive;
Name: mp11; Description: 11; GroupDescription: Оберіть версію встановленого Медіа Програвача; Flags: exclusive unchecked;

[Components]
Name: sp2comp; Description: Service Pack 2; Types: sp2os;
Name: sp3comp; Description: Service Pack 3; Types: sp3os;

[Types]
Name: sp3os; Description: Service Pack 3;
Name: sp2os; Description: Service Pack 2;

[Languages]
Name: ukrainian; MessagesFile: compiler:Languages\Ukrainian.isl;


neorom 13-03-2013 13:02 2110172

saurn спасибо тебе, все за роботало !!!

Tco 03 13-03-2013 15:58 2110318

Господа, возможно ли при инсталляции программы удалить ключ реестра созданный другой программой? Ну что-то типа [InstallDelete] или каким-нибудь другим способом :)

Mailchik 13-03-2013 18:21 2110469

Tco 03,
Код:

function RegDeleteKeyIncludingSubkeys(const RootKey: Integer;
  const SubkeyName: String): Boolean; //-----удаляет ключ реестра включая подключи
function RegDeleteKeyIfEmpty(const RootKey: Integer;
  const SubkeyName: String): Boolean; //-----удаляет ключ реестра, если он пустой
function RegDeleteValue(const RootKey: Integer;
  const SubKeyName, ValueName: String): Boolean; //-----удаляет значение ключа реестра


neorom 13-03-2013 18:51 2110492

Как мне зделать скрипт чтоб после компиляции било єто Просьба привести пример скрипта.

saurn 13-03-2013 19:00 2110500

Tco 03
Например, на этапе установки, так:

Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
    if RegKeyExists(HKLM, 'SOFTWARE\MyProgram') then  //поиск ключа
    begin
      RegDeleteKeyIncludingSubkeys(HKLM, 'SOFTWARE\MyProgram'); //если ключ найден, удаление ключа и всего, что в нем есть.
    end;
  end;
end;


Tco 03 13-03-2013 19:34 2110544

Цитата:

Цитата neorom
Как мне зделать скрипт чтоб после компиляции било єто Просьба привести пример скрипта »

Это архивы созданные не Inno Setup, а другими архиваторами, например FreeArc

bosenkov5 13-03-2013 20:40 2110602

alert30, нет у меня есть уже скрипт и я не хотел бы его менять

Fortress1 13-03-2013 21:01 2110612

Цитата:

Цитата bosenkov5
alert30, нет у меня есть уже скрипт и я не хотел бы его менять »

Отредактируйте свой и добавьте туда данные из того, что выдаст вам GameScript Generator, и будет вам счастье

El Sanchez 13-03-2013 23:17 2110702

Цитата:

Цитата Tco 03
возможно ли при инсталляции программы удалить ключ реестра созданный другой программой? Ну что-то типа [InstallDelete] или каким-нибудь другим способом »

Tco 03, через секцию [Registry] просто:
Код:

[Registry]
Root: HKLM; Subkey: SOFTWARE\My Company; Flags: deletekey dontcreatekey


audiofeel 14-03-2013 01:51 2110757

Tco 03, Этот пример у меня есть, я его пробовал (у меня без 7Z) = фаилы копируются по два раза - как исправить? (у меня на каждом диске лежит папка с одинаковым названием - вот из этих папок мне нужно скопировать все фаилы в папку с продуктом (изменить название папки в {src}\ нельзя)) а они копируются по два раза (и это на первом "диске" - второй диск эмулировать не стал) но подсунул фаилы после запроса второго "архива" и ноль эмоций

Tco 03 14-03-2013 14:59 2111099

audiofeel
Цитата:

Цитата audiofeel
у меня на каждом диске лежит папка с одинаковым названием »

Если папки одинаковые, тогда делайте проверку на присутствие файлов...
Вот набросал пример (с разными папками) какая разница с какими именами папки на диске, они же копируются в заданный каталог, где указывается что и куда скопировать.
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
OutputBaseFilename=setup
Compression=none
OutputDir=.
SolidCompression=no

[Files]
Source: "{src}\Folder 1\*"; DestDir: "{app}"; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: "{src}\Folder 2\*"; DestDir: "{app}"; Flags: external ignoreversion recursesubdirs createallsubdirs; BeforeInstall: CopySecondFolder;

[ Code]
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
  Cancel:= True;
if CurPage = 12 then
begin
  Confirm:= False;
end;
end;

procedure CopySecondFolder;
var
 Confirm: Boolean;
begin
if not DirExists(ExpandConstant('{src}\Folder 2')) then
case MsgBox('Для дальнейшей установки необходм второй диск!'#13#13 +
  'Вставьте второй DVD и нажмите "OK".' #13#13 +
  'Нажмите "Отмена", чтобы прекратить дальнейшую установку.', mbInformation, MB_OKCANCEL)
of IDCANCEL:
begin
  Confirm:= False;
  WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
end
  IDOK:
begin
  CopySecondFolder;
end;
end;
end;


insombia 14-03-2013 19:14 2111329

del

audiofeel 14-03-2013 21:15 2111432

Tco 03, после запроса диска ложу фаилы со второго диска = ноль эмоций, молчание
читать дальше »


[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
OutputBaseFilename=setup
Compression=none
OutputDir=.
SolidCompression=no

[Files]
Source: {src}\GameFiles\*; DestDir: {app}; Flags: external ignoreversion

Source: {src}\GameFiles\GAME3.DAT; DestDir: {app}; Flags: external ignoreversion; BeforeInstall: CopySecondFolder
Source: {src}\GameFiles\GAME5.DAT; DestDir: {app}; Flags: external ignoreversion; BeforeInstall: CopySecondFolder
Source: {src}\GameFiles\GAME6.DAT; DestDir: {app}; Flags: external ignoreversion; BeforeInstall: CopySecondFolder
Source: {src}\Docs\GB\Eula.rtf; DestDir: {app}\Docs; Flags: external ignoreversion; BeforeInstall: CopySecondFolder
Source: {src}\Docs\GB\Readme.rtf; DestDir: {app}\Docs; Flags: external ignoreversion; BeforeInstall: CopySecondFolder

//[ Code]
procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
Cancel:= True;
if CurPage = 12 then
begin
Confirm:= False;
end;
end;

procedure CopySecondFolder;
var
Confirm: Boolean;
begin
if not DirExists(ExpandConstant('{src}\GameFiles\GAME3.DAT')) then
case MsgBox('Äëÿ äàëüíåéøåé óñòàíîâêè íåîáõîäèì âòîðîé äèñê!'#13#13 +
'Âñòàâüòå âòîðîé DVD è íàæìèòå "OK".' #13#13 +
'Íàæìèòå "Îòìåíà", ÷òîáû ïðåêðàòèòü äàëüíåéøóþ óñòàíîâêó.', mbInformation, MB_OKCANCEL)
of IDCANCEL:
begin
Confirm:= False;
WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
end
IDOK:
begin
CopySecondFolder;
end;
end;
end;


saurn 14-03-2013 21:56 2111456

audiofeel

Если ищите на втором диске не папку, а файл, то вот эту строку в скрипте:
Код:

if not DirExists(ExpandConstant('{src}\GameFiles\GAME3.DAT')) then
Замените на эту:

Код:

if not FileExists(ExpandConstant('{src}\GameFiles\GAME3.DAT')) then
Ну и потому что файлы внешние анимация прогресс бара не будет отображатся , как положено. Тоесть при копирование с первого диска прогресс будет заполнятся равномерно, когда дойдет до 100, вывалится запрос на другой диск, и после вставки диска прогресс будет стоять на месте на 100%, но при этом файлы будут копироватся. Возможно, знающие люди смогут подсказать, как всё это правильно релизовать.

audiofeel 14-03-2013 23:39 2111501

Цитата:

Цитата saurn
Ну и потому что файлы внешние анимация прогресс бара не будет отображатся , как положено. Тоесть при копирование с первого диска прогресс будет заполнятся равномерно, когда дойдет до 100, вывалится запрос на другой диск, и после вставки диска прогресс будет стоять на месте на 100%, но при этом файлы будут копироватся. »

А если подставить размеры фаилов при помощи "ExternalSize" но тогда вопрос какой размер лучше вписывать, ( 1 = размер: 2,25KB(2 311 байт) 2 = На диске 4,00 КВ(4 096 байт)

alert30 15-03-2013 09:23 2111602

Цитата:

Цитата neorom
Как мне зделать скрипт чтоб после компиляции »

Надо снять галочку "Компилировать через загрузчик" (как-то так) через утилиты ISTool, или Inno Setup Script Studio или InnoIDE.

Dark_Delphin 15-03-2013 23:32 2112082

Подскажите, пожалуйста, как инасталлятору сделать стандартный скин:

http://i51.fastpic.ru/big/2013/0315/...e36a2a219f.png

alert30 16-03-2013 02:16 2112143

Dark_Delphin, если обычный классический скин Windows, так в SkinBuilder-е просто создаешь новый (кнопка "New"), и сохраняешь скин.

Dark_Delphin 16-03-2013 02:44 2112150

alert30, я делал так, но почемуто не отображается он.

alert30 16-03-2013 04:18 2112162

Dark_Delphin, попробуйте ради эксперимента скин Office 2007, если опять не вышло, значит проблема с DLL-ками скина.

Gnom_aka_Lexander 16-03-2013 07:30 2112180

Dark_Delphin, в шапке есть пример задания цвета прогрессбару. оттуда тебе нужна функция SetWindowTheme. Вот ее у себя декларируешь и применяешь к хендлам элементов, которые нужно отобразить в классическом виде. Тоесть, главное окно и кнопки - это в первую очередь. для модальных окошек (обзоры всякие) я писал длл-ку, ибо инно слишком медленно работает - пока там интерпретатор поймет чего от него хотят, в итоге окошки моргали. если найду, где валяется у меня - выложу попозже.

alert30 16-03-2013 12:46 2112322

neorom, в шапке есть куча справок, или почитайте каждую страницу.

neorom 16-03-2013 13:05 2112333

Цитата:

Цитата alert30
в шапке есть куча справок, или почитайте каждую страницу. »

Мне только надо знать назву похожого скрипта

Dark_Delphin 16-03-2013 13:28 2112345

neorom, NFS Undecover

Johny777 16-03-2013 13:30 2112350

Dark_Delphin, держи процедуру установки стиля всем окнам на форме на основе SetWindowTheme(...), чтоб много букв не печатать
Код:

#ifdef UNICODE
    function SetWindowTheme(hwnd: HWND; pszSubAppName, pszSubIdList: PAnsiChar): Longint; external 'SetWindowTheme@uxtheme.dll stdcall';
#else
    function SetWindowTheme(hwnd: HWND; pszSubAppName, pszSubIdList: PChar): Longint; external 'SetWindowTheme@uxtheme.dll stdcall';
#endif


procedure SetClassicTheme(UndefCtrl: TWinControl);
var
  i: Integer;
begin
  SetWindowTheme(TWinControl(UndefCtrl).Handle, #32#32, #32#32);
  for i := 0 to UndefCtrl.ControlCount-1 do if UndefCtrl.Controls[i] is TWinControl then if TWinControl(UndefCtrl.Controls[i]).ControlCount-1 > 0 then SetClassicTheme(TWinControl(UndefCtrl.Controls[i])) else SetWindowTheme(TWinControl(UndefCtrl.Controls[i]).Handle, #32#32, #32#32);
end;


procedure InitializeWizard();
begin
  SetClassicTheme(WizardForm);
end;

Gnom_aka_Lexander, Спасибо, хорошая функция!

Dark_Delphin 16-03-2013 14:05 2112366

Johny777, спасибо большое.
Готово.

Gnom_aka_Lexander 16-03-2013 15:19 2112404

Цитата:

Цитата Johny777
Спасибо, хорошая функция! »

Это не мне спасибо. Это Microsoft-у спасибо.

neorom 16-03-2013 17:10 2112450

Как мне создать только скрипт для зтого фото
Так же нужен скрипт под Fenixx

Tco 03 16-03-2013 23:24 2112696

Цитата:

Цитата neorom
Как мне создать только скрипт для зтого »

Это чистый ISDone!
Цитата:

Цитата neorom
Так же нужен скрипт под Fenixx »

Во истину, что дерьмовей, то людям нравится больше! Это вообще трудно назвать скрипт(ом(ами)). То что ты видишь - это всего лишь картинка (ну там FotoShop, или ещё что) подставь к картинке прогрессбар, кнопки и всё такое - вот тебе и скрипт, как его там.

alert30 17-03-2013 02:38 2112769

neorom, в конце концов прочитали бы справку какую-то, а не тупо сказать "мне нужен готовый скрипт, как вот это"...

neorom 17-03-2013 11:16 2112875

Цитата:

Цитата Tco 03
Это вообще трудно назвать скрипт(ом(ами)). То что ты видишь - это всего лишь картинка (ну там FotoShop, или ещё что) подставь к картинке прогрессбар, кнопки и всё такое - вот тебе и скрипт, как его там. »

Єсли всь так просто, то почеме не может никто єделать єтат скрип. Да, на славах у вас всех всьо очень легко, но на деле нечево не видно.
P.S. Да, я пересматрел форум и понял что скрипт от Fenixx всем очень нравиться, и я не нашол ни одного человека каторий зделать єтот скрипт, только на словах все хвастаются что он очень прост !!!
Цитата:

Цитата alert30
в конце концов прочитали бы справку какую-то, а не тупо сказать "мне нужен готовый скрипт, как вот это"... »

Да я, не профи в созданию скриптов, я просто новочьок. Но и профи просто переводят стрелки заместь того чтоб просто навести пример или дасть злилку на похожий ответ .
Цитата:

Цитата Tco 03
Это чистый ISDone! »

Но где найти єтот скрипт (чтоби процес бар отображался именно так, как на фото) ?

Tco 03 17-03-2013 13:23 2112945

neorom
Цитата:

Цитата neorom
Єсли всь так просто, то почеме не может никто єделать єтат скрип. Да, на славах у вас всех всьо очень легко, но на деле нечево не видно. »

Вам никто не хочет помогать потому, что Вы задаёте вопросы на уже давно очевидные вещи! И если провести денёк на этом форуме и почитать даже ту шапку, я уверен, половина вопросов сразу же отпадут.
И когда Вы изучите Inno и поймёте что к чему - Вы будете говорить точно так же, как сейчас отвечают Вам.
Чтобы развеять Ваше негативное отношение к людям находящихся на этом форуме, якобы всё только на словах, а на деле... Вот Вам пример.
читать дальше »
Код:

[Setup]
AppName=Example
AppVerName=Example
DefaultDirName={pf}\Example
OutputDir=.

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

[Messages]
SetupWindowTitle=FORUM OSZONE.NET EXAMPLE

[Files]
Source: "ISSkin.dll"; DestDir: "{tmp}"; Flags: dontcopy;
Source: "Tiger.cjstyles"; DestDir: "{tmp}"; Flags: dontcopy;
Source: "botva2.dll"; DestDir: "{tmp}"; Flags: dontcopy;
Source: "1.jpg"; DestDir: "{tmp}"; Flags: dontcopy;
Source: "2.jpg"; DestDir: "{tmp}"; Flags: dontcopy;

[ Code]
var
  WelcomeLabel1, WelcomeLabel2, SelectDirLabel, SelectDirBrowseLabel: TLabel;

procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

function ImgLoad(Wnd :HWND; FileName :PAnsiChar; Left, Top, Width, Height :integer; Stretch, IsBkg :boolean) :Longint; external 'ImgLoad@files:botva2.dll stdcall delayload';
procedure ImgApplyChanges(h:HWND); external 'ImgApplyChanges@files:botva2.dll stdcall delayload';
procedure gdipShutdown; external 'gdipShutdown@files:botva2.dll stdcall delayload';

function InitializeSetup(): Boolean;
begin
if not FileExists(ExpandConstant('{tmp}\ISSkin.dll')) then ExtractTemporaryFile('ISSkin.dll');
if not FileExists(ExpandConstant('{tmp}\Tiger.cjstyles')) then ExtractTemporaryFile('Tiger.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
  Result:= True;
end;

procedure InitializeWizard();
begin
if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
if not FileExists(ExpandConstant('{tmp}\1.jpg')) then ExtractTemporaryFile('1.jpg');
if not FileExists(ExpandConstant('{tmp}\2.jpg')) then ExtractTemporaryFile('2.jpg');

  WizardForm.ClientWidth:= ScaleX(1000);
  WizardForm.ClientHeight:= ScaleY(600);
  WizardForm.Width:= ScaleX(1000);
  WizardForm.Height:= ScaleY(600);
  WizardForm.Position:= poScreenCenter;

with WizardForm do
begin
  InnerNotebook.Left:= ScaleX(0);
  InnerNotebook.Top:= ScaleY(0);
  InnerNotebook.Width:= WizardForm.ClientWidth;
  InnerNotebook.Height:= WizardForm.ClientHeight;
  OuterNotebook.Left:= ScaleX(0);
  OuterNotebook.Top:= ScaleY(0);
  OuterNotebook.Width:= WizardForm.ClientWidth;
  OuterNotebook.Height:= WizardForm.ClientHeight;
 
  WizardBitmapImage.Hide;
  WelcomeLabel1.Hide;
  WelcomeLabel2.Hide;
  WizardSmallBitmapImage.Hide;
  MainPanel.Hide;
  SelectDirLabel.Hide;
  SelectDirBrowseLabel.Hide;
  SelectDirBitmapImage.Hide;
  DiskSpaceLabel.Hide;
end;

with WizardForm.BackButton do
begin
  Left:= ScaleX(700);
  Top:= ScaleY(540);
  BringToFront;
end;

with WizardForm.NextButton do
begin
  Left:= ScaleX(800);
  Top:= ScaleY(540);
  BringToFront;
end;

with WizardForm.CancelButton do
begin
  Left:= ScaleX(900);
  Top:= ScaleY(540);
  BringToFront;
end;

WelcomeLabel1:= TLabel.Create(WizardForm);
with WelcomeLabel1 do
begin
  Left:= ScaleX(50);
  Top:= ScaleY(50);
  Transparent:= True;
  Font.Color:= $0006FF;
  Font.Name:= 'Arial';
  Font.Size:= 14;
  Font.Style:= [fsBold];
  Caption:= WizardForm.WelcomeLabel1.Caption;
  Parent:= WizardForm.WelcomePage;
end;

WelcomeLabel2:= TLabel.Create(WizardForm);
with WelcomeLabel2 do
begin
  Left:= ScaleX(50);
  Top:= ScaleY(400);
  Transparent:= True;
  Font.Color:= $00FFFF;
  Font.Name:= 'Arial';
  Font.Size:= 10;
  Font.Style:= [fsBold];
  Caption:= WizardForm.WelcomeLabel2.Caption;
  Parent:= WizardForm.WelcomePage;
end;

SelectDirLabel:= TLabel.Create(WizardForm);
with SelectDirLabel do
begin
  Left:= ScaleX(50);
  Top:= ScaleY(50);
  Transparent:= True;
  Font.Color:= $0006FF;
  Font.Name:= 'Arial';
  Font.Size:= 14;
  Font.Style:= [fsBold];
  Caption:= WizardForm.SelectDirLabel.Caption;
  Parent:= WizardForm.SelectDirPage;
end;

SelectDirBrowseLabel:= TLabel.Create(WizardForm);
with SelectDirBrowseLabel do
begin
  Left:= ScaleX(50);
  Top:= ScaleY(400);
  Transparent:= True;
  Font.Color:= $00FFFF;
  Font.Name:= 'Arial';
  Font.Size:= 10;
  Font.Style:= [fsBold];
  Caption:= WizardForm.SelectDirBrowseLabel.Caption;
  Parent:= WizardForm.SelectDirPage;
end;

with WizardForm.DirBrowseButton do
begin
  Left:= ScaleX(600);
  Top:= ScaleY(540);
end;

with WizardForm.DirEdit do
begin
  Left:= ScaleX(50);
  Top:= ScaleY(540);
  Width:= ScaleX(500);
end;

  ImgLoad(WizardForm.WelcomePage.Handle, ExpandConstant('{tmp}\1.jpg'), ScaleX(0), ScaleY(0), WizardForm.InnerNotebook.Width, WizardForm.InnerNotebook.Height, True, True);
  ImgApplyChanges(WizardForm.WelcomePage.Handle);
 
  ImgLoad(WizardForm.SelectDirPage.Handle, ExpandConstant('{tmp}\2.jpg'), ScaleX(0), ScaleY(0), WizardForm.InnerNotebook.Width, WizardForm.InnerNotebook.Height, True, True);
  ImgApplyChanges(WizardForm.SelectDirPage.Handle);
end;

procedure DeinitializeSetup();
begin
  ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
  UnloadSkin();
  gdipShutdown;
end;


neorom 17-03-2013 13:56 2112969

Tco 03 Как мне добавить до моєго скрипта вот єти финкции(установка значка и установка по)
И чтоби били коментарии как на фото ( чтоби било 5 рисунков )
Ссилка ==> http://us.ua/1066396/

Tco 03 17-03-2013 14:15 2112984

Цитата:

Цитата neorom
Как мне добавить до вошого скрипта вот єти финкции(установка значка и установка по) »

Создавать кустомные чекбоксы и лейблы к ним...
Создание кустомного чекбокса.
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program

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

[ code]
var
QuickLaunchIcon: TCheckBox;

function MakeQuickLaunchIcon: Boolean;
begin
    Result:=QuickLaunchIcon.Checked;
end;

procedure InitializeWizard();
begin
QuickLaunchIcon := TCheckBox.Create(WizardForm);
with QuickLaunchIcon do
  begin
    Parent := WizardForm.SelectDirPage;
    Caption := 'Создать значок в Панели быстрого запуска';
    Left := ScaleX(0);
//    Left := WizardForm.DirEdit.Top + 100;
    Top := WizardForm.DirEdit.Top + 117;
    Width := ScaleX(300);
    Height := ScaleY(15);
    TabOrder := 0;
    Checked := False;
  end;
end;


Johny777 17-03-2013 15:54 2113068

Tco 03, у тебя всё правильно, но рекомендую:
1. писать скобки в заголовке процедуры/функции function MakeQuickLaunchIcon(): Boolean; и при вызове MakeQuickLaunchIcon(); для наглядности
2. писать координаты через метод SetBounds(ScaleX(слева), ScaleY(сверху), ScaleX(ширина), ScaleY(высота)) для краткости кода, а все отдельные координаты с участием цифр через функции ScaleX(), ScaleY() для правильного расположения контролов
3. Checked := False; по дефолту, так что строка не нужна
4. Цитата: "TabOrder — указывает направление перемещения фокуса при нажатии клавиши Tab (от начала к концу или от конца к началу);" Думай нужен ли он тебе.
до кучи советую почитать о методе Create конструктора http://delphi.about.com/od/adptips2005/qt/aowner.htm со входным параметром (это указатель) принадлежности к другому компоненту
например у меня есть процедура создания формы, на ней панели, а панели кучи котролов. При разрушении формы родителем панели что лежала не ней становится WizardForm (тк геморно разрушать, сохранять а потом воссоздовать). Поэтому указатель у меня на пенели nil а указатели на контролах, что лежат на панели - ссылка на панель myPanel (var myPanel: TPanel)
5. Сейчас будет смешно, но у чекбокса нет возможности подстраиваться под размер собственного текста и чтоб не подгонять размер, а в лучае с несколькими языками это много работы используй забавную, но сверх рабочую, быструю и удобную функцию function GetFutureCtrlWidth(const uCaption: String): Integer; Есть правда вин апишная функция которая используется в Autosize лейбла но работать нормально она не хотела, использовал её в первой реализации кастомного чекбокса ( http://forum.oszone.net/post-2043384-1383.html )
короче вот так выглядел бы твой код у меня:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external; Check: MakeQuickLaunchIcon();

[code]
var
  QuickLaunchIcon: TCheckBox;

function GetFutureCtrlWidth(const uCaption: String): Integer;
begin
  with TLabel.Create(nil) do
  try
    Caption := uCaption;
    Result := Width + 16; // где 16 - размер картинки чекбокса/переключателя
  finally
    Free;
  end;
end;

function MakeQuickLaunchIcon(): Boolean;
begin
  Result:=QuickLaunchIcon.Checked;
end;

procedure InitializeWizard();
begin
  QuickLaunchIcon := TCheckBox.Create(WizardForm);
  with QuickLaunchIcon do
  begin
    Parent := WizardForm.SelectDirPage;
    Caption := 'Создать значок в Панели быстрого запуска';
    SetBounds(ScaleX(0), ScaleY(WizardForm.DirEdit.Top + 117), ScaleX(GetFutureCtrlWidth(Caption)), ScaleY(16));
  end;
end;


Tco 03 17-03-2013 16:47 2113101

Johny777
Ну, а говоришь времени нет, вон какую "поэму" написал :smirk:
Это не мой код - это справка (Inno Faq) с соседнего форума (по крайне мере я её когда-то от туда качал).
А nil не nil спорить не буду, лично я сразу пишу конкретно, где именно и что создать.

neorom 17-03-2013 16:47 2113102

Цитата:

Цитата Tco 03
Создавать кустомные чекбоксы и лейблы к ним...
Создание кустомного чекбокса. »

Я мало розбераюсь в том. Я в последним сообчтени я дал силку на свой скрип которий надо отретактировать, так чтоби били те функции коториє я там опесал.

Tco 03 17-03-2013 16:58 2113112

neorom
Цитата:

Цитата neorom
я дал силку на свой скрип которий надо отретактировать, так чтоби били те функции коториє я там опесал »

Это уже называется наглость товарищ :diablo: то подскажите то, подскажите это, а сейчас вообще -"Да напишите мне скрипт целиком, а то что-то влом справки читать, да во всём этом разбираться".

neorom 17-03-2013 17:04 2113117

Цитата:

Цитата Tco 03
Да напишите мне скрипт целиком »

Не надо писать скрипт,он у меня єсть, только я не знаю куда добавить нужниє рядки, частини кода (мой скрипт полнасть схожий на Fenixx)

Tco 03 17-03-2013 17:37 2113144

neorom
читать дальше »

Создаёте чекбокс:
var
DirectX: TCheckBox;
Создаёте надпись для этого чекбокса:
DirectXLabel: TLabel;

Функция проверки чекбокса:
function InstallDirectX: Boolean;
begin
Result:= DirectX.Checked;
end;

Сам код чекбокса:
DirectX:= TCheckBox.Create(WizardForm);
DirectX.Parent:= Где нужно показать чекбокс.
DirectX.Left:= От левого края.
DirectX.Top:= Сверху.

Лейбл:
DirectXLabel:= TLabel.Create(WizardForm);
DirectXLabel.Parent:= Где нужно показать лейбл.
DirectXLabel.Left:= От левого края.
DirectXLabel.Top:= Сверху.

Что запустить при выборе чекбокса:
[Run]
Filename: "{src}\DirectX\DXSETUP.exe"; WorkingDir: "{src}\DirectX"; Parameters: "/silent"; Check: InstallDirectX; Flags: waituntilterminated;

Что запустить при выборе чекбокса (Через секцию код):
procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode: Integer;
begin
if CurStep = ssPostInstall then
begin
if DirectX.Checked then
begin
Exec(ExpandConstant('{src}\DirectX\DXSETUP.exe'), '/silent', ExpandConstant('{src}\DirectX'), SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;
end;
end;

И на этом я пасс - уже почти весь скрипт за Вас написан...

neorom 17-03-2013 18:06 2113173

Цитата:

Цитата Tco 03
И на этом я пасс - уже почти весь скрипт за Вас написан.. »

Ладно, з єтим скриптом (не судьба наверно било доделать(отредактировать) майже готовий скрипт, а не зделать (как било написано самим Tco 03) . Больше беспокоить ВАС ВСЕХ я не буду.

insombia 17-03-2013 18:28 2113188

neorom тебе нужен закос под феникса?

neorom 17-03-2013 18:41 2113198

Цитата:

Цитата insombia
тебе нужен закос под феникса? »

Да, но нужно чтоб в скрипте било окно з єтими финкции(установка значка и установка по)

insombia 17-03-2013 20:46 2113266

neorom нужно на скрипт смотреть,так как там видно что все криво сделано

neorom 17-03-2013 20:49 2113268

Цитата:

Цитата insombia
нужно на скрипт смотреть,так как там видно что все криво сделано »

Не понимаю ???

alert30 18-03-2013 04:00 2113408

Цитата:

Цитата neorom
Не понимаю ??? »

Компилируй скрипт, нажми "Start" и увидишь.

neorom 18-03-2013 10:53 2113494

Зделать надо так, и добавить файл Image5.bmp до скрипта ==>
Мой скрипт http://us.ua/1067007/

insombia 18-03-2013 16:55 2113690

neorom когда вы уже научитесь выкладывать скрипт со всеми файлами?

sergey3695 18-03-2013 17:05 2113700

как сделать в inno кнопку с прозрачным фоном?

insombia 18-03-2013 17:12 2113710

кто-то понял как сделать прикол с переключением языка на ходу?

insombia 18-03-2013 17:36 2113734

sergey3695 вот что нашел,хз оно ли это то что тебе нужно
Чекбоксы тоже прозрычными сделать нельзя (дефолтные у анси)
Решение следующее: Создаете радиокнопку без надписи справа, создаете отдельно надпись к ней (элемент TLabel с Transparent:=True). Пишите процедурку клик по TLabel=клик по радиокнопочке. И в итоге получаете прозрачную радиокнопочку. Примеров таких кнопочек и чекбоксов - немеряно, поэтому ищем (скрипт Prototype от Shegorat к примеру)

neorom 18-03-2013 18:06 2113755

Цитата:

Цитата insombia
когда вы уже научитесь выкладывать скрипт со всеми файлами? »

Я уже пару раз викладал полнастю скрипт со моими файлами, викладаю ишчо раз ==> http://us.ua/1067498/
Зделайте так чтобы в каждам етапе инсталяции бил новий рисунок(в месте пять (там уже эсть четире рисунков, но на етапи выбор директории для инсталяции игри и на этапе установки ярликов один и тотже ресунок и надписи в окне теже, зделайте чтоби они разние рисунки и надписи к ним)).

Tco 03 18-03-2013 19:00 2113788

neorom
читать дальше »

#define NeedSize "100"

[Setup]
AppName=Footballsim Patch 2013
AppVerName=Pro Evolution Soccer 2013
DefaultDirName={pf}\Pro Evolution Soccer 2013
DisableReadyPage=true
MergeDuplicateFiles=false
SolidCompression=true
Compression=lzma/ultra64
UseSetupLdr=false

[Languages]
Name: Ukrainian; MessagesFile: compiler:Languages\Ukrainian.isl

[Run]
Filename: {app}\kitserver13\manager.exe; Flags: postinstall waituntilidle;
Filename: {app}\Soft\dxwebsetup.exe; Check: SoftInstall;


[Icons]
Name: {group}\Footballsim_Patch_2013; Filename: {app}\Footballsim_Patch_2013.exe; WorkingDir: {app}\; IconFilename: {app}\Uninstall\unins000.exe; Check: CreateIcons;
Name: {group}\Footballsim_Patch_2013.(Налаштування); Filename: {app}\settings.exe; WorkingDir: {app}\; IconFilename: {app}\Uninstall\unins000.exe; Check: CreateIcons;
Name: {group}\{cm:UninstallProgram,Footballsim_Patch_2013}; Filename: {uninstallexe}; Check: CreateIcons;
Name: {commondesktop}\Footballsim_Patch_2013; Filename: {app}\Footballsim_Patch_2013.exe; WorkingDir: {app}\; IconFilename: {app}\Uninstall\unins000.exe; Check: CreateIcons;
Name: {commondesktop}\Footballsim_Patch_2013.(Налаштування); Filename: {app}\settings.exe; WorkingDir: {app}\; IconFilename: {app}\Uninstall\unins000.exe; Check: CreateIcons;

[Files]
Source: logo.bmp; DestDir: {tmp}; Flags: dontcopy
Source: isSplash.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISSkin.dll; DestDir: {tmp}; Flags: dontcopy
Source: Tiger.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: Image1.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Image2.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Image3.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Image4.bmp; DestDir: {tmp}; Flags: dontcopy
;Source: {app}\*.*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyname

[CustomMessages]
Ukrainian.Welcome=Вас вітає Мастер встановлення доповнення {#SetupSetting("AppName")} до ігри %n{#SetupSetting("AppVerName")}.%nПрограма встановлюється {#SetupSetting("AppName")} на Ваш компютер.
Ukrainian.SelectDir=Програма встановить доповнення до ігри в наступну теку.%nЯкщо ви хочите вибрати іншу теку, натисніть «Обзор».%nНатисніть «Встановити», щоб почати встановлення доповнення.
Ukrainian.Installing=Будь-ласка, почекайте, коли доповнення {#SetupSetting("AppName")} встановиться на Ваш компьютер.
Ukrainian.Finished=Встановлення доповнення {#SetupSetting("AppVerName")} до ігри закінчена.%nВи можете запустити ігру з допомогою%n відповідного значка на «Робочому столі» або з меню «Пуск».
Ukrainian.FreeSize=Доступно місця на диску:
Ukrainian.NeedSize=Необхідно місця на диску:

Ukrainian.Icons=Создать ярлыки?
Ukrainian.DirectX=Установить дополнительное ПО?

[code]
var
BackPanel, WizardPanel, StatusPanel, ImagePanel: TPanel;
CaptionLabel: TLabel; BmpFile: TBitmapImage;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
FreeMB, TotalMB: Cardinal; NeedSize: Integer;

///////////////////////////////////////////////
Icons, DirectX: TCheckBox;
IconsLabel, DirectXLabel: TLabel;
//////////////////////////////////////////////

procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';


////////////////////////////////////////////
function CreateIcons: Boolean;
begin
Result:= Icons.Checked;
end;

function SoftInstall: Boolean;
begin
Result:= DirectX.Checked;
end;
//////////////////////////////////////////////

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSize} ')+ NumToStr(round(FreeMB/1024*100)/100) + ' Гб' else
FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSize} ')+ IntToStr(FreeMB)+ ' Мб';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True;
end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSize} ')+ NumToStr(round(NeedSize/1024*100)/100) + ' Гб' else
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSize} ')+ IntToStr(NeedSize)+ ' Мб';
end;

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Tiger.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;

procedure InitializeWizard1();
begin
NeedSize:= {#NeedSize};

ExtractTemporaryFile('Image1.bmp')
ExtractTemporaryFile('Image2.bmp')
ExtractTemporaryFile('Image3.bmp')
ExtractTemporaryFile('Image4.bmp')

WizardForm.ClientWidth:= ScaleX(800);
WizardForm.ClientHeight:= ScaleY(620);
WizardForm.Position:= poScreenCenter;

WizardForm.InnerNotebook.Hide;
WizardForm.OuterNotebook.Hide;
WizardForm.Font.Name:= 'Georgia';

BackPanel:= TPanel.Create(WizardForm)
BackPanel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(800), ScaleY(618))
BackPanel.Color:= clWhite
BackPanel.BorderStyle:= bsNone
BackPanel.ParentBackground:= False
BackPanel.ParentColor:= False
BackPanel.Parent:= WizardForm

StatusPanel:= TPanel.Create(WizardForm)
StatusPanel.SetBounds(ScaleX(2), ScaleY(2), ScaleX(796), ScaleY(18))
StatusPanel.BorderStyle:= bsNone
StatusPanel.ParentBackground:= False
StatusPanel.ParentColor:= False
StatusPanel.Font.Color:= clWhite
StatusPanel.Font.Size:= 12
StatusPanel.Font.Style:= [fsBold]
StatusPanel.Font.Name:= 'Times New Roman'
StatusPanel.Alignment:= taCenter
StatusPanel.Parent:= WizardForm

ImagePanel:= TPanel.Create(WizardForm)
ImagePanel.SetBounds(ScaleX(2), ScaleY(21), ScaleX(796), ScaleY(484))
ImagePanel.BorderStyle:= bsNone
ImagePanel.ParentBackground:= False
ImagePanel.ParentColor:= False
ImagePanel.Parent:= WizardForm

BmpFile:= TBitmapImage.Create(WizardForm)
BmpFile.Stretch:= True;
BmpFile.SetBounds(ScaleX(0),ScaleY(0), ScaleX(796), ScaleY(484))
BmpFile.Parent:= ImagePanel

WizardPanel:= TPanel.Create(WizardForm)
WizardPanel.SetBounds(ScaleX(2), ScaleY(506), ScaleX(796), ScaleY(110))
WizardPanel.Alignment:= taCenter;
WizardPanel.BorderStyle:= bsNone
WizardPanel.ParentBackground:= False
WizardPanel.ParentColor:= False
WizardPanel.Parent:= WizardForm

CaptionLabel:= TLabel.Create(WizardForm);
CaptionLabel.SetBounds(ScaleX(100), ScaleY(5), ScaleX(590), ScaleY(100));
CaptionLabel.AutoSize:= False;
CaptionLabel.WordWrap:= True;
CaptionLabel.Transparent:= True;
CaptionLabel.Font.Color:= $5F8BA2
CaptionLabel.Font.Size:= 11
CaptionLabel.Font.Style:= [fsBold]
CaptionLabel.Alignment:= taCenter;
CaptionLabel.Parent:= WizardPanel;

NeedSpaceLabel:= TLabel.Create(WizardForm);
NeedSpaceLabel.SetBounds(ScaleX(5),ScaleY(70),ScaleX(300),ScaleY(20))
NeedSpaceLabel.Transparent:= True;
NeedSpaceLabel.Font.Style:= [fsBold]
NeedSpaceLabel.Parent:= WizardPanel

FreeSpaceLabel:= TLabel.Create(WizardForm);
FreeSpaceLabel.SetBounds(ScaleX(250), ScaleY(70), ScaleX(300),ScaleY(20))
FreeSpaceLabel.Transparent:= True;
FreeSpaceLabel.Font.Style:= [fsBold]
FreeSpaceLabel.Parent:= WizardPanel

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;

WizardForm.DirBrowseButton.Parent:= WizardForm
WizardForm.DirBrowseButton.Left:= ScaleX(455)
WizardForm.DirBrowseButton.Top:= ScaleY(590)
WizardForm.DirBrowseButton.Font.Size:= 8
WizardForm.DirBrowseButton.Font.Style:= [fsBold]

WizardForm.DirEdit.Parent:= WizardForm
WizardForm.DirEdit.Left:= ScaleX(5)
WizardForm.DirEdit.Top:= ScaleY(590)
WizardForm.DirEdit.Width:= ScaleX(445)
WizardForm.DirEdit.Font.Size:= 8
WizardForm.DirEdit.Font.Style:= [fsBold]

//////////////////////////////////////////////////
Icons:= TCheckBox.Create(WizardForm);
Icons.Parent:= WizardPanel;
Icons.Left:= ScaleX(16);
Icons.Top:= ScaleY(90);
Icons.Width:= ScaleX(12);
Icons.Height:= ScaleY(12);
Icons.Hide;

IconsLabel:= TLabel.Create(WizardForm);
IconsLabel.Left:= ScaleX(36);
IconsLabel.Top:= ScaleY(90);
IconsLabel.Transparent:= True;
IconsLabel.Caption:= ExpandConstant('{cm:Icons}');
IconsLabel.Parent:= WizardPanel;
IconsLabel.Hide;

DirectX:= TCheckBox.Create(WizardForm);
DirectX.Parent:= WizardPanel;
DirectX.Left:= ScaleX(216);
DirectX.Top:= ScaleY(90);
DirectX.Width:= ScaleX(12);
DirectX.Height:= ScaleY(12);
DirectX.Hide;

DirectXLabel:= TLabel.Create(WizardForm);
DirectXLabel.Left:= ScaleX(236);
DirectXLabel.Top:= ScaleY(90);
DirectXLabel.Transparent:= True;
DirectXLabel.Caption:= ExpandConstant('{cm:DirectX}');
DirectXLabel.Parent:= WizardPanel;
DirectXLabel.Hide;
////////////////////////////////////////////////////

WizardForm.ProgressGauge.Parent:= WizardForm
WizardForm.ProgressGauge.Left:= ScaleX(5)
WizardForm.ProgressGauge.Top:= ScaleY(590)
WizardForm.ProgressGauge.Width:= ScaleX(450)

WizardForm.StatusLabel.Parent:= WizardPanel
WizardForm.StatusLabel.SetBounds(ScaleX(5), ScaleY(52), ScaleX(300), ScaleY(20))
WizardForm.StatusLabel.Font.Style:= [fsBold]

WizardForm.FilenameLabel.Parent:= WizardPanel
WizardForm.FilenameLabel.SetBounds(ScaleX(5), ScaleY(68), ScaleX(450), ScaleY(20))
WizardForm.FilenameLabel.Font.Style:= [fsBold]

WizardForm.CancelButton.BringToFront;
WizardForm.CancelButton.Left:= ScaleX(715)
WizardForm.CancelButton.Top:= ScaleY(590)
WizardForm.CancelButton.Font.Size:= 8
WizardForm.CancelButton.Font.Style:= [fsBold]

WizardForm.NextButton.BringToFront;
WizardForm.NextButton.Left:= ScaleX(630)
WizardForm.NextButton.Top:= ScaleY(590)
WizardForm.NextButton.Font.Size:= 8
WizardForm.NextButton.Font.Style:= [fsBold]

WizardForm.BackButton.BringToFront;
WizardForm.BackButton.Left:= ScaleX(545)
WizardForm.BackButton.Top:= ScaleY(590)
WizardForm.BackButton.Font.Size:= 8
WizardForm.BackButton.Font.Style:= [fsBold]
end;

procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.DirEdit.Hide; WizardForm.DirBrowseButton.Hide;
WizardForm.Progressgauge.Hide; WizardForm.StatusLabel.Hide;
WizardForm.FilenameLabel.Hide; FreeSpaceLabel.Hide;
NeedSpaceLabel.Hide;
case CurPageID of
wpWelcome:
begin
CaptionLabel.Caption:= ExpandConstant('{cm:Welcome}')
StatusPanel.Caption:= 'Привітання'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image1.bmp'))

////////////////////////////////////////////////
Icons.Hide;
IconsLabel.Hide;
DirectX.Hide;
DirectXLabel.Hide;
///////////////////////////////////////////////

end;
wpSelectDir:
begin
WizardForm.DirEdit.Show; WizardForm.DirBrowseButton.Show;
FreeSpaceLabel.Show; NeedSpaceLabel.Show;
CaptionLabel.Caption:= ExpandConstant('{cm:SelectDir}')
StatusPanel.Caption:= 'Підготовлення до встановлення'

////////////////////////////////////////////////
Icons.Show;
IconsLabel.Show;
DirectX.Show;
DirectXLabel.Show;
//////////////////////////////////////////////

WizardForm.NextButton.Caption:= 'Далі >'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image2.bmp'))
GetNeedSpaceCaption; if FreeMB < NeedSize then WizardForm.NextButton.Enabled:=False;
end;
wpInstalling:
begin
WizardForm.Progressgauge.Show; WizardForm.StatusLabel.Show;
WizardForm.FilenameLabel.Show;
CaptionLabel.Caption:= ExpandConstant('{cm:Installing}')
StatusPanel.Caption:= 'Встановлення'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image3.bmp'))

////////////////////////////////////////////////
Icons.Hide;
IconsLabel.Hide;
DirectX.Hide;
DirectXLabel.Hide;
///////////////////////////////////////////////

end;
wpFinished:
begin
CaptionLabel.Caption:= ExpandConstant('{cm:Finished}')
StatusPanel.Caption:= 'Закінчення'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image4.bmp'))

////////////////////////////////////////////////
Icons.Hide;
IconsLabel.Hide;
DirectX.Hide;
DirectXLabel.Hide;
///////////////////////////////////////////////

end;
end;
end;

// картинка перед запуском програми.
procedure ShowSplashPic(Fpath:PAnsiChar; Start,Show,Stop:integer; TransColor,BGColor:Tcolor; CutColor,CloseOnClick:Boolean); external 'ShowSplashPic@files:issplash.dll stdcall delayload';
// Fpath - Путь к файлу картинки.
// Start - Время плавного появления мс.
// Show - Время показа мс.
// Stop - Время исчезания мс.
// TransColor - Цвет прозрачности, будет вырезан из картинки (только для bmp).
// BGColor - Цвет фона для gif картинок.
// CutColor - Если True, то цвет будет вырезан, если False то нет.
// CloseOnClick - Если True, то Закрыть при клике по картинке.

procedure InitializeWizard2();
begin
ExtractTemporaryFile('logo.bmp');
ShowSplashPic(ExpandConstant('{tmp}')+'\logo.bmp', 2000, 3000, 2000, ClWhite, ClWhite, True, True);
end;


procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
end;

neorom 18-03-2013 19:09 2113797

Tco 03 Зделайте так чтобы в каждам етапе инсталяции бил новий рисунок(в месте всех чтоби било пять (там уже эсть четире рисунков, но на етапи выбор директории для инсталяции игри и на этапе установки ярликов один и тотже ресунок и надписи в окне теже, зделайте чтоби они разние рисунки и надписи к ним)). Если не трудно.

insombia 18-03-2013 19:26 2113808

del:

sergey3695 18-03-2013 19:42 2113822

insombia, кто тебе про радиокнопку писал? ( я про обычные кнопки.

Tco 03 18-03-2013 20:15 2113861

neorom
Вот, держите! И установка дополнительного ПО и смена картинки! Картинка меняется через функцию: NextButtonClick
читать дальше »

Код:

#define NeedSize "100"

[Setup]
AppName=Footballsim Patch 2013
AppVerName=Pro Evolution Soccer 2013
DefaultDirName={pf}\Pro Evolution Soccer 2013
DisableReadyPage=true
MergeDuplicateFiles=false
SolidCompression=true
Compression=lzma/ultra64
UseSetupLdr=false

[Languages]
Name: Ukrainian; MessagesFile: compiler:Languages\Ukrainian.isl

[Run]
Filename: {app}\kitserver13\manager.exe; Flags: postinstall waituntilidle;
Filename: {app}\Soft\dxwebsetup.exe; Check: SoftInstall;


[Icons]
Name: {group}\Footballsim_Patch_2013; Filename: {app}\Footballsim_Patch_2013.exe; WorkingDir: {app}\; IconFilename: {app}\Uninstall\unins000.exe; Check: CreateIcons;
Name: {group}\Footballsim_Patch_2013.(Налаштування); Filename: {app}\settings.exe; WorkingDir: {app}\; IconFilename: {app}\Uninstall\unins000.exe; Check: CreateIcons;
Name: {group}\{cm:UninstallProgram,Footballsim_Patch_2013}; Filename: {uninstallexe}; Check: CreateIcons;
Name: {commondesktop}\Footballsim_Patch_2013; Filename: {app}\Footballsim_Patch_2013.exe; WorkingDir: {app}\; IconFilename: {app}\Uninstall\unins000.exe; Check: CreateIcons;
Name: {commondesktop}\Footballsim_Patch_2013.(Налаштування); Filename: {app}\settings.exe; WorkingDir: {app}\; IconFilename: {app}\Uninstall\unins000.exe; Check: CreateIcons;

[Files]
Source: logo.bmp; DestDir: {tmp}; Flags: dontcopy
Source: isSplash.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISSkin.dll; DestDir: {tmp}; Flags: dontcopy
Source: Tiger.cjstyles; DestDir: {tmp}; Flags: dontcopy
Source: Image1.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Image2.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Image3.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Image4.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Image5.bmp; DestDir: {tmp}; Flags: dontcopy
;Source: {app}\*.*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyname

[CustomMessages]
Ukrainian.Welcome=Вас вітає Мастер встановлення доповнення {#SetupSetting("AppName")} до ігри %n{#SetupSetting("AppVerName")}.%nПрограма встановлюється {#SetupSetting("AppName")} на Ваш компютер.
Ukrainian.SelectDir=Програма встановить доповнення до ігри в наступну теку.%nЯкщо ви хочите вибрати іншу теку, натисніть «Обзор».%nНатисніть «Встановити», щоб почати встановлення доповнення.
Ukrainian.Installing=Будь-ласка, почекайте, коли доповнення {#SetupSetting("AppName")} встановиться на Ваш компьютер.
Ukrainian.Finished=Встановлення доповнення {#SetupSetting("AppVerName")} до ігри закінчена.%nВи можете запустити ігру з допомогою%n відповідного значка на «Робочому столі» або з меню «Пуск».
Ukrainian.FreeSize=Доступно місця на диску:
Ukrainian.NeedSize=Необхідно місця на диску:

Ukrainian.Icons=Создать ярлыки?
Ukrainian.DirectX=Установить дополнительное ПО?

[ code]
var
BackPanel, WizardPanel, StatusPanel, ImagePanel: TPanel;
CaptionLabel: TLabel; BmpFile: TBitmapImage;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
FreeMB, TotalMB: Cardinal; NeedSize: Integer;

///////////////////////////////////////////////
Icons, DirectX: TCheckBox;
IconsLabel, DirectXLabel: TLabel;
//////////////////////////////////////////////

procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';


////////////////////////////////////////////
function CreateIcons: Boolean;
begin
Result:= Icons.Checked;
end;

function SoftInstall: Boolean;
begin
Result:= DirectX.Checked;
end;
//////////////////////////////////////////////

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSize} ')+ NumToStr(round(FreeMB/1024*100)/100) + ' Гб' else
FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSize} ')+ IntToStr(FreeMB)+ ' Мб';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True;
end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSize} ')+ NumToStr(round(NeedSize/1024*100)/100) + ' Гб' else
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSize} ')+ IntToStr(NeedSize)+ ' Мб';
end;

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Tiger.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
Result := True;
end;

procedure DeinitializeSetup();
begin
ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
UnloadSkin();
end;

procedure InitializeWizard1();
begin
NeedSize:= {#NeedSize};

ExtractTemporaryFile('Image1.bmp')
ExtractTemporaryFile('Image2.bmp')
ExtractTemporaryFile('Image3.bmp')
ExtractTemporaryFile('Image4.bmp')
ExtractTemporaryFile('Image5.bmp')

WizardForm.ClientWidth:= ScaleX(800);
WizardForm.ClientHeight:= ScaleY(620);
WizardForm.Position:= poScreenCenter;

WizardForm.InnerNotebook.Hide;
WizardForm.OuterNotebook.Hide;
WizardForm.Font.Name:= 'Georgia';

BackPanel:= TPanel.Create(WizardForm)
BackPanel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(800), ScaleY(618))
BackPanel.Color:= clWhite
BackPanel.BorderStyle:= bsNone
BackPanel.ParentBackground:= False
BackPanel.ParentColor:= False
BackPanel.Parent:= WizardForm

StatusPanel:= TPanel.Create(WizardForm)
StatusPanel.SetBounds(ScaleX(2), ScaleY(2), ScaleX(796), ScaleY(18))
StatusPanel.BorderStyle:= bsNone
StatusPanel.ParentBackground:= False
StatusPanel.ParentColor:= False
StatusPanel.Font.Color:= clWhite
StatusPanel.Font.Size:= 12
StatusPanel.Font.Style:= [fsBold]
StatusPanel.Font.Name:= 'Times New Roman'
StatusPanel.Alignment:= taCenter
StatusPanel.Parent:= WizardForm

ImagePanel:= TPanel.Create(WizardForm)
ImagePanel.SetBounds(ScaleX(2), ScaleY(21), ScaleX(796), ScaleY(484))
ImagePanel.BorderStyle:= bsNone
ImagePanel.ParentBackground:= False
ImagePanel.ParentColor:= False
ImagePanel.Parent:= WizardForm

BmpFile:= TBitmapImage.Create(WizardForm)
BmpFile.Stretch:= True;
BmpFile.SetBounds(ScaleX(0),ScaleY(0), ScaleX(796), ScaleY(484))
BmpFile.Parent:= ImagePanel

WizardPanel:= TPanel.Create(WizardForm)
WizardPanel.SetBounds(ScaleX(2), ScaleY(506), ScaleX(796), ScaleY(110))
WizardPanel.Alignment:= taCenter;
WizardPanel.BorderStyle:= bsNone
WizardPanel.ParentBackground:= False
WizardPanel.ParentColor:= False
WizardPanel.Parent:= WizardForm

CaptionLabel:= TLabel.Create(WizardForm);
CaptionLabel.SetBounds(ScaleX(100), ScaleY(5), ScaleX(590), ScaleY(100));
CaptionLabel.AutoSize:= False;
CaptionLabel.WordWrap:= True;
CaptionLabel.Transparent:= True;
CaptionLabel.Font.Color:= $5F8BA2
CaptionLabel.Font.Size:= 11
CaptionLabel.Font.Style:= [fsBold]
CaptionLabel.Alignment:= taCenter;
CaptionLabel.Parent:= WizardPanel;

NeedSpaceLabel:= TLabel.Create(WizardForm);
NeedSpaceLabel.SetBounds(ScaleX(5),ScaleY(70),ScaleX(300),ScaleY(20))
NeedSpaceLabel.Transparent:= True;
NeedSpaceLabel.Font.Style:= [fsBold]
NeedSpaceLabel.Parent:= WizardPanel

FreeSpaceLabel:= TLabel.Create(WizardForm);
FreeSpaceLabel.SetBounds(ScaleX(250), ScaleY(70), ScaleX(300),ScaleY(20))
FreeSpaceLabel.Transparent:= True;
FreeSpaceLabel.Font.Style:= [fsBold]
FreeSpaceLabel.Parent:= WizardPanel

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;

WizardForm.DirBrowseButton.Parent:= WizardForm
WizardForm.DirBrowseButton.Left:= ScaleX(455)
WizardForm.DirBrowseButton.Top:= ScaleY(590)
WizardForm.DirBrowseButton.Font.Size:= 8
WizardForm.DirBrowseButton.Font.Style:= [fsBold]

WizardForm.DirEdit.Parent:= WizardForm
WizardForm.DirEdit.Left:= ScaleX(5)
WizardForm.DirEdit.Top:= ScaleY(590)
WizardForm.DirEdit.Width:= ScaleX(445)
WizardForm.DirEdit.Font.Size:= 8
WizardForm.DirEdit.Font.Style:= [fsBold]

//////////////////////////////////////////////////
Icons:= TCheckBox.Create(WizardForm);
Icons.Parent:= WizardPanel;
Icons.Left:= ScaleX(16);
Icons.Top:= ScaleY(90);
Icons.Width:= ScaleX(12);
Icons.Height:= ScaleY(12);
Icons.Visible:= False;

IconsLabel:= TLabel.Create(WizardForm);
IconsLabel.Left:= ScaleX(36);
IconsLabel.Top:= ScaleY(90);
IconsLabel.Transparent:= True;
IconsLabel.Caption:= ExpandConstant('{cm:Icons}');
IconsLabel.Parent:= WizardPanel;
IconsLabel.Visible:= False;

DirectX:= TCheckBox.Create(WizardForm);
DirectX.Parent:= WizardPanel;
DirectX.Left:= ScaleX(216);
DirectX.Top:= ScaleY(90);
DirectX.Width:= ScaleX(12);
DirectX.Height:= ScaleY(12);
DirectX.Visible:= False;

DirectXLabel:= TLabel.Create(WizardForm);
DirectXLabel.Left:= ScaleX(236);
DirectXLabel.Top:= ScaleY(90);
DirectXLabel.Transparent:= True;
DirectXLabel.Caption:= ExpandConstant('{cm:DirectX}');
DirectXLabel.Parent:= WizardPanel;
DirectXLabel.Visible:= False;
////////////////////////////////////////////////////

WizardForm.ProgressGauge.Parent:= WizardForm
WizardForm.ProgressGauge.Left:= ScaleX(5)
WizardForm.ProgressGauge.Top:= ScaleY(590)
WizardForm.ProgressGauge.Width:= ScaleX(450)

WizardForm.StatusLabel.Parent:= WizardPanel
WizardForm.StatusLabel.SetBounds(ScaleX(5), ScaleY(52), ScaleX(300), ScaleY(20))
WizardForm.StatusLabel.Font.Style:= [fsBold]

WizardForm.FilenameLabel.Parent:= WizardPanel
WizardForm.FilenameLabel.SetBounds(ScaleX(5), ScaleY(68), ScaleX(450), ScaleY(20))
WizardForm.FilenameLabel.Font.Style:= [fsBold]

WizardForm.CancelButton.BringToFront;
WizardForm.CancelButton.Left:= ScaleX(715)
WizardForm.CancelButton.Top:= ScaleY(590)
WizardForm.CancelButton.Font.Size:= 8
WizardForm.CancelButton.Font.Style:= [fsBold]

WizardForm.NextButton.BringToFront;
WizardForm.NextButton.Left:= ScaleX(630)
WizardForm.NextButton.Top:= ScaleY(590)
WizardForm.NextButton.Font.Size:= 8
WizardForm.NextButton.Font.Style:= [fsBold]

WizardForm.BackButton.BringToFront;
WizardForm.BackButton.Left:= ScaleX(545)
WizardForm.BackButton.Top:= ScaleY(590)
WizardForm.BackButton.Font.Size:= 8
WizardForm.BackButton.Font.Style:= [fsBold]
end;

procedure CurPageChanged(CurPageID: Integer);
begin
WizardForm.DirEdit.Hide; WizardForm.DirBrowseButton.Hide;
WizardForm.Progressgauge.Hide; WizardForm.StatusLabel.Hide;
WizardForm.FilenameLabel.Hide; FreeSpaceLabel.Hide;
NeedSpaceLabel.Hide;
case CurPageID of
wpWelcome:
begin
CaptionLabel.Caption:= ExpandConstant('{cm:Welcome}')
StatusPanel.Caption:= 'Привітання'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image1.bmp'))

////////////////////////////////////////////////
Icons.Visible:= False;
IconsLabel.Visible:= False;
DirectX.Visible:= False;
DirectXLabel.Visible:= False;
///////////////////////////////////////////////

end;
wpSelectDir:
begin
WizardForm.DirEdit.Show; WizardForm.DirBrowseButton.Show;
FreeSpaceLabel.Show; NeedSpaceLabel.Show;
CaptionLabel.Caption:= ExpandConstant('{cm:SelectDir}')
StatusPanel.Caption:= 'Підготовлення до встановлення'
WizardForm.NextButton.Caption:= 'Далі >'
GetNeedSpaceCaption; if FreeMB < NeedSize then WizardForm.NextButton.Enabled:=False;
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image2.bmp'))


////////////////////////////////////////////////
Icons.Visible:= True;
IconsLabel.Visible:= True;
DirectX.Visible:= True;
DirectXLabel.Visible:= True;
//////////////////////////////////////////////

end;
wpInstalling:
begin
WizardForm.Progressgauge.Show; WizardForm.StatusLabel.Show;
WizardForm.FilenameLabel.Show;
CaptionLabel.Caption:= ExpandConstant('{cm:Installing}')
StatusPanel.Caption:= 'Встановлення'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image4.bmp'))

////////////////////////////////////////////////
Icons.Visible:= False;
IconsLabel.Visible:= False;
DirectX.Visible:= False;
DirectXLabel.Visible:= False;
///////////////////////////////////////////////

end;
wpFinished:
begin
CaptionLabel.Caption:= ExpandConstant('{cm:Finished}')
StatusPanel.Caption:= 'Закінчення'
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image5.bmp'))

////////////////////////////////////////////////
Icons.Visible:= False;
IconsLabel.Visible:= False;
DirectX.Visible:= False;
DirectXLabel.Visible:= False;
///////////////////////////////////////////////

end;
end;
end;

// картинка перед запуском програми.
procedure ShowSplashPic(Fpath:PAnsiChar; Start,Show,Stop:integer; TransColor,BGColor:Tcolor; CutColor,CloseOnClick:Boolean); external 'ShowSplashPic@files:issplash.dll stdcall delayload';
// Fpath - Путь к файлу картинки.
// Start - Время плавного появления мс.
// Show - Время показа мс.
// Stop - Время исчезания мс.
// TransColor - Цвет прозрачности, будет вырезан из картинки (только для bmp).
// BGColor - Цвет фона для gif картинок.
// CutColor - Если True, то цвет будет вырезан, если False то нет.
// CloseOnClick - Если True, то Закрыть при клике по картинке.

procedure InitializeWizard2();
begin
ExtractTemporaryFile('logo.bmp');
ShowSplashPic(ExpandConstant('{tmp}')+'\logo.bmp', 2000, 3000, 2000, ClWhite, ClWhite, True, True);
end;

/////////////////////////////////////////////////////////
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:= True;
if CurPageID = wpSelectDir then
begin
if (Icons.Visible = True) and (DirectX.Visible = True ) then begin
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image3.bmp'));
end;
end;
end;
//////////////////////////////////////////////////////


procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
end;



Добавлено: С надписями Вы также можете поступить через: NextButtonClick
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result:= True;
if CurPageID = wpSelectDir then
begin
if (Icons.Visible = True) and (DirectX.Visible = True ) then begin
BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image3.bmp'));
CaptionLabel.Caption:= ExpandConstant('{cm:Welcome}');
end;
end;
end;


neorom 18-03-2013 20:23 2113868

del
P.S. Я взяв вашу идею и перелал на свой лад, так я хател из самого начала.
Єсли хто хочет я могу викладь, но скажите как(напишите инструкции) и где.

Mailchik 18-03-2013 22:31 2113956

Цитата:

Цитата sergey3695
как сделать в inno кнопку с прозрачным фоном? »

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
var
 TransparentButton: TNewSpeedButton;

procedure TestClick(Sender : TObject);
 begin
  MsgBox('Transparent Button Test', mbInformation, MB_OK);
end;

procedure InitializeWizard;
 begin
  TransparentButton := TNewSpeedButton.Create(WizardForm);
  with TransparentButton do begin
  Parent := WizardForm;
  Caption := 'Transparent';
  OnClick := @TestClick;
  Flat := True;
  SetBounds(WizardForm.NextButton.Left - WizardForm.NextButton.Width - ScaleX(5), WizardForm.NextButton.Top,
    WizardForm.NextButton.Width, WizardForm.NextButton.Height);
  end;
end;


insombia 18-03-2013 22:48 2113965

проблема с isexec
if i < 2464 then /// задаём количество файлов в папке, в данном случаи их 708 шт!!
задал правильное количество файлов в папке с игрой (у меня 4 архива) а оно все равно ошибку кидает

Tco 03 18-03-2013 23:55 2113999

Цитата:

Цитата insombia
в данном случаи их 708 шт!! »

Если Вы знаете точное колличество файлов, может быть так поможет: if i <> 2464 then (не больше не меньше) :)

neorom 19-03-2013 10:21 2114207

del

sergey3695 19-03-2013 11:48 2114257

Mailchik, за кнопку спасибо
никто незнает
const
WM_SETREDRAW= ????;

Mailchik 19-03-2013 12:34 2114273

Цитата:

Цитата sergey3695
никто незнает
const
WM_SETREDRAW= ????; »

Код:

WM_SETREDRAW = $000B;

neorom 19-03-2013 13:00 2114294

Да , когда я тестировал скрип, я увидел что эсли и не ставить две галочки у окне "Вибора установки ярлика и ПО" ярлики
ставлятся сами и стартуєт програма dxwebsetup.exe сама. Как єто исправить ?
Скрипт з файлами ==> http://us.ua/1068064/

Crazy Noise 19-03-2013 14:08 2114359

Здорова!
Народ, подскажите как решить проблему!

Имеется такой код
читать дальше »
Код:

[код]
function InitializeSetup(): Boolean;
var
NetFrameWorkInstalled: Boolean;
Result1: Boolean;
begin
//NetFrameWorkInstalled := RegKeyExists(HKLM, 'SOFTWARE\Adobe\Adobe ARM\1.0\ARM');
NetFrameWorkInstalled := RegValueExists(HKLM, 'SOFTWARE\Adobe\Adobe ARM\1.0\ARM', 'iCheckReader');

if NetFrameWorkInstalled = false then Result:=True else
begin
Result1 := MsgBox(('Найден ключ $00000000'),
mbConfirmation, MB_OK) = idOk;
end;
end;



Пробовал RegKeyExists, RegValueExists, в справке искал. Не нашёл.

Задача
Запихнуть ключ реестра для проверки, причём весь ключ нужен
Код:

Root: HKLM; SubKey: SOFTWARE\Adobe\Adobe ARM\1.0\ARM; ValueType: dword; ValueName: iCheckReader; ValueData: $00000000;
Дело в том, нужно чтоб проверка была ещё по значению ValueData: $00000000.
Как реализовать?

Mailchik 19-03-2013 15:01 2114402

Crazy Noise,
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
function InitializeSetup(): Boolean;
var
 NetFrameWorkInstalled, MyResult: Boolean;
 MyValueData: Cardinal;
 begin
  if RegQueryDWordValue(HKLM, 'SOFTWARE\Adobe\Adobe ARM\1.0\ARM', ''iCheckReader'', MyValueData) then
  NetFrameWorkInstalled := MyValueData = $00000000;

  if not NetFrameWorkInstalled then
  Result := True else
  MyResult := MsgBox('Найден ключ $00000000', mbConfirmation, MB_OK) = idOk;
end;


sergey3695 19-03-2013 15:50 2114433

как избавиться от мигания формы при разворачивании, которая использует isskin?

neorom 19-03-2013 20:08 2114588

Цитата:

Цитата neorom
Да , когда я тестировал скрип, я увидел что эсли и не ставить две галочки у окне "Вибора установки ярлика и ПО" ярлики
ставлятся сами и стартуєт програма dxwebsetup.exe сама. Как єто исправить ?
Скрипт з файлами ==> http://us.ua/1068064/ »

Памагите мне, пажалоста !!!

insombia 19-03-2013 20:43 2114608

понимаю вопрос нубский,но все же, как скрыть WizardSmallImage?

Gnom_aka_Lexander 19-03-2013 20:46 2114612

WizardSmallImage.Hide; логично вроде?

insombia 19-03-2013 21:04 2114620

Gnom_aka_Lexander вроде да,но куда его привильно вписать?

Mailchik 19-03-2013 21:44 2114640

Цитата:

Цитата insombia
Gnom_aka_Lexander вроде да,но куда его привильно вписать? »

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
procedure InitializeWizard;
 begin
  WizardForm.WizardSmallBitmapImage.Hide;
end;


P.S.
читать дальше »
Код:

insombia 
Старожил
Сообщения: 416

Благодарности: 37

Вам не стыдно задавать такие вопросы? Я так понимаю, все эти 400 сообщений вы только и делали, что просили чтобы за вас что то сделали.

saurn 20-03-2013 04:52 2114765

Цитата:

Цитата neorom
Да , когда я тестировал скрип, я увидел что эсли и не ставить две галочки у окне "Вибора установки ярлика и ПО" ярлики
ставлятся сами и стартуєт програма dxwebsetup.exe сама. Как єто исправить ? »

Для начала, было бы не плохо самому внимательно изучить свой скрипт. Ну и, в идеале, справку почитать.
Вообщем замените в своем скрипте секции Run и Icons на вот эти:

Код:

[Run]
Filename: "{app}\kitserver13\manager.exe"; Flags: postinstall waituntilidle
Filename: "{tmp}\Soft\dxwebsetup.exe"; Flags: shellexec; Check: SoftInstall;

[Icons]
Name: "{group}\Footballsim_Patch_2013"; Filename: "{app}\Footballsim_Patch_2013.exe"; WorkingDir: "{app}\"; IconFilename: "{app}\Uninstall\unins000.exe"; Check: CreateIcons;
Name: "{group}\Footballsim_Patch_2013.(Налаштування)"; Filename: "{app}\settings.exe"; WorkingDir: "{app}\"; IconFilename: "{app}\Uninstall\unins000.exe"; Check: CreateIcons;
Name: "{group}\{cm:UninstallProgram,Footballsim_Patch_2013}"; Filename: "{uninstallexe}"; Check: CreateIcons;
Name: "{commondesktop}\Footballsim_Patch_2013"; Filename: "{app}\Footballsim_Patch_2013.exe"; WorkingDir: "{app}\"; IconFilename: "{app}\Uninstall\unins000.exe"; Check: CreateIcons;
Name: "{commondesktop}\Footballsim_Patch_2013.(Налаштування)"; Filename: "{app}\settings.exe"; WorkingDir: "{app}\"; IconFilename: "{app}\Uninstall\unins000.exe"; Check: CreateIcons;

Жирным шрифтом обозначено то, что я дописал.

Tco 03 20-03-2013 14:30 2114953

Цитата:

Цитата saurn
Для начала, было бы не плохо самому внимательно изучить свой скрипт. Ну и, в идеале, справку почитать. »

Этот товарищ не то что справку не хочет читать, он вообще не желает ни чего понимать. Пост...
Далее, уже был отредактирован полностью готовый, РАБОЧИЙ пример: Пост...
После чего он пишет:
Цитата:

Цитата neorom
Я взяв вашу идею и перелал на свой лад »


neorom 20-03-2013 18:38 2115087

Цитата:

Цитата Tco 03
Этот товарищ не то что справку не хочет читать, он вообще не желает ни чего понимать. Пост...
Далее, уже был отредактирован полностью готовый, РАБОЧИЙ пример: Пост...
После чего он пишет: »

Я только как пару дней начал роботать з Inno Setup , и не знаю толкам что и как, и попросил вас мне помочь, а вы уже начинаэте кретекувать меня.

insombia 20-03-2013 18:50 2115103

neorom тебе дали совет,что для начала читай справки во избежание флуда

Tenebries 21-03-2013 17:12 2115703

Здравствуйте.

Подскажите пожалуйста что нужно дописать в скрипт чтобы при запуске инсталлятора он сверял реестер и если находило в нем значение (например: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 220440]) он запускался, а если не находило то выбивало сообщение...

И как сделать так, чтобы инсталлятор искал в реестре значение и по нему выставлял путь установки (например: [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 220440], "InstallLocation"="D:\\Games\\steamapps\\common\\D mC Devil May Cry")?

Спасибо.

Habetdin 21-03-2013 19:21 2115772

Цитата:

Цитата Tenebries
а если не находило то выбивало сообщение... »

По мотивам #1929:
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
function InitializeSetup(): Boolean;
var
 IsAppInstalled, MyResult: Boolean;
 Path: String;
begin
 IsAppInstalled := RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Steam App 550');
 if IsAppInstalled then
  Result := True else
 MyResult := MsgBox('Left 4 Dead 2 не установлен!', mbConfirmation, MB_OK) = idOk;
end;


Цитата:

Цитата Tenebries
чтобы инсталлятор искал в реестре значение и по нему выставлял путь установки »

Код:

[Setup]
DefaultDirName={reg:HKLM\Software\OSzone\Example,InstallPath|{pf}\Example}

Подробнее в справке

Tenebries 21-03-2013 19:37 2115782

Habetdin
Большое спасибо. Уже все нашел. :)

insombia 21-03-2013 23:31 2115914

ботву никогда не юзал,хотелось бы сделать через неё чтобы на всех страницах была картинка
p.s. пример из шапки не предлагать
http://rghost.ru/44666197

audiofeel 22-03-2013 10:10 2116130

Всем Доброе утро, помогите = добавил в скрипт "IsSlideShow [1.0.2]" - выходит вот эта ошибка, не знаю даже примерно в чем проблема . если нужен скрипт- отправлю. P.S. может посмотрев мои каракули предложите другой пример слайд шоу

saurn 22-03-2013 10:12 2116131

Цитата:

Цитата audiofeel
Всем Доброе утро, помогите = добавил в скрипт "IsSlideShow [1.0.2]" - выходит вот эта ошибка, не знаю даже примерно в чем проблема . если нужен скрипт- отправлю. »

Скрипт дайте

saurn 22-03-2013 10:29 2116146

audiofeel,
На какой версии компилите? У меня всё работает.
P.S.
Строчки в скрипте, типа WizardForm.PageNameLabel.Transparent := True, смысла не имеют, и будут вызывать ошибку при компиляции. Стандартный PageNameLabel это TNewStaticText, а оный не поддерживает прозрачность.

audiofeel 22-03-2013 10:34 2116149

saurn, на последней которая доступна расширенной unicode (innoultra) вот сейчас с третьего раза вылезла (ошибка появляется после нажатия на кнопку "завершить")

Gnom_aka_Lexander 22-03-2013 10:39 2116150

Цитата:

Цитата saurn
WizardForm.PageNameLabel.Transparent := True, смысла не имеют »

В юникодной инно есть у них такое свойство. и да, у меня тоже все работает. несколько раз проверил.
Цитата:

Цитата audiofeel
на последней которая доступна расширенной unicode (innoultra) »

Там не последняя. Последнюю не включил в сборку, поскольку опасаюсь багов, ибо она уже на базе следующей версии инно.
Грубых ошибок не вижу, которые могли-бы вызвать ошибки. CallbackCtrl.dll там лишняя, в IsDone уже есть каллбак. Версия инно какая?( в заголовке окна дословно что написано?

audiofeel 22-03-2013 10:47 2116153

Gnom_aka_Lexander, 5.5.1.ee2 (u) (build 121002)

saurn 22-03-2013 10:53 2116156

audiofeel
Тут помочь, к сожалению не смогу, так как юникодовой версией никогда не пользовался. Конкретно у себя ошибку выловить не смог, проверил несколько раз. Версия та же, что и у вас, только ANSI

audiofeel 22-03-2013 10:55 2116158

Цитата:

Цитата Gnom_aka_Lexander
Грубых ошибок не вижу, которые могли-бы вызвать ошибки. CallbackCtrl.dll там лишняя »

значить ошибки есть "мелкие" P.S. может такое быть из за восьмерки

Gnom_aka_Lexander 22-03-2013 10:58 2116160

audiofeel, ошибки там такие, которые на работу кода не влияют, только на скорость его работы, не более. у меня восьмерка х64, версия инно такая-же как у тебя, все нормально работает. ты скрипт не забыл сохранить перед тем, как заливать его?

audiofeel 22-03-2013 11:03 2116165

Цитата:

Цитата Gnom_aka_Lexander
ты скрипт не забыл сохранить перед тем, как заливать его? »

я отправил копию = а в чем подвох та. если "CallbackCtrl.dll" там лишняя - как от ниё отказаться правильно

saurn 22-03-2013 11:22 2116178

audiofeel
Да нет, не в восмёрке дело: сейчас выловил ошибку. Происходит она в OnTimer после прерывания установки. Потестите код в объединённом виде, так проще увидеть ошибку.

читать дальше »
Код:

#define AppName "Resident Evil 6"

//#include "Slides\slides.iss"
#include "ISDone\ISDone.iss"

[Setup]
AppName=test
AppVerName=test
DefaultDirName={pf}\test

[Run]
Filename: {src}\test.exe; Tasks: test

[Tasks]
Name: test; Description: test; GroupDescription: test; Flags: unchecked

[Files]
Source: Slides\isSlideShow.dll; DestDir: {tmp}; Flags: dontcopy
Source: Slides\CallbackCtrl.dll; DestDir: {tmp}; Flags: dontcopy
Source: Slides\*.jpg; DestDir: {tmp}; Flags: dontcopy

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

[...Code]
type
  TProc=procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
  TimerID: LongWord;
  CurrentPicture:integer;
  PicList: TStringlist;

function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
function GetSystemMetrics(nIndex:Integer):Integer; external 'GetSystemMetrics@user32.dll stdcall';
procedure InitializeSlideShow(Hwnd:Thandle; l,t,w,h:integer;Animate:boolean; Stretch:integer); external 'InitializeSlideShow@files:isslideshow.dll stdcall';
procedure DeinitializeSlideShow; external 'DeinitializeSlideShow@files:isslideshow.dll stdcall';
procedure ShowImage(ipath:PChar; Effect:integer); external 'ShowImage@files:isslideshow.dll stdcall';

var
  welcomBevel, welcomBevel1, welcomBevel2, welcomBevel3, DirBevel, DirBevel1, DirBevel2, TasksBevel  : TBevel;
  WelcomeLbl, TasksLbl, FinLbl  : TLabel;
 
procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
 CurrentPicture:=CurrentPicture+1;
 if CurrentPicture=piclist.count+1 then CurrentPicture:=1;
 ShowImage(piclist.strings[CurrentPicture - 1], 1);
end;

procedure InitializeWizard();
begin
  WizardForm.ClientWidth  := ScaleX(548);
  WizardForm.ClientHeight := ScaleX(360);
  WizardForm.InnerNotebook.Hide;
  WizardForm.OuterNotebook.Hide;

  WizardForm.NextButton.SetBounds(378,322,80,30);
  WizardForm.CancelButton.SetBounds(459,322,80,30);
  WizardForm.BackButton.SetBounds(297,322,80,30);

  WizardForm.Bevel.Parent := WizardForm;
  WizardForm.Bevel.Width  := WizardForm.ClientWidth;
  WizardForm.Bevel1.Parent := WizardForm;
  WizardForm.Bevel1.Top  := ScaleX(55);
  WizardForm.Bevel1.Width := WizardForm.ClientWidth;

  WizardForm.WizardBitmapImage.Parent := WizardForm;
  WizardForm.WizardBitmapImage.SetBounds(30,30,489,170);
  WizardForm.WizardSmallBitmapImage.Parent := WizardForm;
  WizardForm.WizardSmallBitmapImage.SetBounds(0,0,WizardForm.ClientWidth,55);

  WizardForm.PageDescriptionLabel.Parent := WizardForm;
//  WizardForm.PageDescriptionLabel.Transparent := True;
  WizardForm.PageDescriptionLabel.Left        := ScaleX(20);

  WizardForm.PageNameLabel.Parent := WizardForm;
//  WizardForm.PageNameLabel.Transparent := True;
  WizardForm.PageNameLabel.Left        := ScaleX(10);

  WizardForm.SelectDirBrowseLabel.Parent := WizardForm;
  WizardForm.SelectDirBrowseLabel.Font.Height := -12;
  WizardForm.SelectDirBrowseLabel.Font.Name  := 'Arial';
  WizardForm.SelectDirBrowseLabel.Caption    := 'Если вы хотите выбрать другую папку, нажмите «Обзор».' + #13#10 + '            Нажмите «Далее», чтобы продолжить.'
  WizardForm.SelectDirBrowseLabel.SetBounds(119,244,330,30);

  WizardForm.SelectDirLabel.Parent := WizardForm;
  WizardForm.SelectDirLabel.Font.Height := -12;
  WizardForm.SelectDirLabel.Font.Name  := 'Arial';
  WizardForm.SelectDirLabel.Left        := ScaleX(31);
  WizardForm.SelectDirLabel.Top        := ScaleY(78);

  WizardForm.DirEdit.Parent := WizardForm;
  WizardForm.DirEdit.Font.Height := -12;
  WizardForm.DirEdit.Font.Name  := 'Arial';
  WizardForm.DirEdit.SetBounds(31,99,402,30);

  WizardForm.DirBrowseButton.Parent := WizardForm;
  WizardForm.DirBrowseButton.SetBounds(440,98,80,25);

  WizardForm.GroupEdit.Parent := WizardForm;
  WizardForm.GroupEdit.Font.Height := -12;
  WizardForm.GroupEdit.Font.Name  := 'Arial';
  WizardForm.GroupEdit.SetBounds(31,181,402,30);

  WizardForm.GroupBrowseButton.Parent := WizardForm;
  WizardForm.GroupBrowseButton.SetBounds(440,180,80,25);

  WizardForm.SelectStartMenuFolderLabel.Parent := WizardForm;
  WizardForm.SelectStartMenuFolderLabel.Font.Height := -12;
  WizardForm.SelectStartMenuFolderLabel.Font.Name  := 'Arial';
  WizardForm.SelectStartMenuFolderLabel.Left        := ScaleX(31);
  WizardForm.SelectStartMenuFolderLabel.Top        := ScaleY(159);

  WizardForm.TasksList.Parent := WizardForm;
  WizardForm.TasksList.SetBounds(30,85,490,115);
  WizardForm.TasksList.BorderStyle := bsSingle;

  WizardForm.StatusLabel.Parent := WizardForm;
  WizardForm.StatusLabel.Font.Height := -12;
  WizardForm.StatusLabel.Font.Name  := 'Arial';
  WizardForm.StatusLabel.Left        := ScaleX(20);
  WizardForm.StatusLabel.Top        := ScaleX(235);

  WelcomeLbl:=TLabel.Create(WizardForm);
  With WelcomeLbl do begin
    Transparent :=true;
    Parent      := WizardForm;
    Alignment  := taCenter;
    WordWrap    := True;
    Font.Height := -12;
    Font.Name  := 'Arial';
    Caption    := 'Вас приветствует мастер установки «{#AppName}»' + #13#10 + 'Рекомендуется закрыть все прочие приложения перед тем, как продолжить.' + #13#10 + 'Нажмите «Далее», чтобы продолжить, или «Отмена», чтобы выйти.';
    Left        := ScaleX(21);
    Top        := ScaleY(243);
    Width      := ScaleX(500);
  end;

  welcomBevel := TBevel.Create(WizardForm);
  with welcomBevel do
  begin
    Parent := WizardForm;
    Left  := ScaleX(10);
    Top    := ScaleY(10);
    Width  := ScaleX(529);
    Height := ScaleY(210);
    Style  := bsRaised;
  end;

  welcomBevel1 := TBevel.Create(WizardForm);
  with welcomBevel1 do
  begin
    Parent := WizardForm;
    Left  := ScaleX(20);
    Top    := ScaleY(20);
    Width  := ScaleX(509);
    Height := ScaleY(190);
  end;

  welcomBevel2 := TBevel.Create(WizardForm);
  with welcomBevel2 do
  begin
    Parent := WizardForm;
    Left  := ScaleX(10);
    Top    := ScaleY(230);
    Width  := ScaleX(529);
    Height := ScaleY(72);
  end;

  welcomBevel3 := TBevel.Create(WizardForm);
  with welcomBevel3 do
  begin
    Parent := WizardForm;
    Left  := ScaleX(20);
    Top    := ScaleY(240);
    Width  := ScaleX(509);
    Height := ScaleY(52);
    Style  := bsRaised;
  end;

  DirBevel := TBevel.Create(WizardForm);
  with DirBevel do
  begin
    Parent := WizardForm;
    Left  := ScaleX(10);
    Top    := ScaleY(65);
    Width  := ScaleX(529);
    Height := ScaleY(155);
    Style  := bsRaised;
  end;

  DirBevel1 := TBevel.Create(WizardForm);
  with DirBevel1 do
  begin
    Parent := WizardForm;
    Left  := ScaleX(20);
    Top    := ScaleY(75);
    Width  := ScaleX(509);
    Height := ScaleY(73);
  end;

  DirBevel2 := TBevel.Create(WizardForm);
  with DirBevel2 do
  begin
    Parent := WizardForm;
    Left  := ScaleX(20);
    Top    := ScaleY(158);
    Width  := ScaleX(509);
    Height := ScaleY(51);
  end;

  TasksBevel := TBevel.Create(WizardForm);
  with TasksBevel do
  begin
    Parent := WizardForm;
    Left  := ScaleX(20);
    Top    := ScaleY(75);
    Width  := ScaleX(509);
    Height := ScaleY(134);
  end;

  TasksLbl:=TLabel.Create(WizardForm);
  With TasksLbl do begin
    Transparent :=true;
    Parent      := WizardForm;
    Alignment  := taCenter;
    AutoSize    := True;
    WordWrap    := True;
    Font.Height := -12;
    Font.Name  := 'Arial';
    Caption    := 'Выберите компоненты, которые Вы хотите установить;' + #13#10 + 'снимите флажки с компонентов, устанавливать которые не требуется.' + #13#10 + 'Нажмите «Установить», когда вы будете готовы начать установку.';
    Left        := ScaleX(21);
    Top        := ScaleY(243);
    Width      := ScaleX(500);
  end;

  FinLbl:=TLabel.Create(WizardForm);
  With FinLbl do begin
    Transparent :=true;
    Parent      := WizardForm;
    Alignment  := taCenter;
    WordWrap    := True;
    Font.Height := -12;
    Font.Name  := 'Arial';
    Caption    := '«{#AppName}» установлена на Ваш компьютер.' + #13#10 + 'Приложение можно запустить с помощью соответствующего значка.' + #13#10 + 'Нажмите «Завершить», чтобы выйти из программы установки.'
    Left        := ScaleX(21);
    Top        := ScaleY(243);
    Width      := ScaleX(500);
  end;
 
  PicList:=tstringlist.Create;
  ExtractTemporaryFile('1.jpg');
  ExtractTemporaryFile('2.jpg');
  ExtractTemporaryFile('3.jpg');
  ExtractTemporaryFile('4.jpg');
  ExtractTemporaryFile('5.jpg');
  ExtractTemporaryFile('6.jpg');
  ExtractTemporaryFile('7.jpg');
  piclist.add(ExpandConstant('{tmp}') + '\1.jpg');
  piclist.add(ExpandConstant('{tmp}') + '\2.jpg');
  piclist.add(ExpandConstant('{tmp}') + '\3.jpg');
  piclist.add(ExpandConstant('{tmp}') + '\4.jpg');
  piclist.add(ExpandConstant('{tmp}') + '\5.jpg');
  piclist.add(ExpandConstant('{tmp}') + '\6.jpg');
  piclist.add(ExpandConstant('{tmp}') + '\7.jpg');
end;

Procedure HideComponents();
begin
    WizardForm.WizardBitmapImage.Hide;
    WizardForm.WizardSmallBitmapImage.Hide;
    WizardForm.Bevel1.Hide;
    WelcomeLbl.Hide;
    welcomBevel.Hide;
    welcomBevel1.Hide;
    welcomBevel2.Hide;
    welcomBevel3.Hide;
    WizardForm.PageDescriptionLabel.Hide;
    WizardForm.PageNameLabel.Hide;
    DirBevel.Hide;
    DirBevel1.Hide;
    DirBevel2.Hide;
    WizardForm.SelectDirBrowseLabel.Hide;
    WizardForm.SelectDirLabel.Hide;
    WizardForm.DirEdit.Hide;
    WizardForm.DirBrowseButton.Hide;
    WizardForm.GroupEdit.Hide;
    WizardForm.GroupBrowseButton.Hide;
    WizardForm.SelectStartMenuFolderLabel.Hide;
    TasksBevel.Hide;
    WizardForm.TasksList.Hide;
    TasksLbl.Hide;
    FinLbl.Hide;
    WizardForm.StatusLabel.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var Comps1,Comps2,Comps3, TmpValue:cardinal;
    FindHandle1,ColFiles1,CurIndex1,tmp:integer;
    ExecError:boolean;
    InFilePath,OutFilePath,OutFileName:PAnsiChar;
begin
  if CurStep = ssInstall then begin  //Если необходимо, можно поменять на ssPostInstall
    WizardForm.ProgressGauge.Hide;
    WizardForm.CancelButton.Hide;
    CreateControls;
    WizardForm.StatusLabel.Caption := 'Распаковка архивов...';
    //WizardForm.StatusLabel.Left := ScaleX(20);
    //WizardForm.StatusLabel.Top := ScaleX(350);
    ISDoneCancel:=0;

ExtractTemporaryFile('unarc.dll');
#ifdef PrecompInside
ExtractTemporaryFile('CLS-precomp.dll');
ExtractTemporaryFile('packjpg_dll.dll');
ExtractTemporaryFile('packjpg_dll1.dll');
ExtractTemporaryFile('precomp.exe');
ExtractTemporaryFile('zlib1.dll');
#endif
#ifdef SrepInside
ExtractTemporaryFile('CLS-srep.dll');
#endif
ExtractTemporaryFile('facompress.dll');
#ifdef records
ExtractTemporaryFile('records.inf');
#endif
ExtractTemporaryFile('russian.ini');

#ifdef precomp
  PCFVer:={#precomp};
#else
  PCFVer:=0;
#endif
    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, 0,0,0, MainForm.Handle, 0, @ProgressCallback) then begin
      repeat
        if not SrepInit('',512,0) then break;
        if not PrecompInit('',128,PCFVer) then break;
        if not FileSearchInit(false) then break;

        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\*.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

//        if not ShowChangeDiskWindow ('Пожалуйста, вставьте второй диск и дождитесь его инициализации.', ExpandConstant('{src}'),'CODMW_2.arc') then break;

        ISDoneError:=false;
      until true;
      ISDoneStop;
    end;
    HideControls;
    WizardForm.CancelButton.Visible:=true;
    WizardForm.CancelButton.Enabled:=false;
  end;
  if (CurStep=ssPostInstall) and ISDoneError then begin
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
  end;
end;

procedure CurPageChanged(CurPageID: integer);
begin
  if CurPageID=wpWelcome then begin
    HideComponents;
    WizardForm.WizardBitmapImage.Show;
    WelcomeLbl.Show;
    welcomBevel.Show;
    welcomBevel1.Show;
    welcomBevel2.Show;
    welcomBevel3.Show;

  end;
  if CurPageID=wpSelectDir then begin
    HideComponents;
    WizardForm.WizardSmallBitmapImage.Show;
    WizardForm.Bevel1.Show;
    WizardForm.PageDescriptionLabel.Show;
    WizardForm.PageNameLabel.Show;
    DirBevel.Show;
    DirBevel1.Show;
    DirBevel2.Show;
    welcomBevel2.Show;
    welcomBevel3.Show;
    WizardForm.SelectDirBrowseLabel.Show;
    WizardForm.SelectDirLabel.Show;
    WizardForm.DirEdit.Show;
    WizardForm.DirBrowseButton.Show;
    WizardForm.GroupEdit.Show;
    WizardForm.GroupBrowseButton.Show;
    WizardForm.SelectStartMenuFolderLabel.Show;

  end;
  if CurPageID=wpSelectTasks then begin
    HideComponents;
    WizardForm.WizardSmallBitmapImage.Show;
    WizardForm.Bevel1.Show;
    WizardForm.PageDescriptionLabel.Show;
    WizardForm.PageNameLabel.Show;
    welcomBevel2.Show;
    welcomBevel3.Show;
    DirBevel.Show;
    TasksBevel.Show;
    WizardForm.TasksList.Show;
    TasksLbl.Show;

  end;
  if CurPageID=wpInstalling then begin
    InitializeSlideShow(WizardForm.Handle, 30, 30, scaleX(490), ScaleY(170), true, 2);
    CurrentPicture:=1;
    ShowImage(piclist.strings[CurrentPicture-1], 1);
    TimerID:=SetTimer(0, 0, 6000, WrapTimerProc(@OnTimer, 4));
    HideComponents;
    welcomBevel.Show;
    welcomBevel1.Show;
    welcomBevel2.Show;
    WizardForm.StatusLabel.Show;
  end;

  if CurPageID=wpFinished then begin
    HideComponents;
    WizardForm.WizardBitmapImage.Show;
    welcomBevel.Show;
    welcomBevel1.Show;
    welcomBevel2.Show;
    welcomBevel3.Show;
    FinLbl.Show;
    DeinitializeSlideShow;
    KillTimer(0, TimerID);
 
  end;

  if (CurPageID = wpFinished) and ISDoneError then
  begin
    WizardForm.Caption:= 'Ошибка распаковки!';
    FinLbl.Font.Color:= clRed;
    FinLbl.Caption:= SetupMessage(msgSetupAborted) ;
    FinLbl.Left := ScaleX(95);
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if (PageID=wpSelectProgramGroup) or (PageID=wpReady) or (PageID=wpSelectComponents) then Result:=true;
end;

procedure DeinitializeSetup();
begin
  DeinitializeSlideShow;
  KillTimer(0, TimerID);
end;


audiofeel 22-03-2013 11:50 2116193

saurn, без ошибки! (раз пять пробовал) появилась другое = эффект перехода один и тот же или вообще слайд шоу нет стоит первая и все. может менять картинки и друг за другом без интервала а может и через 10 секунд и через 20, причем чередуется может менять эффект а может один и тот же

saurn 22-03-2013 12:06 2116204

audiofeel,
Эффекты я не трогал, хотя соединил скрипты на скорую руку, исключительно чтобы проверить, может и намудрил что) Проверте на своем скрипте, что вы выкладывали. Только в процедуре CurPageChanged на wpFinished добавьте деинициализацию слайдшоу и убийство таймера.

Код:

DeinitializeSlideShow;
KillTimer(0, TimerID);


audiofeel 22-03-2013 12:12 2116209

Цитата:

Цитата saurn
Только в процедуре CurPageChanged на wpFinished добавьте деинициализацию слайдшоу и убийство таймера. »

да нет все есть (когда в пустую "не найдено архива" работает более менее и эффект меняется и интервал почти такой какой задан) - с архивом (на 90 сек) начинает выше описанные выкрутасы

saurn 22-03-2013 12:37 2116224

audiofeel
Есть еще такой вариант слайдшоу по таймеру. Попробуйте.

читать дальше »
Код:

#define TIME_FOR_VIEW 10

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=..

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

[Files]
Source: InnoCallback.dll; Flags: dontcopy noencryption nocompression solidbreak;
Source: .bmp; Flags: dontcopy noencryption nocompression solidbreak;

Source: D:\Games\StarCraft enGB\StarDat.mpq; DestDir: {app}

[...code]
const
n=21; //количество слайдов
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TRandNumbers = array[1..N] of byte;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

function get_unique_random_number(X:byte):TRandNumbers;
var
A,b,c: string;
i,j,k:byte;
begin
For i:=1 to X do A:=A+chr(i);
B:='';
For i:=1 to X do begin
  j:=Random(Length(A)-1)+1;
  C:='';
  B:=B + A[j];
  for k:=1 to Length(A) do
  if k<>j then C:=C+A[k];
  A:=C;
end;
for i:=1 to X do Result[i]:=ord(B[i]);
end;

var
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;
StatusMessages: TNewStaticText;
bmp: TRandNumbers;
z:byte;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
if (currTime mod {#TIME_FOR_VIEW} = 0)
then begin
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+ inttostr(bmp[currTime/{#TIME_FOR_VIEW}])+'.bmp'));
  if (currTime/{#TIME_FOR_VIEW} = N) then currTime:=0;
end;
end;

procedure InitializeWizard;
begin
bmp:=get_unique_random_number(N);
ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp');

currTime := 0;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY (12);
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
WizardForm.ProgressGauge.Height := 16;
WizardForm.ProgressGauge.Hide;

WizardForm.StatusLabel.Parent := WizardForm;
WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
WizardForm.StatusLabel.Left := ScaleX(10);
WizardForm.StatusLabel.Width := ScaleX(397);
WizardForm.StatusLabel.Hide;

SplashImage := TBitmapImage.Create(WizardForm);
SplashImage.Top := 0;
SplashImage.Left := 0;
SplashImage.Width := WizardForm.MainPanel.Width;
SplashImage.Height := WizardForm.Bevel.Top;
SplashImage.Parent := WizardForm.InnerPage;
SplashImage.Stretch := True;
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[1])+'.bmp'));
SplashImage.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
for z:=2 to N do ExtractTemporaryFile('Image_ '+inttostr(bmp[z])+'.bmp');
end;
end;

procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 5);
TimerID := SetTimer(0, 0, 1000, pfunc);
WizardForm.PageNameLabel.Visible := False;
WizardForm.PageNameLabel.Visible := False;
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
SplashImage.Show;
WizardForm.CancelButton.Enabled := True;
WizardForm.CancelButton.Top := WizardForm.Bevel.Top + ScaleY(100);
end else
begin
WizardForm.ProgressGauge.Hide;
SplashImage.Hide;
WizardForm.FileNameLabel.Hide;
WizardForm.StatusLabel.Hide;
if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageNameLabel.Show;
end;
If CurPageID = wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
KillTimer(0, TimerID);
end;


audiofeel 22-03-2013 13:02 2116236

saurn, ошибка при компиляции = одну "исправил" другая вышла

audiofeel 22-03-2013 13:12 2116243

вот

Gnom_aka_Lexander 22-03-2013 13:14 2116245

audiofeel, это теги форума, человек не учел, что в теге кода остальные теги не учитываются просто удали все HTML-теги и все

audiofeel 22-03-2013 13:35 2116253

Gnom_aka_Lexander, посмотрите второе изображение = не понятно

saurn 22-03-2013 13:37 2116255

Gnom_aka_Lexander
Просто пример из CHM файла, теги и разрывы строк скопировались, а я не обратил внимания.
audiofeel
Поправил пример в предыдущем посте

audiofeel 22-03-2013 13:54 2116264

saurn, вроде рабочий

saurn 22-03-2013 14:01 2116268

audiofeel
Пример работает корректно, я долго его использовал. Есть, правда, одна неприятная мелочь: иногда при смене изображения мерцают.

Gnom_aka_Lexander 22-03-2013 14:04 2116271

saurn, просто перед loadfromfile нужно делать Image.Bitmap.FreeImage; это немного освободит память и уменьшит мерцание.

insombia 22-03-2013 15:39 2116324

ботву никогда не юзал,хотелось бы сделать через неё чтобы на всех страницах была картинка
p.s. пример из шапки не предлагать
http://rghost.ru/44666197

Tco 03 23-03-2013 20:46 2117048

Цитата:

Цитата insombia
хотелось бы сделать через неё чтобы на всех страницах была картинка »

Если Вам нужна только вставка картинки (различных форматов), то я уже преводил такой пример: #1895

insombia 23-03-2013 21:03 2117053

Tco 03 да,именно оно

Renko13 24-03-2013 16:37 2117472

Доброго всем. Товарищи, подскажите пожалуйста, что добавить в скрипт.
Задача такая: Setup.exe должен просто скопировать все файлы которые лежат вместе с ним, в место указанное в установщике. Т.е. Setup.exe в себя компилировать ничего не должен. А просто служит для указания места копирования всех файлов которые лежат вместе с ним.

Gnom_aka_Lexander 24-03-2013 16:42 2117475

Renko13, Прочитай про флаг external в секции файлов. как раз то, что тебе нужно.

Renko13 24-03-2013 17:06 2117495

Gnom_aka_Lexander,

Спасибо. То что нужно. Буду теперь тут копать, инсталлер то складывается. А вот при установке пишет: Ошибка при попытке чтения исходного файла. Якобы не существует.

Gnom_aka_Lexander 24-03-2013 17:10 2117499

Renko13, Скрипт покажи. я-ж не знаю, как ты исходный файл прописываешь.

Renko13 24-03-2013 17:15 2117503

Gnom_aka_Lexander,


Скрипт длинный, а вот секция Files вот такая:

Код:

[Files]
Source: Files\Install\*; Flags: dontcopy
Source: Files\Install\5.ico; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: BOOT_A.wim; DestDir: {app}; Flags: ignoreversion external;
#ifdef FirewallInstallHelper
Source: Files\Install\FirewallInstallHelper.dll; DestDir: {app}; Flags: ignoreversion
#endif
#ifdef Skin
Source: Files\ISSkin\{#Skin}; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
Source: Files\ISSkin\ISSkin.dll; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system
#endif
#ifdef records
Source: records.inf; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef precomp04
Source: Files\Install\packjpg_dll.dll; DestDir: {tmp}; Flags: dontcopy
Source: Files\Install\RTconsole.exe; DestDir: {tmp}; Flags: dontcopy
Source: Files\Install\precomp04.exe; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef precomp038
Source: Files\Install\packjpg_dll.dll; DestDir: {tmp}; Flags: dontcopy
Source: Files\Install\RTconsole.exe; DestDir: {tmp}; Flags: dontcopy
Source: Files\Install\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
Source: Files\Install\zlib1.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef unrar
Source: Files\Install\Unrar.dll; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef Music
Source: Files\Music\*; Flags: dontcopy
#endif

#ifdef Components

Подопытный

Source: BOOT_A.wim; DestDir: {app}; Flags: ignoreversion external;

Gnom_aka_Lexander 24-03-2013 17:28 2117513

Цитата:

Цитата Renko13
Source: BOOT_A.wim; »

нужно указать путь к нему. как сейчас - теоретически рядом с сетапом должно искать. Точнее, для не внешних, рядом со скриптом. подозреваю, что для внешних может быть так-же. но лучше перестраховаться примерно таким образом:
Код:

Source: "{src}\BOOT_A.wim"; DestDir: {app}; Flags: external ignoreversion;
{src} - рядом с инсталлятором. если рядом но в подпапках, то нужно указать путь с учетом подпапок. например, если лежит рядом с инсталлом в подпапке wim, то будет так:
Код:

Source: "{src}\wim\BOOT_A.wim"; DestDir: {app}; Flags: external ignoreversion;

Renko13 24-03-2013 17:45 2117524

Цитата:

Source: "{src}\BOOT_A.wim"; DestDir: {app}; Flags: external ignoreversion;
Вот это спасибо огромное! Именно в переменной {src} было дело. Лежал BOOT_A.wim рядом с Setup.exe , но однако без точного указания переменной видеть не хотел.

Теперь буду так же с папками делать

Gnom_aka_Lexander 24-03-2013 17:48 2117526

Цитата:

Цитата Renko13
Лежал BOOT_A.wim рядом с Setup.exe »

Цитата:

Цитата Gnom_aka_Lexander
для не внешних, рядом со скриптом. подозреваю, что для внешних может быть так-же. »

рядом со скриптом - не одно и тоже, что рядом с сетапом, путь этот создается при компиляции, по дефолту - рядом со скриптом на подпапку выше, чем рядом с сетапом.
А для спасибов там есть такая специальная кнопочка - Полезное сообщение

Renko13 24-03-2013 17:50 2117527

Gnom_aka_Lexander,

Ой, точно. Запамятовал :clapping:

i-Lex 25-03-2013 10:10 2117950

Добрый день.
В программе я разбераюсь довольно таки плохо, но нужно срочно собрать пополнения для консультанта и отослать их в далёкое местечко, где нет интернета и где сидят очень неграмотныей(вплане компьютеров) люди.
Хотелось бы автоматизировать процесс.

А нужно мне от программы следующее:
1) Установщик сканирует флешки, находит файл "Cons.exe".
2) Ищет там папку RECEIVE.
3) Распаковывает туда файлы.
4) Запускает файлик "Cons.exe" с ключами /Receive /Base* /Yes

Tco 03 25-03-2013 23:29 2118516

Цитата:

Цитата i-Lex
Установщик сканирует флешки »

Их несколько чтоли (флешек)? А сам установщик в этот момент (по замыслу) где должен находиться?
Цитата:

Цитата i-Lex
находит файл "Cons.exe »

Пример поиска файла по маске
Цитата:

Цитата i-Lex
Ищет там папку »

Где именно (вопрос про флешки)?
Цитата:

Цитата i-Lex
Запускает файлик "Cons.exe" с ключами /Receive /Base* /Yes »

Тут мне вообще не понятно. Какие ключи? От чего? И что это: /Receive /Base* /Yes

Mailchik 26-03-2013 00:36 2118553

Цитата:

Цитата Tco 03
Тут мне вообще не понятно. Какие ключи? От чего? И что это: /Receive /Base* /Yes »

Ключи запуска программы.
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Code]
procedure InitializeWizard;
var
 ResultCode: integer;
 begin
  if Exec(ExpandConstant('{src}\Cons.exe'), '/Receive /Base* /Yes', '', SW_HIDE,
      ewWaitUntilTerminated, ResultCode) then
      MsgBox('Success', mbInformation, MB_OK) else
        MsgBox('Not success', mbInformation, MB_OK);
end;


i-Lex 26-03-2013 08:52 2118690

Tco 03,
Цитата:

Цитата Tco 03
Их несколько чтоли (флешек)? А сам установщик в этот момент (по замыслу) где должен находиться? »

Либо на флешке, либо на CD.
И да, флешек может быть куча вставлена.
Цитата:

Цитата Tco 03
Где именно (вопрос про флешки)? »

Да, на одной из флешек лежит папка. Она может называться по разному. В ней лежит файлик Cons.exe и ещё несколько файлов и папок.
Одна из этих папок называется "Receive". Туда и нужно копировать файлы.
Потом нужно запустить файл Cons.exe с параметрами /Receive /Base* /Yes
Цитата:

Цитата Tco 03
Тут мне вообще не понятно. Какие ключи? От чего? И что это: /Receive /Base* /Yes »

Это команды автопополнения.

Важно, что искать программа должна именно на флешках. Т.к. на компе может быть установлена демо версия Консультанта, с такими же файлами, но урезанная и не умеющая пополняться.

habib2302 26-03-2013 10:51 2118741

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

habib2302 26-03-2013 15:24 2118949

Цитата:

Цитата neorom
Так же нужен скрипт под Fenixx »

жми сюда

El Sanchez 26-03-2013 15:59 2118981

i-Lex, папка Receive с апдейтами рядом со скриптом :
читать дальше »

Код:

#define AppName "Консультант Плюс"
#define AppExe "CONS.EXE"
#define UpdateDir "RECEIVE"

#define FindHandle
#define FindResult

#sub ProcessFoundFile
    #define public AppVer GetFileVersion(UpdateDir + "\" + FindGetFileName(FindHandle))
#endsub

#for {FindHandle = FindResult = FindFirst(UpdateDir + "\vr*.res", 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile

[Setup]
AppName={#AppName}
AppVerName={#AppName} {#AppVer}
AppVersion={#AppVer}
CreateAppDir=false
DefaultDirName={tmp}
UsePreviousAppDir=false
UsePreviousGroup=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
DisableWelcomePage=yes
Uninstallable=false
CreateUninstallRegKey=false

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Messages]
ru.SetupAppTitle=Обновление
ru.SetupWindowTitle=Обновление — %1
ru.WizardReady=Всё готово к обновлению
ru.ReadyLabel1=Программа установки готова начать обновление [name/ver] на вашем компьютере.
ru.ReadyLabel2b=Выберите папки установки и нажмите «Обновить», чтобы продолжить.
ru.WizardInstalling=Обновление...
ru.InstallingLabel=Пожалуйста, подождите, пока [name] обновится на вашем компьютере.
ru.FinishedHeadingLabel=Завершение Мастера обновления [name]
FinishedLabelNoIcons=Программа [name] обновлена на вашем компьютере.

[Files]
Source: {#UpdateDir}\*; DestDir: {tmp}\{#UpdateDir}; Flags: createallsubdirs recursesubdirs

[code]
#define A = (Defined UNICODE) ? "W" : "A"

const
    DRIVE_NO_ROOT_DIR = 1;
    DRIVE_REMOVABLE = 2;
    FO_COPY = $2;
    FOF_SILENT = $4;
    FOF_NOCONFIRMMKDIR = $200;
    FOF_NOCONFIRMATION = $10;
    FOF_NOERRORUI = $400;

type
    SHFILEOPSTRUCT = record
        hwnd: HWND;
        wFunc: UINT;
        pFrom: String;
        pTo: String;
        fFlags: Longint;
        fAnyOperationsAborted: BOOL;
        hNameMappings: Longint;
        lpszProgressTitle: String;
    end;

var
    szPaths: TStringList;
    AppPathsCheckListBox: TNewCheckListBox;
   
function GetLogicalDrives(): DWORD; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';
function SHFileOperation(var lpFileOp: SHFILEOPSTRUCT): Integer; external 'SHFileOperation{#A}@shell32.dll stdcall';

//////////////////////////////////////////////////////////////////
function FindAppExePath(const szPath, szFileName: String): String;
var
    FR: TFindRec;
begin
    if FindFirst(Format('%s\%s', [szPath, szFileName]), FR) then
    try
        repeat
            if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0) then
                if DirExists(Format('%s\{#UpdateDir}', [szPath])) then Result := szPath;
        until not FindNext(FR) or (Result <> '');
    finally
        FindClose(FR);
    end;
    // recurse
    if FindFirst(Format('%s\*', [szPath]), FR) then
    try
        repeat
            if (FR.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and (FR.Name <> '.') and (FR.Name <> '..') then
                Result := FindAppExePath(Format('%s\%s', [szPath, FR.Name]), szFileName);
        until not FindNext(FR) or (Result <> '');
    finally
        FindClose(FR);
    end;
end;

////////////////////////////////////
function GetAppPaths(): TStringList;
var
    dwDrives, dwDriveType: DWORD;
    i: Integer;
    szDriveLetter: String;
begin
    if Result = nil then Result := TStringList.Create;
    dwDrives := GetLogicalDrives();
    for i := 2 to 25 do if dwDrives and (1 shl i) <> 0 then
    begin
        szDriveLetter := Format('%s:', [Chr(Ord('A') + i)]);
        dwDriveType := GetDriveType(szDriveLetter);
        case dwDriveType of
            DRIVE_REMOVABLE: begin
                Result.Add(FindAppExePath(szDriveLetter, '{#AppExe}'));
                if Result.Strings[Result.Count-1] = '' then Result.Delete(Result.Count-1);
            end;
            DRIVE_NO_ROOT_DIR: Continue;
        end;
    end;
end;

///////////////////////////////////////////////////////
procedure AppPathsCheckListBoxOnClick(Sender: TObject);
var
    i: Integer;
begin
    WizardForm.NextButton.Enabled := False;
    for i := 0 to TNewCheckListBox(Sender).ItemCount-1 do WizardForm.NextButton.Enabled := WizardForm.NextButton.Enabled or TNewCheckListBox(Sender).Checked[i];
end;

////////////////////////////////////
function InitializeSetup(): Boolean;
begin
    szPaths := GetAppPaths();
    Result := szPaths.Count > 0;
    if not Result then MsgBox('Ахтунг! Программа {#AppName} не найдена на съемных дисках!', mbError, MB_OK);
end;

/////////////////////////////
procedure InitializeWizard();
var
    i: Integer;
begin
    WizardForm.ReadyMemo.Hide;
    AppPathsCheckListBox := TNewCheckListBox.Create(WizardForm);
    with AppPathsCheckListBox do
    begin
        Parent := WizardForm.ReadyPage;
        SetBounds(WizardForm.ReadyMemo.Left, WizardForm.ReadyMemo.Top, WizardForm.ReadyMemo.Width, WizardForm.ReadyMemo.Height);
        BorderStyle := bsNone;
        Color := clBtnFace;
        WantTabs := True;
        MinItemHeight := ScaleY(21);
        OnClickCheck := @AppPathsCheckListBoxOnClick;
        for i := 0 to szPaths.Count-1 do AddCheckBox(szPaths.Strings[i], '', 0, True, True, False, False, nil);
    end;
end;

/////////////////////////////////////////////
procedure CurPageChanged(CurPageID: Integer);
begin
    case CurPageID of
        wpReady: WizardForm.NextButton.Caption := 'Обновить';
    end;
end;

//////////////////////////////////////////////
procedure CurStepChanged(CurStep: TSetupStep);
var
    fs: SHFILEOPSTRUCT;
    i, ResultCode: Integer;
begin
    case CurStep of
        ssPostInstall: begin
            fs.wFunc := FO_COPY;
            fs.pFrom := ExpandConstant('{tmp}\{#UpdateDir}'#0);
            fs.fFlags := FOF_SILENT or FOF_NOCONFIRMATION or FOF_NOCONFIRMMKDIR or FOF_NOERRORUI;
            for i := 0 to AppPathsCheckListBox.ItemCount-1 do if AppPathsCheckListBox.Checked[i] then
            begin
                fs.pTo := Format('%s'#0, [AppPathsCheckListBox.ItemCaption[i]]);
                if SHFileOperation(fs) <> 0 then Break;
                Exec(Format('%s\{#AppExe}', [AppPathsCheckListBox.ItemCaption[i]]), '/Receive /Base* /Yes', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
            end;
        end;
    end;
end;

//////////////////////////////
procedure DeinitializeSetup();
begin
    szPaths.Free;
end;


Johny777 26-03-2013 16:00 2118982

i-Lex,

El Sanchez, Ну ты меня опередил на минуту :) , как вариант:
пробегаемся в цикле функцией GetDriveType() по дискам пока она не вернёт DRIVE_REMOVABLE
рекурсивно ищем в диске (то бишь во флэшке) файл и заполняем структуру
Код:

type
    _RUN_STRUCT = record
        pConsExe: String; // путь к экзешнику Cons.exe
        pReceive: String; // к папке Receive
    end;

на этапе установки в цикле из рядом с инаталлом извлекаем архив по папкам и запускаем екзешники с параметрами
целых 176 строк кода :)
код:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
CreateAppDir=no

[Files]
Source: 7-zip32.dll; Flags: dontcopy


[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

const
    DRIVE_NO_ROOT_DIR = 1;
    DRIVE_REMOVABLE = 2;
    DRIVE_FIXED = 3;
    MAX_PATH = 260;

type
    _RUN_STRUCT = record
        pConsExe: String;
        pReceive: String;
    end;

function GetDriveType(lpRootPathName: String): UINT; external 'GetDriveType{#A}@kernel32.dll stdcall';


procedure SearchForFile(const RootFolder, FileName: String; var ResultPathArray: array of _RUN_STRUCT); 
var
    NewSearchPath: String;
    FindRec: TFindRec;
    Len: Integer;
begin
    NewSearchPath := AddBackslash(RemoveBackslash(RootFolder));

    if FindFirst(NewSearchPath + '*.*', FindRec) then
    try

        repeat
            if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
            begin
                if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0  then
                begin
                    if FindRec.Name = FileName then
                    begin
                        Len := GetArrayLength(ResultPathArray);
                        SetArrayLength(ResultPathArray, Len+1);
                        ResultPathArray[Len].pConsExe := NewSearchPath + FindRec.Name;
                        ResultPathArray[Len].pReceive := NewSearchPath + 'RECEIVE';
                    end;
                end else
                if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then SearchForFile(NewSearchPath + FindRec.Name, FileName, ResultPathArray);
            end;
        until not FindNext(FindRec);

    finally
        FindClose(FindRec);
    end;
end;
   


function ScanDrives(): array of _RUN_STRUCT;
var
    UndefDriveLetter: String;
    DriveType: UINT;
    i: Integer;
begin
    for i := 67 to 90 do // Loop from C..Z to determine available drives
    begin
        UndefDriveLetter := Chr(i) + ':\';
        DriveType := GetDriveType(UndefDriveLetter);
        case DriveType of
            DRIVE_REMOVABLE: begin
                SearchForFile(UndefDriveLetter, 'Cons.exe', Result);
            end;
            DRIVE_NO_ROOT_DIR, DRIVE_FIXED: Continue;
        end;
    end;
end;

///////////////////////////////////////////////////////////////////////////////////////


#define A = (Defined UNICODE) ? "W" : "A"

const
    SZ_ERROR = 1;
    SZ_DLLERROR = 3;
    ARCEXTRACT_INPROCESS = 1;
    WM_USER = $400;
    PBM_SETPOS = (WM_USER + 2);
    PBM_SETRANGE32 = (WM_USER + 6);

type
    EXTRACTINGINFO = record
        dwFileSize: DWORD;
        dwWriteSize: DWORD;
        szSourceFileName: array [0..512] of Char;
        dummy1: array [0..2] of Byte;
        szDestFileName: array [0..512] of Char;
        dummy: array [0..2] of Byte;
    end;

function SevenZip(const hwnd: HWND; szCmdLine: PAnsiChar; szOutput: AnsiString; const dwSize: DWORD): Integer; external 'SevenZip@files:7-zip32.dll stdcall';
function SevenZipSetOwnerWindowEx(_hwnd: HWND; _lpArcProc: Longint): BOOL; external 'SevenZipSetOwnerWindowEx@files:7-zip32.dll stdcall';
function SevenZipKillOwnerWindowEx(_hwnd: HWND): BOOL; external 'SevenZipKillOwnerWindowEx@files:7-zip32.dll stdcall';
//
function RtlMoveMemory(var Destination: EXTRACTINGINFO; const Source: Longint; len: Integer): Integer; external 'RtlMoveMemory@kernel32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';
function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: String; cbMultiByte: Integer; lpWideCharStr: String; cchWideChar: Integer): Integer; external 'MultiByteToWideChar@kernel32.dll stdcall';

var
    ei: EXTRACTINGINFO;

function ArchiverCallbackProc(hwnd: HWND; uMsg, nState: UINT; lpEis: Longint): BOOL;
begin
    Result := True;
    case nState of
        ARCEXTRACT_INPROCESS: begin
            RtlMoveMemory(ei, lpEis, SizeOf(ei));
            PostMessage(hwnd, PBM_SETRANGE32, 0, 100);
            PostMessage(hwnd, PBM_SETPOS, Round(ei.dwWriteSize*100/ei.dwFileSize), 0);
        end;
    end;
end;


function SevenZipCommand(const hWnd: HWND; szParams: String; const lpArchiverCallback: Longint): Longint;
begin
    Result := SZ_ERROR;
    if lpArchiverCallback <> 0 then szParams := Format('%s -hide', [szParams]);
    CharToOemBuff(szParams);
    try
        if lpArchiverCallback <> 0 then SevenZipSetOwnerWindowEx(hWnd, lpArchiverCallback); //set callback
        Result := SevenZip(hWnd, szParams, '', 0);
    finally
        if lpArchiverCallback <> 0 then SevenZipKillOwnerWindowEx(hWnd);
    except
        Result := SZ_DLLERROR;
    end;
end;



///////////////////////////////////////////////////////////////////////////////////////
type
    HINST = THandle;

function ShellExecute(hWnd: HWND; Operation, FileName, Parameters, Directory: PChar; ShowCmd: Integer): HINST; external 'ShellExecute{#A}@shell32.dll stdcall';

procedure CurStepChanged(CurStep: TSetupStep);
var
    UndefRunArray: array of _RUN_STRUCT;
    i, ErrorCode: Integer;
begin
    if CurStep = ssInstall then
    begin
        UndefRunArray := ScanDrives();
        for i := 0 to GetArrayLength(UndefRunArray)-1 do
        begin
            // extract with callback
            SevenZipCommand(WizardForm.ProgressGauge.Handle, Format('x "%s" "%s" -y', [AddBackslash(ExpandConstant('{src}'))+'123.7z', AddBackslash(UndefRunArray[i].pReceive)]), CallbackAddr('ArchiverCallbackProc'));
            if ShellExecute(0, 'open', UndefRunArray[i].pConsExe, '/Receive /Base* /Yes', '', SW_SHOWNORMAL) <= 32 then MsgBoxEx(0, SysErrorMessage(DLLGetLastError), SetupMessage(msgErrorTitle), MB_OK, 0, 10);
        end;
    end;
end;


ЗЫ: i-Lex, у меня там пара лишних объявленных переменных (Ex: ErrorCode). Забыл подмести. Сам убери!
архив с примером:

Gnom_aka_Lexander 26-03-2013 20:01 2119192

Если кому интересно, вот окончательное решение задачки товарища i-Lex:
читать дальше »
Код:

[Setup]
AppName=Consultant Plus Update
AppVersion=1.5
UsePreviousGroup=False
DisableProgramGroupPage=yes
CreateAppDir=False
Uninstallable=no
OutputBaseFilename=ConsultantPlusUpdate
AppCopyright=ООО "Информационный Центр Консультант"
WizardImageFile=null.bmp
WizardSmallImageFile=2.bmp
SetupIconFile=1.ico
BitmapResource=BIG:1.bmp
OutputDir=.

[Files]
Source : "{code:GetSrcDir}\*"; DestDir:"{code:GetDir}"; Flags: ignoreversion recursesubdirs createallsubdirs external skipifsourcedoesntexist

[Run]
Filename: "{code:GetExec}"; Parameters: "{code:GetExecParam}";WorkingDir:"{code:GetWork}"; Flags: nowait

[*code]
#ifdef UNICODE
  #define A="W"
#else
  #define A="A"
#endif
var
  res, found : Boolean;
  sl : TStringList;

function GetLogicalDrives: DWORD;
  external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint;
  external 'GetDriveType{#A}@kernel32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint;
  external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint;
  external 'SetWindowLong{#A}@user32.dll stdcall';

function GetDir(const s: string): string;
begin
  Result :=sl[1];
end;

function GetExecParam(const s: string): string;
begin
  case FileExists(ExpandConstant('{src}\Settings.inx')) of
    false : Result :='/Receive /Base* /Yes';
    true: Result := GetIniString('Setup', 'ExecParam', '/Receive /Base* /Yes', ExpandConstant('{src}\Settings.inx'));
  end;
end;

function GetSrcDir(const s: string): string;
begin
  case FileExists(ExpandConstant('{src}\Settings.inx')) of
    false : Result :=RemoveBackslash(ExpandConstant('{src}\Updates'));
    true: Result :=RemoveBackslash(ExpandConstant('{src}\')+GetIniString('Setup', 'SrcDir', 'Updates', ExpandConstant('{src}\Settings.inx')));
  end;
end;

function GetExec(const s: string): string;
begin
  Result :=sl[0];
end;

function GetWork(const s: string): string;
begin
  Result := RemoveBackslash(ExtractFilePath(sl[0]));
end;

function ChecFull(dir : string): Boolean;
var
  SR : TFindRec;
  FR : Boolean;
  dirs : string;
  dc : DWORD;
begin
  dc := 0;
  dirs := 'ROS CMB CJI PSP PKS PDR PGU PKP PTS ARB COMMON';
  FR := FindFirst(AddBackslash(dir)+'*', SR);
  while FR do
  begin
    if ((SR.Attributes and $00000010) = $00000010) and ((SR.Name<>'.') and (SR.Name<> '..')) then
    begin
      inc(dc);
      if Pos(SR.Name, dirs)=0 then Break;
    end;
    Application.ProcessMessages;
    FR := FindNext(SR);
  end;
  FindClose(SR);
  Result := dc = 11;
end;

procedure FindFile(destd, mask : string; sl : TStrings);
var
  SR : TFindRec;
  FR : Boolean;
begin
  FR := FindFirst(AddBackslash(destd )+ '*.*', SR);
  while (FR and not res)do
  begin
    if pos(mask, AddBackslash(destd ) + SR.Name)<>0 then
    begin
      Application.ProcessMessages;
      if ChecFull(AddBackslash(destd)+'base') then
        if DirExists(AddBackslash(destd)+'RECEIVE')then
      begin
        sl.Add(AddBackslash(destd) + SR.Name);
        sl.Add(AddBackslash(destd)+'RECEIVE');
        res := True;
        break;
      end;
    end;
      Application.ProcessMessages;
    if ((SR.Attributes and $00000010) = $00000010) and ((SR.Name = '.') or (SR.Name = '..')) then
    begin
      FR := FindNext(SR);
      Continue;
    end;
      Application.ProcessMessages;
    if ((SR.Attributes and $00000010) = $00000010) then
    begin
      FindFile(AddBackslash(destd ) + SR.Name + '\', mask, sl);
      FR := FindNext(SR);
      Continue; // продолжить цикл
    end;
      Application.ProcessMessages;
    FR := FindNext(SR);
  end;
  FindClose(SR);
end;

function ChecCP(): Boolean;
var
  x: LongInt;
  bit, i: integer;
  tp: Uint;
  tip: string;
  frm : TForm;
begin
  frm := TForm.Create(nil);
  with frm do
  begin
    BorderStyle := bsDialog;
    BorderIcons := [];
    SetBounds(0, 0, ScaleX(400), ScaleY(50));
    Position := poScreenCenter;
    Caption := 'Подождите, идет поиск вашей программы...';
    Show;
  end;
  with TNewProgressBar.Create(frm) do
  begin
    Parent := frm;
    Align := alClient;
    Style := npbsPaused;
    SetWindowLong(Handle,-16,GetWindowLong(Handle, -16) or $08);
    SendMessage(Handle, $0400 + 10, 10, 1);
    Show;
  end;
  res := false;
  sl := TStringList.Create;
  x:=GetLogicalDrives();
  if x=0 then Exit;
  for i:=1 to 64 do
  begin
    Application.ProcessMessages;
    bit:=x and 1;
    if bit=1 then
    begin
      if res then Break;
      tip := PAnsiChar(chr(64+i)+':');
      if ((GetDriveType(tip)=2) and (DirExists(tip))) then FindFile(tip, 'cons.exe', sl);
    end;
    Application.ProcessMessages;
    x:= x shr 1;
  end;
  Result := sl.Count>1;
  if not Result then MsgBox('Программа не найдена, либо у Вас demo-версия программы.', mbError, MB_OK);
  frm.Free;
end;

function InitializeSetup(): Boolean;
begin
  sl := TStringList.Create;
  found := ChecCP;
  Result := found;
  if not Result then
    sl.Free;
end;

procedure DeinitializeSetup();
begin
  if found then sl.Free;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpReady then
  begin
    with WizardForm.ReadyMemo do
    begin
      Show;
      Clear;
      Lines.Add('Папка обновлений: ');
      Lines.Add('    '+GetSrcDir(''));
      Lines.Add('');
      Lines.Add('Папка приложения: ');
      Lines.Add('    '+GetWork(''));
      Lines.Add('');
      Lines.Add('Папка установки обновлений: ');
      Lines.Add('    '+GetDir(''));
      Lines.Add('');
      Lines.Add('Параметры запуска: ');
      Lines.Add('    '+GetExec('')+' '+GetExecParam(''));
    end;
  end;
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    WizardBitmapImage.Bitmap.FreeImage;
    WizardBitmapImage2.Bitmap.FreeImage;
    WizardBitmapImage.Bitmap.LoadFromResourceName(HInstance, '_IS_BIG');
    WizardBitmapImage2.Bitmap.LoadFromResourceName(HInstance, '_IS_BIG');
  end;
end;


Без коментариев(есть за мной такой косяк ;) ) но там вроде все и так понятно. буду благодарен товарищу El Sanchez, если подскажет, как можно дополнительно оптимизировать поиск, кроме принудительного обрыва рекурсии.

El Sanchez 27-03-2013 19:25 2120204

Цитата:

Цитата Gnom_aka_Lexander
как можно дополнительно оптимизировать поиск, кроме принудительного обрыва рекурсии. »

Gnom_aka_Lexander, да никак, искать до потери пульса либо рвать поиск на первом совпадении и надеяться, что на флешке не окажется второй и более копий программы, до которых поиск так и не дойдет. Хотя можно теоретически как-то задействовать Indexing Service/Windows Search Service.

Цитата:

Цитата Gnom_aka_Lexander
вот окончательное решение задачки »

Gnom_aka_Lexander, граната ChecFull не той системы. :)

Gnom_aka_Lexander 27-03-2013 19:35 2120214

Цитата:

Цитата El Sanchez
граната ChecFull не той системы »

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

Цитата El Sanchez
да никак »

а апишные функции поиска не должны ускорить? в интерпретаторе инно там своя реализация, поэтому вызов апишных вроде-бы должен ускорить. на данный момент секунды полторы на поиск уходит при средней загруженности флешки левыми файлами-папками, я посчитал это уже приемлемым, но может можно еще быстрей?

Johny777 27-03-2013 22:48 2120334

Gnom_aka_Lexander, El Sanchez,

дельфи и инно используют для поиска WinApi функции:
function FindFirstFile(...): THandle;
function FindNextFile(...): BOOL;
function FindClose(...): BOOL;
которые лежат в kernel32.dll и работа напрямую с этими функциями дала бы некоторое повышение скорости
а то получаем торомоза из-за вызова функции внутри другой

вот накатал 2 примера рекурсивного поиска по расширению: обычная и с использованием вышеупомянутых WinApi напрямую:

читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
CreateAppDir=no
DisableWelcomePage=yes
InfoBeforeFile=compiler:Default.isl


[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
const
    MAX_PATH = 260;
    INVALID_HANDLE_VALUE = -1;

type
    _WIN32_FIND_DATA = record
        dwFileAttributes: DWORD;
        ftCreationTime: TFileTime;
        ftLastAccessTime: TFileTime;
        ftLastWriteTime: TFileTime;
        nFileSizeHigh: DWORD;
        nFileSizeLow: DWORD;
        dwReserved0: DWORD;
        dwReserved1: DWORD;
        cFileName: array[0..MAX_PATH - 1] of Char;
        cAlternateFileName: array[0..13] of Char;
    end;


function FindFirstFile(lpFileName: String; var lpFindFileData: _WIN32_FIND_DATA): THandle; external 'FindFirstFile{#A}@kernel32.dll stdcall';
function FindNextFile(hFindFile: THandle; var lpFindFileData: _WIN32_FIND_DATA): BOOL; external 'FindNextFile{#A}@kernel32.dll stdcall';
function Win_Api_FindClose(hFindFile: THandle): BOOL; external 'FindClose@kernel32.dll stdcall';

function GetTickCount(): DWORD; external 'GetTickCount@kernel32.dll stdcall';


function CharArrayToString(cArray: array of Char): String;
begin
    Result := '';
    while cArray[Length(Result)] <> #0 do Insert(cArray[Length(Result)], Result, Length(Result)+1);
end;



function WinApiSearchForFiles(const RootFolder, Extension: String; var ResultPathArray: array of String): Boolean;  // get all files with their path
var
    FindData: _WIN32_FIND_DATA;
    NewSearchPath: String;
    hFindFile: THandle;
    Len: Integer;
begin
    NewSearchPath := AddBackslash(RemoveBackslash(RootFolder));

    hFindFile := FindFirstFile(NewSearchPath + Extension, FindData);

    if hFindFile = INVALID_HANDLE_VALUE then
    begin
        MsgBoxEx(0, SysErrorMessage(DLLGetLastError), SetupMessage(msgErrorTitle), MB_OK, 0, 0);
        Exit;
    end;
   
    try
        repeat
       
            if FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
            begin
                Len := GetArrayLength(ResultPathArray);                                                                 
                SetArrayLength(ResultPathArray, Len+1);
                ResultPathArray[Len] := NewSearchPath + CharArrayToString(FindData.cFileName);
            end else if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY) and (String(FindData.cFileName[0]) <> '.') and (String(FindData.cFileName[0]) <> '..') then
            /// recurse
            WinApiSearchForFiles(AddBackslash(NewSearchPath + CharArrayToString(FindData.cFileName)), Extension, ResultPathArray);
           
        until not FindNextFile(hFindFile, FindData);

    finally
        Result := Win_Api_FindClose(hFindFile);
    end;
end;


////////////////////////////////////////////////////////////////



procedure SearchForFiles(const RootFolder, Extension: String; var ResultPathArray: array of String);  // get all files with their path
var
    NewSearchPath: String;
    FindRec: TFindRec;
    Len: Integer;
begin
    NewSearchPath := AddBackslash(RemoveBackslash(RootFolder));

    if FindFirst(NewSearchPath + Extension, FindRec) then
    try

        repeat
            if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
            begin
                if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
                begin
                    Len := GetArrayLength(ResultPathArray);
                    SetArrayLength(ResultPathArray, Len+1);
                    ResultPathArray[Len] := NewSearchPath + FindRec.Name;
                end else
                if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = FILE_ATTRIBUTE_DIRECTORY then SearchForFiles(NewSearchPath + FindRec.Name, Extension, ResultPathArray);
            end;
        until not FindNext(FindRec);

    finally
        FindClose(FindRec);
    end;
end;





procedure InitializeWizard;
var
    i: Integer;
    S: String;
    UndefArray: array of String;
   
    dwStartTime: DWORD;
begin
//    dwStartTime := GetTickCount();
//    SearchForFiles('C:\Program Files\Adobe\Adobe Photoshop CS5.1 (64 Bit)', '*.*', UndefArray);
//    MsgBox('Inno Search Time:' + #32 + IntToStr(GetTickCount()-dwStartTime), mbInformation, MB_OK);
   
    dwStartTime := GetTickCount();
    WinApiSearchForFiles('C:\Program Files\Adobe\Adobe Photoshop CS5.1 (64 Bit)', '*.*', UndefArray);
    MsgBox('Win Api Search Time:' + #32 + IntToStr(GetTickCount()-dwStartTime), mbInformation, MB_OK);

    for i := 0 to GetArrayLength(UndefArray)-1 do S := S + #13#10 + UndefArray[i];
    WizardForm.InfoBeforeMemo.Text := S;
end;



но в результате обычная работает быстрее тк, для апишной приходится использовать функцию конвертации массива символов в строку, тк урезанная инно не умеет преобразовать тип String(array of Char) :(

=================

ускорить поиск думаю можно указанием имени файла а не расширения:
SearchForFiles('C:\Program Files\Adobe\Adobe Photoshop CS5.1 (64 Bit)', 'Bib.dll', UndefArray);

El Sanchez 27-03-2013 23:16 2120350

Цитата:

Цитата Gnom_aka_Lexander
Все той. Уточнял у вопрошавшего как надежно отличить полную версию от демо-версии. »

Gnom_aka_Lexander, я не про предназначение функции, я про это:
Цитата:

Цитата Gnom_aka_Lexander
inc(dc); »


i-Lex 28-03-2013 06:05 2120465

Большое спасибо Gnom_aka_Lexander, за помощь!

i-Lex 28-03-2013 06:42 2120470

Цитата:

Цитата El Sanchez
рвать поиск на первом совпадении и надеяться, что на флешке не окажется второй и более копий программы, до которых поиск так и не дойдет. »

У клиента только один экземпляр.
Флешка чисто консовская. Поэтому можно рвать поиск при первом результате =)

habib2302 28-03-2013 10:41 2120557

Цитата:

Цитата habib2302
доброе время суток.дайте пожалуйста мне скрипт на кликабельное лого без фона »

АААУУУ!!!МНЕ КТО НИБУДЬ ОТВЕТИТ?

audiofeel 28-03-2013 13:00 2120625

доброе утро всем, ну задумка (или глупость) такая = хотелось GroupEdit.Color := clBlack; ну получилось но при нажатии "NoIconsCheck" фон в GroupEdit "белеет" и текста не видно (было бы хорошо если бы "GroupEdit" был транспарент) . И как сделать фон "NoIconsCheck" черный (или транспарент) а текст белый. Спасибо!

vint56 28-03-2013 14:54 2120709

habib2302 http://rghost.ru/44839186

Alloc 28-03-2013 16:01 2120786

Все приветы! Уважаемые форумчане, подскажите как грамотно реализовать алгоритм, который будет отображать в компоненте Label проценты из ProgressGauge (progressbar); Я имею данный скрипт:

Код:

procedure ExtLog();
begin
  with WizardForm.ProgressGauge do
    ProgressLabel.Caption:=IntToStr((Position-Min)/((Max - Min)/100)) + '%';
end;

Далее я просто вставляю ссылку процедуры на файлы в раздел [Files] таким образомЖ

Код:

[Files]
Source: E:\Program*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; AfterInstall: ExtLog();

Вроде как все правильно и оно работает, но проценты из ProgressLabel под конец доходят до 112% а не до 100 как должно быть..
Уважаемые, помогите пожалуйста решить данный косяк...

saurn 28-03-2013 16:45 2120823

Alloc Пост #239

El Sanchez 28-03-2013 19:09 2120925

2 all, тема будет закрыта и переведена в архивное состояние. Продолжаем тут: http://forum.oszone.net/thread-257328.html


Время: 00:12.

Время: 00:12.
© OSzone.net 2001-