Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 5]
Habetdin
27-07-2012, 23:24
TEKTON, по аналогии с примером из поста #501 - #include не обязан быть в секциях, будь то [code] или [files] ;[
Ок.
Сейчас прописал в самом верху скрипта до секции [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
[ISPP] Undeclared identifier: "Processor". »
Ему не хватает строк типа этого:
#define System "Система"
#define Processor "Процессор"
#define VideoCard "Видеоадаптер"
#define Audio "Звуковая карта"
#define RamMemory "Объём памяти"
#define PageFile "Файл подкачки"
P.S.: 4 поста, начиная с #152 (http://krinkels.org/showthread.php?p=8930#post8930) ;)
Смотрел я уже ту шляпу.
Парень бился бился с ошибками, потом ему втюхали какую то get_hw_caps.dll.
На этом всё и кончилось... :(
Можете нормальный пример сделать из двух скриптов?
Чтоб один подключался ко второму.
p.s. Я тоже рою нет, но пока чёткого и конкретного ответа не нашёл.
Fanat1990
28-07-2012, 16:12
Парень бился бился с ошибками, потом ему втюхали какую то get_hw_caps.dll. »
это не какая-то get_hw_caps.dll! Авторы этой dll GSC Game World. Она используется в инсталлах сталкера, для проверки требований....
Вылетает ошибка »
Потому как сначала нужно указать мин. требования, а потом уже скрипт подключать.
#define System "Система"
#define Processor "Процессор"
#define VideoCard "Видеоадаптер"
#define Audio "Звуковая карта"
#define RamMemory "Объём памяти"
#define PageFile "Файл подкачки"
#include "SYSTEST\SystemTest.iss"
[Setup]
....
Yury_Prizrak
30-07-2012, 13:09
первый вообще не понял (код-кусок для наглядности предоставь(если смогу понять - помогу), а то какие-то конфиги, формы...) »
Попробую более подробно. В устанавливаемой программе есть 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;
но есть одно но - у меня этих переменных штук этак дофига, и код становится очень нечитабельным и большим. Вот в этом и сложность :)
всем привет , скажите как мне сделать чтобы страница создания ярлыков появилась после установки игры или программы ???????????77
Johny777
30-07-2012, 18:27
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 если надо
Mafioza, вроде в оригинальном компиляторе Inno Setup есть чекбокс "Создать ярлык на Рабочем столе"?
alert30 да я зная , я хочу чтобы страница ярлыков была после страницы распаковки фалов , до страницы завершения установки , ка у InstallShield
Johny777
31-07-2012, 01:09
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
ребят подскажите пожалуйста как текстурировать кнопку "отмена" на странице установки в ISDone0.6
ну или пример посоветуйте
Johny777
31-07-2012, 14:01
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;
пробуй
wertulll
31-07-2012, 14:40
Johny777,
при запуске инстала вот такая беда
wertulll
31-07-2012, 15:06
вот полный скрипт http://narod.ru/disk/58549635001.0ec6f5078d9a3f97f25382b967eed393/%D0%A1%D0%BA%D1%80%D0%B8%D0%BF%D1%82.rar.html
wertulll
31-07-2012, 15:27
я просто чистый скрипт дал не прописывал то что ты мне страницу назад писал :) нужно это прописать и будет ошибка
Johny777
31-07-2012, 16:27
wertulll,
исправил, но перписывать код не осилил
очень много путаницы
wertulll
31-07-2012, 16:46
очень много путаницы » и лишнего наверное много? :)
а за кнопку спасиб большой !!!малёха цифры подправил и вобще чётко встала
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.