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

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

Автор: Genri
Дата сообщения: 16.07.2008 21:39
Sandy Ann -- в старой ветке примеры были. [more]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: ISSkin.dll; DestDir: {app}
Source: Office2007.cjstyles; DestDir: {app}

[_Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@files:isskin.dll stdcall delayload setuponly';

procedure LoadSkinA(lpszPath: String; lpszIniFileName: String);
external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('Office2007.cjstyles');
LoadSkin(ExpandConstant('{tmp}\Office2007.cjstyles'), '');
Result:=True;
end;

function InitializeUninstall(): Boolean;
begin
FileCopy(ExpandConstant('{app}\isskin.dll'),
ExpandConstant('{tmp}\isskin.dll'), False);
FileCopy(ExpandConstant('{app}\Office2007.cjstyles'),
ExpandConstant('{tmp}\Office2007.cjstyles'), False);

LoadSkinA(ExpandConstant('{tmp}\Office2007.cjstyles'), '');
Result:=True;
end;
[/more]

Добавлено:
boss911

Цитата:
Почему секция [Run] с препроцессором не срабатывает в том случае, если скрипт (*.iss) в момент компиляции лежал не в той папке, в которой лежат исходные файлы для компиляции?
-- скорее всего, директивы препроцессора прописаны исходя из расчета, что файлы находятся там же где и сам скрипт. Если меняешь местоположение файлов, то естественно, надо поменять и пути в директивах и командах препроцессора.
Не видя примера, точнее сказать не могу.
Автор: Sandy Ann
Дата сообщения: 16.07.2008 22:21
Genri
Спасибище
А упаковать как-нибудь эти 2 файла в деинсталлятор возможно? Было бы просто офигенно.
Автор: Genri
Дата сообщения: 16.07.2008 22:31
bull3t

Цитата:
скажите, аналог ф-ии StrToInt только для символов.
мне надо чтобы введенное в TEdite слово присваивалось переменной
-- вопрос непонятен. Но судя по твоему предыдущему посту, тебе надо немного другое. На всякий случай - [more=небольшой пример]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[_Code]
var
Page: TInputQueryWizardPage;
UserName, UserPass: String;

procedure InitializeWizard();
begin
Page := CreateInputQueryPage(wpWelcome,
'Personal Information', 'Who are you?',
'Please specify your name and password, then click Next.');
Page.Add('Name:', False);
Page.Add('Password:', True);
Page.Values[0] := ExpandConstant('{sysuserinfoname}');
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = Page.ID then
begin
if (Page.Values[0] <> '') and
(Page.Values[1] <> '') then
begin
UserName:= Page.Values[0];
UserPass:= Page.Values[1];
Result:= True;
end;
end
else Result:= True;
end;
[/more]

Sandy Ann -- нет.


Добавлено:
ShamaN

Цитата:
в моем примере (если бы он работал) один раз определялся бы путь установки, а потом для каждого файла просто подставлялось бы значение
-- логично Тогда так и делай - один раз определяй путь установки, а потом этот путь подставляй для каждого файла [more=Пример]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Files]
Source: "C:\file.txt"; DestDir: {code:iPath}; Flags: ignoreversion
Source: "C:\file1.txt"; DestDir: {code:iPath}; Flags: ignoreversion
;...............
Source: "C:\fileN.txt"; DestDir: {code:iPath}; Flags: ignoreversion

[Code]
var
DestDirPath: String;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
(* супер сложная процедура
получения пути установки,
которая присваивает результат
переменной DestDirPath *)
DestDirPath:= 'C:\TEMP';
end;
end;

function iPath(Param: String): String;
begin
Result:= DestDirPath;
end;
[/more]
Автор: ShamaN
Дата сообщения: 16.07.2008 23:19
Genri
в твоем примере так же для каждого файла будет выполняться функция iPath. На самом деле в ней у меня чтение пути из реестра. В итоге для каждого файла будет несколько чтений реестра... а если файлов тысяча? не нормально это... неужели нельзя никак переменную (не значении функции!!!) из секции [Соde] в секцию [Setup] передать?
Автор: Unc1e
Дата сообщения: 16.07.2008 23:21
Я уже спрашивал, но повторюсь: можно ли на странице установки свернуть окно мастера в системный трей? Нужно примерно следующее: при нажатии на кнопку "Установить" окно мастера скрывается, затем скрывается из панели задач, потом создается иконка в трее. Установка идет как бы в фоновом режиме. При наведении на иконку сплывает подсказка с текущим копируемым файлом. А при нажатии на иконку окно мастера восстанавливается. У кого есть знания, желание помочь и свободное время - жду ваших сообщений!
Автор: Genri
Дата сообщения: 17.07.2008 00:14
ShamaN

Цитата:
В итоге для каждого файла будет несколько чтений реестра
-- внимательно посмотри пример. Только один раз будут считаны данные из реестра (в процедуре CurStepChanged - в начале процесса инсталляции). Полученное значение там же присваивается переменной DestDirPath. И далее, для каждого файла действительно вызывается функция iPath. Но посмотри внимательно, что она делает? Она всего лишь возвращает сохраненное значение DestDirPath. Т.е. больше никаких чтений из реестра.
Автор: boss911
Дата сообщения: 17.07.2008 01:33
Genri

Цитата:
-- скорее всего, директивы препроцессора прописаны исходя из расчета, что файлы находятся там же где и сам скрипт. Если меняешь местоположение файлов, то естественно, надо поменять и пути в директивах и командах препроцессора.
Не видя примера, точнее сказать не могу.

Уже не актуально, но на будущие пригодиться.


Код: [Files]
Source: C:\Pack\Files\*; DestDir: {app}\Files; Flags: recursesubdirs createallsubdirs

[Run]
#define FindHandle
#define FindResult
#define Mask "Files\*.txt"

#sub ProcessFoundFile
#define FileName FindGetFileName(FindHandle)
Filename: {app}\RESHacker.exe; WorkingDir: {app}; Parameters: -script Files\{#FileName}; StatusMsg: {cm:ModSysFiles}
#endsub

#for {FindHandle = FindResult = FindFirst(Mask, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile
Автор: noiseless
Дата сообщения: 17.07.2008 08:43
ShamaN
А такой способ не проще будет?

[Files]
Source: "C:\*.txt"; DestDir: {code:iPath}; Flags: ignoreversion

или в какую-нибудь папку все файлики положить, тогда:

[Files]
Source: "C:\folder\*"; DestDir: {code:iPath}; Flags: ignoreversion


Тем более, процедура присвоения - не такой уж ресурсоемкий процесс
Автор: Genri
Дата сообщения: 17.07.2008 09:25
boss911 -- не совсем так. Все выполняется. В указанном примере, препроцессор ищет текстовые файлы по пути Files\*.txt от текущего (откуда запускается скрипт) - это указано в указано в #define Mask. Т.е. если скрипт в C:\Pack\test.iss то поиск файлов будет в C:\Pack\Files\*.txt. Но если скрипт в C:\test.iss, то поиск файлов будет в C:\Files\*.txt. А их там нет. Так что, как я и говорил, меняешь местоположение скрипта, меняй и относительные пути.

Добавлено:
noiseless -- при большом кол-ве файлов и длительной инсталляции, кроме ресурсоемкости, еще имеет значение потенциальная вероятность того, что в процессе инсталляции, будут изменены считываемые данные. В результате, файлы будут проинсталлированы по разным путям. Так что, в принципе, озабоченность ShamaN данным вопросом, вполне оправдана.
Но при нескольких тысячах файлов, запись конечно, надо делать по твоему варианту.
Автор: bull3t
Дата сообщения: 17.07.2008 12:05
Genri

спасибо большое - пример помог очень.


последний вопрос. подскажи пожалуйста, как сделать так, чтобы это окно ввода(которое в пример), выводилось одним из последних окон в инсталляции и только при выборе определенного компонента установки.
Автор: Genri
Дата сообщения: 17.07.2008 13:08
bull3t

Цитата:
как сделать так, чтобы это окно ввода(которое в пример), выводилось одним из последних окон в инсталляции и только при выборе определенного компонента установки.
-- в функции CreateInputQueryPage, первый параметр определяет, после какой страницы будет отображена созданная. Замени wpWelcome на то что тебе надо и все.
Для определения, выводить или нет страницу, существует функция ShouldSkipPage. В ней можно осуществлять необходимые проверки (проверка выбран или нет компонент, осуществляется функцией IsComponentSelected). Далее пример, в котором страница будет отображена только в случае, если выбран компонент help. [more]
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

[Types]
Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom

[Components]
Name: "program"; Description: "Program Files"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Help File"; Types: full
Name: "readme"; Description: "Readme File"; Types: full
Name: "readme\en"; Description: "English"; Flags: exclusive
Name: "readme\de"; Description: "German"; Flags: exclusive

[_Code]
var
Page: TInputQueryWizardPage;
UserName, UserPass: String;

procedure InitializeWizard();
begin
Page := CreateInputQueryPage(wpSelectComponents,
'Personal Information', 'Who are you?',
'Please specify your name and password, then click Next.');
Page.Add('Name:', False);
Page.Add('Password:', True);
Page.Values[0] := ExpandConstant('{sysuserinfoname}');
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
if CurPageID = Page.ID then
begin
if (Page.Values[0] <> '') and
(Page.Values[1] <> '') then
begin
UserName:= Page.Values[0];
UserPass:= Page.Values[1];
Result:= True;
end;
end
else Result:= True;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = Page.ID) and Not IsComponentSelected('help') then
Result:= True;
end;
[/more]
Автор: Cryzer
Дата сообщения: 17.07.2008 16:31
Всем добрый день!

1) Вот кусок моего [more=кода]procedure CurStepChanged(CurStep: TSetupStep);
var
String: String;
begin
if CurStep = ssInstall then
begin
if (IsComponentSelected('main\config\hkx\current_user') = True) then
begin[/more], выполняющегося при установке.

А вот кусок [more=кода]procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
String: String;
begin
if CurUninstallStep = usUninstall then
begin
if (IsComponentSelected('main\config\hkx\current_user') = True) then
begin[/more], который выполняется при деинсталляции. Но функция IsComponentSelected не работает во втором коде... Появляется сообщение: "Runtime error (at 54:110): Внутренняя ошибка: Cannot call "ISCOMPONENTSELECTED" function during Uninstall." Мне бы хотелось, чтобы во время удаления при определённой выборке компонентов выполнялись определённые операции (как во время установки)... Что делать?

2) Я взял код для смены внешнего вида инсталлятора, отредактировал и получил положительный результат. Всё вроде хорошо, но смущает одна деталь: запускаю => на странице выбора компонентов среди типов (у меня их 6) не выбран не один, т.е. поле пустое. Хотя чуть ниже в самих компонентах отмечены те компоненты, которые отмечаются при выборе 1-ого типа. Как-то некрасиво... Решил проверить, почему такая фигня получается. Нашёл это [more=место]
procedure InitializeWizard();
begin
...
with WizardForm do begin
Position:=poScreenCenter
ClientWidth:=700
ClientHeight:=480
... // и т.д.[/more], во всём виноват "Position:=poScreenCenter". Если его убрать, то на странице компонентов в типах стоит 1-ый тип (как должно быть), а не пустое поле. Но при этом инсталлятор запускается немного не по центру... а хочется по центру Как быть?
Автор: boss911
Дата сообщения: 17.07.2008 18:25
Genri

Цитата:
если скрипт в C:\Pack\test.iss то поиск файлов будет в C:\Pack\Files\*.txt.

Но если инстал компилировался с C:\Pack\test.iss, то в момент его установки файлов и самих путей по C:\Pack\Files\*.txt просто нет, все устанавливается в совсем другую директорию. Что же он там будет искать? Но в таком случае все отлично работает.


Цитата:
Но если скрипт в C:\test.iss, то поиск файлов будет в C:\Files\*.txt.

Я вообще не понимаю, нифига препроцессор их там будет искать, если в коде указан относительный путь #define Mask "Files\*.txt" . Или относительный путь берется от туда, где лежал скрипт в момент компиляции?

Я совсем запутался, если тебе не трудно, да пример скрипта, что препроцессор срабатывал, не зависимо от того, где лежит скрипт в момент компиляции.
Автор: Sampron
Дата сообщения: 17.07.2008 18:58
Cryzer
Попробуй заменить:
Position:=poScreenCenter
на:
Center
Автор: Genri
Дата сообщения: 17.07.2008 19:08
boss911 -- очевидно, проблема в том, что ты не понимаешь принципа работы препроцессора.
Директивы препроцессора, выполняются только! в момент компиляции скрипта. Т.е. в указанном примере, в тот момент, когда ты запускаешь скрипт на компиляцию чтобы получить екзешник, выполняется строка:
#for {FindHandle = FindResult = FindFirst(Mask, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile
...в которой осуществляется поиск файлов, указанных в переменной Mask (в данном случае это Files\*.txt - текстовые файлы в папке Files в текущей директории). Для каждого найденного файла, выполняется процедура ProcessFoundFile. Данная процедура, добавляет в секцию [Run] скрипта строку:
Filename: {app}\RESHacker.exe; WorkingDir: {app}; Parameters: -script Files\{#FileName}; StatusMsg: {cm:ModSysFiles}
...в которой вместо {#FileName} подставляется имя найденного файла.
Если для примера предположить, что в папке Files у тебя находятся три текстовых файла (File1.txt, File2.txt и File3.txt), то в результате секция [Run] приобретет вид:
Filename: {app}\RESHacker.exe; WorkingDir: {app}; Parameters: -script Files\File1.txt; StatusMsg: {cm:ModSysFiles}
Filename: {app}\RESHacker.exe; WorkingDir: {app}; Parameters: -script Files\File2.txt; StatusMsg: {cm:ModSysFiles}
Filename: {app}\RESHacker.exe; WorkingDir: {app}; Parameters: -script Files\File3.txt; StatusMsg: {cm:ModSysFiles}
...и только после этого начнется компиляция екзешника. Абсолютно без разницы - пропишешь ты эти три строки вручную, или их пропишет препроцессор.
Будет найдено 20 файлов - будет 20 таких строк. Не будет найдено ни одного - не будет ни одной (секция [Run] останется пустой). А в момент инсталляции, когда дело дойдет до обработки секции [Run], будет выполнено столько запусков, сколько записей в секции. И если в момент компиляции не было найдено ни одного файла, то и запусков не будет. А все остальное установится как и положено. Еще раз - препроцессор работает не при инсталляции, а при компиляции.
Автор: boss911
Дата сообщения: 17.07.2008 20:11
Genri

Цитата:
Директивы препроцессора, выполняются только! в момент компиляции скрипта. Т.е. в указанном примере, в тот момент, когда ты запускаешь скрипт на компиляцию чтобы получить екзешник, выполняется строка:
#for {FindHandle = FindResult = FindFirst(Mask, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile

Вот теперь я понял, я то думал, что это выполняется в момент инсталляции, идет поиск txt файлов и каждый подставляется в {#FileName}.

В общем я указал прямой путь к исходным файлам, теперь все [more=работает]
Код: [Run]
#define FindHandle
#define FindResult
#define Mask "C:\Pack\Files\*.txt"

#sub ProcessFoundFile
#define FileName FindGetFileName(FindHandle)
Filename: {app}\RESHacker.exe; WorkingDir: {app}; Parameters: -script Files\{#FileName}; StatusMsg: {cm:ModSysFiles}
#endsub

#for {FindHandle = FindResult = FindFirst(Mask, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile
Автор: Sampron
Дата сообщения: 17.07.2008 22:30
boss911

Цитата:
Раньше я задавал вопрос и с сразу ниже получил ответ. Все хорошо, так и нужно, но когда нажимаем на кнопку "Обзор", получаем диалог, где также можно редактировать путь в строке. Как сделать, чтобы и там заблокировать редактирование пути?

Наверно никак разве что править ресурсы, можешь попробовать [more=так]
[_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;
[/more]
Автор: Artem_Butenko
Дата сообщения: 18.07.2008 01:57
Здравствуйте почитатели Inno Setup. Сам я уже как два года изучаю данную инсталляционную систему. Совершенно случайно возник вопрос, можно ли реализовать проигрывание фоновой музыки только в тот момент когда запускается процедура копирования файлов на жесткий диск. Поясняю необходимость подобных действий: использование озвучки клика по кнопке. Если фоновая музыка (особенно высокого качества) начинает играть со страницы приветствия, то озвучка клика по кнопке не слышна, а следовательно вся этетика данного инсталла утрачивается. Искренне надеюсь на Вашу помощь!
Автор: unnameddddd
Дата сообщения: 18.07.2008 02:28
Парни помогите начинающему, чего хочу добится, сам пробовал ничего толком не вышло.
1 Чтобы был виден заголовок окна установки
2 Чтобы мультимидийные кнопки Игра Пауза Стоп
3 Чтобы инсталятор показывал сколько места на дисках (тут в ранних постах речь шла про S.T.A.L.K.E.R сам разобраться не смог)
4 Внизу была ссылка на сайт
5 И чтобы инсталятор все файлы находившиеся в папках оставлял их там, а не выдергивал их и не вставлял все в одну папку нарушая целостность
6 И чтобы папка SAVE не удалялась при деинсталяции
Вот мой скрипт:


; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[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={{19A5A075-AF5F-4F36-8E7F-D09D03B1C9E6}
AppName=Корсары III (Age of Pirates: Carribean Tales)
AppVerName=Корсары 3 v1.5.0
AppPublisher=Akella Games
DisableReadyPage=no
AppPublisherURL=http://www.akella.ru/
AppSupportURL=http://www.akella.ru/
AppUpdatesURL=http://www.akella.ru/
DefaultDirName=C:\Program Files\Akella Games\Корсары 3\
WindowStartMaximized=no
WindowVisible=yes
WindowShowCaption=no
WindowResizable=no
DefaultGroupName=Akella Games\Корсары 3
WizardImageFile=D:\c.bmp
WizardSmallImageFile=D:\2.bmp
OutputDir=D:\Setup
OutputBaseFilename=setup
SetupIconFile=C:\Program Files\Smart Install Maker\Icons\Import\Icon_001.ico
Compression=lzma
; Encryption=yes
SolidCompression=yes

[Languages]
name: russian; MessagesFile: compiler:Languages\Russian.isl

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

[Files]
Source: "C:\sound.wav"; DestDir: "{tmp}"; Flags: dontcopy
Source: "C:\background.bmp"; DestDir: "{tmp}"; Flags: dontcopy
Source: "C:\Program Files\Inno Setup 5.22\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\config.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\ENGINE.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\engine.ini"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\fmodex.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\Manual.pdf"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\options"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\Program.dat"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\protect.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\protect.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\protect.msg"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\Readme.txt"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Downloads\Корсары 3\modules\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\Downloads\Корсары 3\program\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\Downloads\Корсары 3\RESOURCE\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\Downloads\Корсары 3\SAVE\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs uninsneveruninstall

; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: {group}\Настройка Корсары 3; Filename: {app}\Config.exe
Name: {group}\Корсары 3; Filename: {app}\ENGINE.exe
Name: {group}\{cm:UninstallProgram,Корсары 3}; Filename: {uninstallexe}
Name: {commondesktop}\Корсары 3; Filename: {app}\ENGINE.exe; Tasks: desktopicon
Name: {commonstartup}\Корсары 3; Filename: {app}\Engine.exe

[Run]
Filename: {app}\ENGINE.exe; Description: {cm:LaunchProgram,Корсары 3}; Flags: nowait postinstall skipifsilent
Filename: {app}\README.TXT; Description: Прочитать Readme; Flags: postinstall shellexec skipifsilent

[Code]
function sndPlaySound(lpszSoundName: string; uFlags: cardinal):integer;
external 'sndPlaySoundA@winmm.dll stdcall';

function GetSystemMetrics(nIndex:Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';

procedure InitializeWizard();
var
BackgroundBitmapImage: TBitmapImage;
s:string;
width, height:Integer;
bitmap:TBitmap;
begin
ExtractTemporaryFile('background.bmp');
ExtractTemporaryFile('sound.wav');
sndPlaySound(ExpandConstant('{tmp}\sound.wav'), $0001 or $0008);
WizardForm.Position:=poScreenCenter;
MainForm.BORDERSTYLE:=bsNone;
width:=GetSystemMetrics(0);
height:=GetSystemMetrics(1);
MainForm.Width:=width;
MainForm.Height:=height;
width:=MainForm.ClientWidth;
height:=MainForm.ClientHeight;
s:=ExpandConstant('{tmp}')+'\background.bmp';
BackgroundBitmapImage := TBitmapImage.Create(MainForm);
BackgroundBitmapImage.Bitmap.LoadFromFile(s);
BackgroundBitmapImage.Align := alClient;
BackgroundBitmapImage.Parent := MainForm;
BackgroundBitmapImage.Stretch:=True;
MainForm.Visible:=True;
end;

[LangOptions]
LanguageName=Russian
LanguageID=$0419
LanguageCodePage=1251
DialogFontName=Tahoma
DialogFontSize=8
WelcomeFontName=Times new roman
WelcomeFontSize=14
TitleFontName=Arial
TitleFontSize=35
CopyrightFontName=Arial
CopyrightFontSize=8
Автор: nOobCrafter
Дата сообщения: 18.07.2008 12:47
Времени доброго) Возник вопрос, почему при добавлении второй страницы, возникает ошибка типа "Type mismatch"? [more=Вот пример]procedure InitializeWizard();
begin
Page:= CreateInputDirPage(wpSelectTasks, 'Select Backup Location',
'Where should backup files be stored?',
'To continue, click Next.' + #10#13#10#13 +
'If you would like to select a different folder, click Browse.',
False, 'Backup');
Page.Add('');
//Page.Values[0] := ExpandConstant('{sd}\Backup');
Page.Values[0] := AddBackslash(ExpandConstant('{sd}\Backup')) +
GetDateTimeString('yyyy/mm/dd hh:nn', '_', '.' ); // исправлено
end;
begin
Page := CreateInputFilePage(wpSelectTasks,
'Укажите расположение ключа', 'Где находится ключ',
'Выберите расположение ключа, затем нажмите "Далее"')***ругается на это место***;
Page.Add('Select Key File', // caption
'Файлы ключа (key.reg)|*.reg|All Files|*.*', // filters
'.reg');
end; [/more]
Кстати спасибо за выложенное руководство, 90% вопросов отпали)))
Автор: Sampron
Дата сообщения: 18.07.2008 13:32
nOobCrafter
Во первых нужно удалить две строчки:
end;
begin
во вторых у тебя обе страницы под одним названием, переименуй вторую страницу и соотвественно задекларируй.
Автор: SotM
Дата сообщения: 18.07.2008 13:55
unnameddddd
Блин, ты бы свой код в тэг [ more ] загнал чтоли б. В первом посте для кого написано?!
А все остальные вопросы могут отпасть если глянешь в сторону Corona Skin...

Автор: Artem_Butenko
Дата сообщения: 18.07.2008 15:18
Добрый день. У меня вопрос к Виктору Доброву. Corona Skin без сомнений наилучшая надстройка для Inno Setup, но было бы интересней реализовать в ней возможность придания определенного наименования групп копируемых файлов со сходным расширением. Например, чтобы на странице выполнения установки статичный текст "Распаковка" мог сменяться на другой, в зависимости от того, какая группа файлов копируется в данный момент на HDD (к примеру, - "Копирование видеороликов"). Буду надеяться, что Вы, Виктор, примите к сведению мои пожелания!
Автор: nOobCrafter
Дата сообщения: 18.07.2008 15:53
2 Sampron Спасибо заработало))
Кстати, а можешь подсказать как сделать менюшку которая бы появлялась при наличии определенной папки на диске, в которой предлагались бы возможные варианты действий с той папкой, весьма актуальная вещь при установке игрушек, которые уже были удалены, в процессе установке находится папка с сейвами и предлагаются варианты действий, 2-3..? Или где про это можно прочесть?... Ранее видел только примеры для данных реестра(
И еще, народ, можете дать рабочие ссылки на какие нить более менее хорошие скины, а то те что встречались ранее на форуме уже удалены, а корона скин хоть и хорош, но слиииишком уж мудрен для меня %)...

Сегодня что то много вопросов возникло))
[more=Тут]function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID = Page2.ID) and Not IsTaskSelected('bak') then
Result:= True;
Begin
MsgBox('Желательно сделать резервную копию!' ,mbInformation, mb_Ok);
End;
End;[/more] трабла, изза 2х действий табличка выскакивает 2 раза, хз как это отметить, привязка к страницам надо как показывает практика и в тоже время без таска она не имееет смысла((
Автор: Cryzer
Дата сообщения: 18.07.2008 16:44
Sampron, не помогло... :/
Автор: Genri
Дата сообщения: 18.07.2008 17:29
Cryzer

Цитата:
Мне бы хотелось, чтобы во время удаления при определённой выборке компонентов выполнялись определённые операции
-- а у тебя при удалении есть возможность выбора компонентов? И как это реализовано?


Цитата:
во всём виноват "Position:=poScreenCenter".
-- верно. poScreenCenter вызывает пересоздание формы. Добавь после этой строки:
WizardForm.TypesCombo.ItemIndex:= 0;
Но проблемы из-за poScreenCenter так же могут быть и со страницей с лицензией (если ее используешь. Решение в старой ветке.

Автор: Artem_Butenko
Дата сообщения: 18.07.2008 17:57
Ребята, я все с тем же вопросом из предыдущего поста, помогите реализовать в Inno Setup проигрывание фоновой музыки (например, в формате .mp3) только в момент распаковки файлов.
Автор: Genri
Дата сообщения: 18.07.2008 18:00
nOobCrafter

Цитата:
изза 2х действий табличка выскакивает 2 раза
-- попробуй поменять местами строки:
Result:= True;
Begin
Автор: boss911
Дата сообщения: 18.07.2008 18:20
Sampron

Цитата:
можешь попробовать так

Вообще-то то, что нужно, спасибо. Как ты наверно догадался, это нужно для того, чтобы деинсталлятор не натворил беды, если:

Код: [UninstallDelete]
Name: {app}\*; Type: filesandordirs
Автор: serg_aka_lain
Дата сообщения: 18.07.2008 20:07
Artem_Butenko

так [more]

[Files]
Source: "BASS.dll"; DestDir: "{tmp}"; Flags: dontcopy
Source: "soundtrack.mp3"; DestDir: "{tmp}"; Flags: dontcopy


[Code]

const
BASS_SAMPLE_LOOP = 4;

type
HSTREAM = DWORD;

function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';

function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): HSTREAM;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall 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_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';



procedure CurStepChanged(CurStep: TSetupStep);
var
Name1: string;
    i: Integer;
begin
if CurStep = ssInstall then
begin
     ExtractTemporaryFile('bass.dll');
ExtractTemporaryFile('soundtrack.mp3');
if BASS_Init(-1, 44100, 0, 0, 0) then
begin
     BASS_Start();
Name1 := ExpandConstant('{tmp}\soundtrack.mp3');
i := BASS_StreamCreateFile(FALSE, PChar(Name1), 0, 0, 4);
if i <> 0 then
     begin
     BASS_ChannelPlay(i, True);
     end;
     end;
    end;
end;
    
    
procedure DeInitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;

[/more]

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970

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


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