PDA

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [52] 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

nik1967
14-08-2013, 20:08
Shkutu, для этого в Inno есть секция [CustomMessages].[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

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

[CustomMessages]
rus.interface=Интерфейс
rus.choice=Выберите компоненты, которые вы хотите установить.

eng.interface=Interface
eng.choice=Select components which you want to set.

[_Code]
var
Page: TWizardPage;

procedure InitializeWizard;
begin
Page:=CreateCustomPage(wpWelcome, ExpandConstant('{cm:interface}'), ExpandConstant('{cm:choice}'));
end;

Наткнулся на скрипт, который писал неизвестно когда и неизвестно кому :). Может пригодится кому.[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
OutputDir=.

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

[CustomMessages]
rus.ExitSetupTitle1=Вы уверены, что хотите выйти из программы установки?
eng.ExitSetupTitle1=Quit the setup program?

[_code]
const
ID_QUESTION = 65579;

var
MyCoustomExit: TPanel;
YesButton,NoButton: TButton;
IsExit: boolean;
PageNameLabel2,PageDescriptionLabel2: TNewStaticText;
MyExitLabel: TLabel;

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

procedure MyCoustomCancelClick(Sender: TObject; var CanClose: Boolean);
begin
CanClose:= IsExit;
MyCoustomExit.Show;
NoButton.Show;
YesButton.Show;
WizardForm.Bevel.Parent:= MyCoustomExit;
WizardForm.Bevel1.Parent:= MyCoustomExit;
end;

procedure NoButtonClick(Sender: TObject);
begin
IsExit:= false;
MyCoustomExit.Hide;
NoButton.Hide;
YesButton.Hide;
WizardForm.Bevel.Parent:= WizardForm;
WizardForm.Bevel1.Parent:= WizardForm.InnerPage;
end;

procedure YesButtonClick(Sender: TObject);
begin
IsExit:= True;
WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
end;

procedure InitializeWizard();
begin
MyCoustomExit:= TPanel.Create(WizardForm);
with MyCoustomExit do begin
Parent:= WizardForm;
SetBounds(ScaleX(0),ScaleY(0),WizardForm.Width,WizardForm.Height);

with TNewIconImage.Create(WizardForm) do begin
Parent:= MyCoustomExit;
Left:= ScaleX(230);
Top:= ScaleY(85);
Icon.Handle := ID_QUESTION;
end;

PageNameLabel2:= TNewStaticText.Create(MyCoustomExit);
with PageNameLabel2 do begin
Parent:= MyCoustomExit;
SetBounds(WizardForm.PageNameLabel.Left,WizardForm.PageNameLabel.Top,WizardForm.PageNameLabel.Width, WizardForm.PageNameLabel.Height);
Font.Style:= [fsBold];
Caption:= SetupMessage(msgExitSetupTitle);
end;

PageDescriptionLabel2:= TNewStaticText.Create(MyCoustomExit);
with PageDescriptionLabel2 do begin
Parent:= MyCoustomExit;
SetBounds(WizardForm.PageDescriptionLabel.Left,WizardForm.PageDescriptionLabel.Top,WizardForm.PageDe scriptionLabel.Width,WizardForm.PageDescriptionLabel.Height);
Caption:= CustomMessage('ExitSetupTitle1');
end;

MyExitLabel:= TLabel.Create(MyCoustomExit);
with MyExitLabel do begin
Parent:= MyCoustomExit;
SetBounds(ScaleX(0),ScaleY(150),WizardForm.Width,ScaleY(80));
AutoSize:= False;
WordWrap:= True;
Alignment:= taCenter;
Caption:= SetupMessage(msgExitSetupMessage);
end;

NoButton:= TButton.Create(MyCoustomExit);
with NoButton do begin
Parent:= WizardForm;
SetBounds(WizardForm.CancelButton.Left,WizardForm.CancelButton.Top,WizardForm.CancelButton.Width,Wiz ardForm.CancelButton.Height);
Caption:= SetupMessage(msgButtonNo);
OnClick:= @NoButtonClick;
end;

YesButton:= TButton.Create(MyCoustomExit);
with YesButton do begin
Parent:= WizardForm;
SetBounds(WizardForm.NextButton.Left,WizardForm.NextButton.Top,WizardForm.NextButton.Width,WizardFor m.NextButton.Height);
Caption:= SetupMessage(msgButtonYes);
OnClick:= @YesButtonClick;
end;
end;
end;

Procedure CurPageChanged(CurPageID: Integer);
begin
MyCoustomExit.Hide;
NoButton.Hide;
YesButton.Hide;
WizardForm.OnCloseQuery:=@MyCoustomCancelClick;
end;Единственное "но" - при стандартной распаковке при нажатии на "Отмена" не останавливается распаковка.

Johny777
15-08-2013, 00:29
volga163@vk, сделал
[Files]
Source: config.ini; DestDir:{app}; Check: INI_InDestFolder();


[code ]
#define A = (Defined UNICODE) ? "W" : "A"

const
TEST_REG_SUB_KEY = 'Control Panel\My App\Test';
TEST_INI_FILE_NAME = 'config.ini';
TEST_REG_VALUE_NAME = 'ID';
TEST_REG_VALUE = 'ID';

///////////////////////////////////////

const
ERROR_SUCCESS = 0;

STANDARD_RIGHTS_ALL = $001F0000;
KEY_QUERY_VALUE = $0001;
KEY_SET_VALUE = $0002;
KEY_CREATE_SUB_KEY = $0004;
KEY_ENUMERATE_SUB_KEYS = $0008;
KEY_NOTIFY = $0010;
KEY_CREATE_LINK = $0020;
SYNCHRONIZE = $00100000;

KEY_ALL_ACCESS = (STANDARD_RIGHTS_ALL or KEY_QUERY_VALUE or KEY_SET_VALUE or KEY_CREATE_SUB_KEY or KEY_ENUMERATE_SUB_KEYS or KEY_NOTIFY or KEY_CREATE_LINK) and not SYNCHRONIZE;

READ_CONTROL = $00020000;
STANDARD_RIGHTS_READ = READ_CONTROL;

KEY_READ = (STANDARD_RIGHTS_READ or KEY_QUERY_VALUE or KEY_ENUMERATE_SUB_KEYS or KEY_NOTIFY) and not SYNCHRONIZE;

REG_EXPAND_SZ = 2;

SINGLE_CHAR_SIZE = 2;


type
ACCESS_MASK = DWORD;
REGSAM = ACCESS_MASK;
HKEY = LongWord;
Pointer = Longint;
PByte = Pointer;
PDWORD = Pointer;


function RegCreateKeyEx(hKey: HKEY; lpSubKey: String; Reserved: DWORD; lpClass: String; dwOptions: DWORD; samDesired: REGSAM; lpSecurityAttributes: Longint;
var phkResult: HKEY; var lpdwDisposition: DWORD): Longint; external 'RegCreateKeyEx{#A}@advapi32.dll stdcall';
function RegSetValueEx(hKey: HKEY; lpValueName: String; Reserved: DWORD; dwType: DWORD; lpData: Pointer; cbData: DWORD): Longint; external 'RegSetValueEx{#A}@advapi32.dll stdcall';
function RegCloseKey(hKey: HKEY): Longint; external 'RegCloseKey@advapi32.dll stdcall';
function RegOpenKeyEx(hKey: HKEY; lpSubKey: String; ulOptions: DWORD; samDesired: REGSAM; var phkResult: HKEY): Longint; external 'RegOpenKeyEx{#A}@advapi32.dll stdcall';
function RegQueryValueEx(hKey: HKEY; lpValueName: String; lpReserved: Pointer; lpType: PDWORD; lpData: PByte; lpcbData: PDWORD): Longint; external 'RegQueryValueEx{#A}@advapi32.dll stdcall';


function CreateRegKey(const hKey: HKEY; const lpSubKey: String; out phkResult: HKEY): Boolean; // phkResult - хэндл открытого ключа. Нам он пригодится
var
lpdwDisposition: DWORD;
begin
Result := RegCreateKeyEx(hKey, lpSubKey, 0, '', 0, KEY_ALL_ACCESS, 0, phkResult, lpdwDisposition) = ERROR_SUCCESS;
end;


function hSetRegExpandStringValue(const hKeyOpened: HKEY; const ValueName, Value: String): Boolean; // сюда в hKeyOpened отправляем открытый хэндл, чтоб не открывать новый
begin
Result := RegSetValueEx(hKeyOpened, ValueName, 0, REG_EXPAND_SZ, CastStringToInteger(Value), (Length(Value) + 1) * SINGLE_CHAR_SIZE) = ERROR_SUCCESS;
end;


function WinApi_RegKeyExists(const hKey: HKEY; const lpSubKey: String): Boolean;
var
phkResult: HKEY;
begin
Result := RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ, phkResult) = ERROR_SUCCESS;
if Result then RegCloseKey(phkResult);
end;


function WinApi_RegKeyValueExists(const hKey: HKEY; const lpSubKey, lpValueName: String): Boolean;
var
phkResult: HKEY;
begin
if RegOpenKeyEx(hKey, lpSubKey, 0, KEY_READ, phkResult) = ERROR_SUCCESS then
try
Result := RegQueryValueEx(phkResult, lpValueName, 0, 0, 0, 0) = ERROR_SUCCESS;
finally
RegCloseKey(phkResult);
end;
end;


function INI_InDestFolder(): Boolean;
var
hKeyOpened: DWORD;
begin
Result := not FileExists( AddBackslash( ExpandConstant('{app}') ) + TEST_INI_FILE_NAME ); // файл будет установлен, если его нет в директории установки

// если нет ветки Control Panel\My App\Test' (убрал под константу TEST_REG_SUB_KEY), в разделе HKEY_CURRENT_USER то создаём её
if not WinApi_RegKeyExists(HKEY_CURRENT_USER, TEST_REG_SUB_KEY) then
begin
CreateRegKey(HKEY_CURRENT_USER, TEST_REG_SUB_KEY, hKeyOpened); // создаём ветку
hSetRegExpandStringValue(hKeyOpened, TEST_REG_VALUE_NAME, TEST_REG_VALUE); // те ветки не было то не было и ключа, создаём и его
end else // в противном случае если ветка есль, то проверям наличие там ключа
if not WinApi_RegKeyValueExists(HKEY_CURRENT_USER, TEST_REG_SUB_KEY, TEST_REG_VALUE_NAME) then //если ключа нет
Result := hSetRegExpandStringValue(hKeyOpened, TEST_REG_VALUE_NAME, TEST_REG_VALUE); // то создаём его
end;



работа с реестром здесь на чистом WinApi (!)

Тестируй! :)

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

nik1967, файл иконки необязательно таскать с собой. Её можно брать у винды. Посмотри в примере "Создание кастомного диалогового окна", в шапке.

tr011_tmn
15-08-2013, 07:54
верно, слетит только папка Redist с её содержимым »

проверил работает на ура, спасибо огромное.

Задачка на логику по работе с SelectComponent. Помогите решить, а то сам даже не знаю как подступиться.

Инсталлятор у меня включает 12 компонентов видимых пользователю, на его выбор, 2 из них под флагом Fixed, остальные по желанию пользователя. Но есть важный нюанс. При выборе более трех компонентов по выбору требуется что бы независимо от желания пользователя в папку {app} копировался специальный набор файлов. оптимизирующий работу этих выбранных компонентов.

Если на пальцах то:

при установке только компонентов с флагом Fixed: не копируем
при установке компонентов с флагом Fixed + 1-2 компонента по выбору: не копируем
при установке компонентов с флагом Fixed + 3 и более компонентов: копируем

Заранее благодарен за помощь

jiumx60rus
15-08-2013, 09:00
Есть проблема: установка с параметрами silent и verysilent не работает (видимо из-за прочих плюшек во время установки). Можно ли как-то решить эту проблему (установить в тихом режиме)? Спасибо.

nik1967
15-08-2013, 11:09
Johny777, благодарю! От иконки избавился, скрипт переписал. Оказалось ещё, что на ANSI не отображается бевел на панели выхода - исправил. Хотя сам пользуюсь UNICODE версией Inno.

icq99999999
15-08-2013, 17:05
Код: »
а с помощью какой команды скрыть все окна инстала ?

insombia
15-08-2013, 18:19
icq99999999,
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID =wpSelectComponents) or (PageID =wpSelectProgramGroup) or (PageID =wpready) or (PageID =wpfinished) then
Result:= True;
end;
или
[setup]
DisableDirPage = yes
и т д

insombia
15-08-2013, 19:24
icq99999999
procedure InitializeWizard();
begin
wizardform.WelcomeLabel1.hide;
и т д, можно ещё вообще все скрыть со страницы,если хочешь создать свою страницу

procedure InitializeWizard();
begin
with WizardForm do begin
InnerNotebook.Hide;
OuterNotebook.Hide;
Bevel.Hide;
end;

icq99999999
15-08-2013, 21:29
function ShouldSkipPage(PageID: Integer): Boolean;
begin
if (PageID =wpSelectComponents) or (PageID =wpSelectProgramGroup) or (PageID =wpready) or (PageID =wpfinished) then
Result:= True;
end; »
что то не получается данный код скрывает только последние страницы а мне нужно чтоб был тихий установщик

insombia
15-08-2013, 21:52
icq99999999 гугл помогает на ура,вот например,если что ищи ещё там
http://forum.ru-board.com/topic.cgi?forum=5&topic=24767&start=1520

icq99999999
15-08-2013, 23:50
переписал, изучай: »
в переписанном вами коде отсутствует самая важная для меня часть
"весь процесс должен быть полностью скрыт от глаз пользователя"

Shkutu
16-08-2013, 12:17
nik1967, спасибо!:) Да, думаю это то, что надо)

Johny777
16-08-2013, 12:23
в переписанном вами коде отсутствует самая важная для меня часть
"весь процесс должен быть полностью скрыт от глаз пользователя" »


теперь присутствует
обновил код http://forum.oszone.net/post-2200990-1009.html

nik1967
16-08-2013, 12:24
отмена так и не работает во время установки? »Почему? Отмена то работает, не ставиться на паузу при стандартной установке при нажатии на отмену. Потому, что по умолчанию, при нажатии на отмену и появлении всплывающего сообщения(бла-бла, да, нет) визард форм становиться заблокированным(enabled:= false), что и является паузой, ну а в моём примере - нет.

icq99999999
17-08-2013, 09:23
вопрос
можно ли отключить создание деинсталлятора ?

Mailchik
17-08-2013, 09:49
icq99999999, [Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
Uninstallable=no

nik1967
17-08-2013, 10:34
icq99999999, [Setup]: Uninstallable
Valid values:
yes or no, or a boolean expression
Default value:
yes

Description:
This determines if Inno Setup's automatic uninstaller is to be included in the installation. If this is yes or to a boolean expression evaluating to True the uninstaller is included. Otherwise, no uninstallation support is included, requiring the end-user to manually remove the files pertaining to your application.

Setting this to a boolean expression can be useful if you want to offer the user a 'portable mode' option.

Example:
[Setup]
Uninstallable=not IsTaskSelected('portablemode')

[Tasks]
Name: portablemode; Description: "Portable Mode"

icq99999999
17-08-2013, 11:14
Цитата nik1967:
Как бы справку нужно хоть иногда смотреть! »
я смотрел, но там указано только как отключить для компонента, а мне нужно было полностью убрать при компиляции

volga163@vk
17-08-2013, 20:56
Johny777, Спасибо большое!

tr011_tmn
19-08-2013, 15:35
Всем доброго дня.

подскажите можно ли добавить скролл с стандартному WizardForm.ComponentsList? нигде не могу найти информацию как вернуть его обратно после изменения стандартного размера.




© OSzone.net 2001-2012