Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 6]
audiofeel, можно создать бевел и внутри него разместить лейбл, чтобы получилась обводка. Я бы оставил так, но это дело вкуса. С таск листом наверное можно что-то сделать, но я незнаю как - с оформлением инсталов я на "вы", больше предпочитаю стандартный спартанский интерфейс.
saurn, в тегах кода скрипта используй [Code] начальная жирная квадратная скобка и не будет конфликты с тегом и прочих символов перед словом Code.
Всем привет. Помогите пожалуйста с кодом. Нужно внести ключ в реестр в зависимости от разрешения экрана, если FullHD и выше то ключ один, если ниже то ключ другой.
Crazy Noise
31-03-2013, 13:32
saurn, скажи те вот а чтобы оное обвести (рамка) придется бевел создавать »
Вот на скорую руку накидал:
[*Code]
var
GroupBox_DirPage: TNewGroupBox;
procedure InitializeWizard();
begin
GroupBox_DirPage := TNewGroupBox.Create(WizardForm);
GroupBox_DirPage.Parent := WizardForm.SelectDirPage;
GroupBox_DirPage.Left := ScaleX(0);
GroupBox_DirPage.Top := ScaleY(0);
GroupBox_DirPage.Width := ScaleX(416);
GroupBox_DirPage. Height := ScaleY(140);
GroupBox_DirPage.Caption := 'Папка установки';
WizardForm.SelectDirBitmapImage.Left := ScaleX(10);
WizardForm.SelectDirBitmapImage.Top := ScaleY(20);
WizardForm.SelectDirBitmapImage.Parent := GroupBox_DirPage;
WizardForm.SelectDirLabel.Left := ScaleX(54);
WizardForm.SelectDirLabel.Top := ScaleY(20);
WizardForm.SelectDirLabel.Width := ScaleX(300);
WizardForm.SelectDirLabel.Parent := GroupBox_DirPage;
WizardForm.SelectDirBrowseLabel.Left := ScaleX(10);
WizardForm.SelectDirBrowseLabel.Top := ScaleY(54);
WizardForm.SelectDirBrowseLabel.Width := ScaleX(405);
WizardForm.SelectDirBrowseLabel.Parent := GroupBox_DirPage;
WizardForm.DirEdit.Left := ScaleX(10);
WizardForm.DirEdit.Top := ScaleY(87);
WizardForm.DirEdit.Width := ScaleX(317);
WizardForm.DirEdit.Parent := GroupBox_DirPage;
WizardForm.DirBrowseButton.Left := ScaleX(332);
WizardForm.DirBrowseButton.Top := ScaleY(86);
WizardForm.DirBrowseButton.Parent := GroupBox_DirPage;
WizardForm.DiskSpaceLabel.Left := ScaleX(10);
WizardForm.DiskSpaceLabel.Top := ScaleY(116);
WizardForm.DiskSpaceLabel.Width := ScaleX(405);
WizardForm.DiskSpaceLabel.Parent := GroupBox_DirPage;
end;
Lex_from_Belarus
31-03-2013, 14:23
Подскажите пожалуйста как лучше организовать инсталлер:
имеется 3 вида компонентов:
компоненты №1 - это компоненты, которые не много занимают места и часто обновляются;
компоненты №2 - это компоненты, которые много занимают и редко обновляются;
компоненты №3 - это компоненты, которые не сильно много места, но больше чем компоненты №1 и не обновляются вообще, ну т.е. устанавливаются только 1 раз в принципе.
Из этого следует, что рационально бы их все устанавливать раздельно, т.е. сделать 3 разных инсталла и обновлять по отдельности, но хочется сделать 1 общий инсталл на всё и в зависимости от того есть ли с инсталлером определённый файл содержащий компонент №1, №2 или №3, предлагало к установке соответствующие компоненты в окне выборов компонентов, т.е. глубо говоря структура была бы такой:
Install.exe - сам установщик
xxx1.xxx - файл с компонентами №1
xxx2.xxx - файл с компонентами №2
xxx3.xxx - файл с компонентами №3
и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?
habib2302 спасибо за скрипт dead-space-2-fenixx-ot-vasyakrn.7z . Именно єто я искал !!!
Johny777
01-04-2013, 03:30
ABBAT,
Нужно внести ключ в реестр в зависимости от разрешения экрана, если FullHD и выше то ключ один, если ниже то ключ другой. »
используй методы Width и Height класса TScreen
пример только через код:
procedure InitializeWizard();
begin
if (Screen.Width >= 1920) and (Screen.Height >= 1080) then RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'Alpha', '1')
else RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'ShowName', '0');
end;
или так, если используешь секцию [Registry]:
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
[Registry]
// будет внесён если не фулл хд
Root: HKCU; Subkey: "Software\Valve"; ValueType: String; Flags: uninsdeletevalue uninsdeletekeyifempty; Check: not FullHD_or_Higher();
// будет внесён если фулл хд или выше
Root: HKLM; Subkey: "SOFTWARE\Bethesda Softworks\Skyrim"; ValueName: "Installed Path"; ValueType: String; ValueData: "{app}\"; Flags: uninsdeletevalue uninsdeletekeyifempty; Check: FullHD_or_Higher();
[code]
function FullHD_or_Higher(): Boolean;
begin
Result := (Screen.Width >= 1920) and (Screen.Height >= 1080);
end;
можно и через функцию WinApi GetDeviceCaps(...)
пример:
const
HORZRES = 8; // Horizontal width in pixels
VERTRES = 10; // Vertical height in pixels
type
HDC = LongWord;
function GetDeviceCaps(DC: HDC; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function GetDC(hWnd: HWND): HDC; external 'GetDC@user32.dll stdcall';
function ReleaseDC(hWnd: HWND; hDC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';
procedure InitializeWizard();
var
uHDC: HDC;
begin
uHDC := GetDC(0);
try
if (GetDeviceCaps(uHDC, HORZRES) >= 1920) and (GetDeviceCaps(uHDC, VERTRES) >= 1080) then RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'Alpha', '1')
else RegWriteStringValue(HKCU, 'Software\Serbis\SBSlideShow', 'ShowName', '0');
finally
ReleaseDC(0, uHDC);
end;
end;
==========================================================
saurn, по этому самому принципу можно извлечь кол-во необходимого места и из WizardForm.DiskSpaceLabel. Если нет компонентов в инстале.
Так верно? »
молоток, всё верно! :)
saurn,
Alloc Пост http://forum.oszone.net/post-1932100-239.html»
касательно процентов установки вот тебе пример лучше
у того примера 2 минуса
1. использование необязательной в расширенной версии инно библиотеки innocallback.dll для получения адреса процедуры...
2. использование таймера у которого по умолчанию задержка + он стоит в очередях и задержка может усилиться
для себя уже сделал другой пример, но ещё не выкладывал
принцип такой:
прогрессбар является наследником TWinControl или другим словом он окно, а значит для него действует стандартная оконная функция винды (http://msdn.microsoft.com/en-us/library/windows/desktop/ms633572%28v=vs.85%29.aspx) ,
как и для всех остальных окон (форма, статик текст и прочие наследники)
но в инно мы к ней по дефоту доступа не имеем и поэтому установим ему свою такую же функцию
дело в том что окно получает сообщения и поле того как оно пройдёт (если пройдёт, тк мы если можем их получать можем и обнулять и прочее) будет выполнен код для этого сообщения (закрыть окно, свернуть, отрисовать нажатие кнопки...) и прогрессбар каждый раз перед отрисовкой новой позиции получает сообщение PBM_SETPOS и именно в этот момент мы можем обновлять проценты перед тем как сообщение пойдёт дальше
пример:
[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
WM_USER = $0400;
CCM_FIRST = $2000;
CCM_SETBKCOLOR = CCM_FIRST + 1;
PBS_SMOOTH = 01;
PBS_VERTICAL = 04;
PBM_SETRANGE = WM_USER+1;
PBM_SETPOS = WM_USER+2;
PBM_DELTAPOS = WM_USER+3;
PBM_SETSTEP = WM_USER+4;
PBM_STEPIT = WM_USER+5;
PBM_SETRANGE32 = WM_USER+6; // lParam = high, wParam = low
PBM_GETRANGE = WM_USER+7; // lParam = PPBRange or Nil
// wParam = False: Result = high
// wParam = True: Result = low
PBM_GETPOS = WM_USER+8;
PBM_SETBARCOLOR = WM_USER+9; // lParam = bar color
PBM_SETBKCOLOR = CCM_SETBKCOLOR; // lParam = bkColor
{ For Windows >= XP }
PBS_MARQUEE = $08;
PBM_SETMARQUEE = WM_USER+10;
{ For Windows >= Vista }
PBS_SMOOTHREVERSE = $10;
{ For Windows >= Vista }
PBM_GETSTEP = WM_USER+13;
PBM_GETBKCOLOR = WM_USER+14;
PBM_GETBARCOLOR = WM_USER+15;
PBM_SETSTATE = WM_USER+16; { wParam = PBST_[State] (NORMAL, ERROR, PAUSED) }
PBM_GETSTATE = WM_USER+17;
{ For Windows >= Vista }
PBST_NORMAL = $0001;
PBST_ERROR = $0002;
PBST_PAUSED = $0003;
GWL_WNDPROC = -4;
type
LPARAM = Integer;
WPARAM = Integer;
LRESULT = Integer;
TFNWndProc = Integer;
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';
var
OldProgressBarProc: Longint;
function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
if Msg = PBM_SETPOS then with WizardForm.ProgressGauge do WizardForm.Caption := FormatFloat('0.#0 %', (Position*100)/Max);
Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;
procedure InitializeWizard();
begin
OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
end;
procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;
=======================================================================
Lex_from_Belarus, но хочется сделать 1 общий инсталл на всё и в зависимости от того есть ли с инсталлером определённый файл содержащий компонент №1, №2 или №3, предлагало к установке соответствующие компоненты в окне выборов компонентов »
можно конечно, только сделал проще - не три разных файла с компонентами а один в котором столбиком(обязательно для первой функции, которая закоментирована) или просто перечислены компоненты, те если имя компонента есть в файле, то он будет добален в чеклистбокс, если нет то пропущен
вот пример из двух функций (вторая, которая не закомментирована работает быстрее, но в познавательных целях оставил первую (у меня какая-то странная тяга к массивам и первая на их основе :) ))
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
SolidCompression=yes
Compression=lzma/ultra
[Components]
Name: A; Description: The Elder Scrolls V - Skyrim; Types: full custom; Flags: disablenouninstallwarning checkablealone fixed; Check: InExternalTextFile('The Elder Scrolls V - Skyrim');
Name: B; Description: на английском языке; Types: full; Flags: exclusive disablenouninstallwarning; Check: InExternalTextFile('на английском языке');
Name: C; Description: на русском языке; Types: full; Flags: exclusive disablenouninstallwarning; Check: InExternalTextFile('на русском языке');
Name: FF; Description: Visual C++ 2010 (x86) (необходим для запуска приложения); Types: full; Flags: dontinheritcheck disablenouninstallwarning; Check: InExternalTextFile('Visual C++ 2010 (x86) (необходим для запуска приложения)');
Name: HL; Description: DirectX; Types: full; Flags: dontinheritcheck disablenouninstallwarning; Check: InExternalTextFile('DirectX');
[Code]
//var
// Buff: array of String;
//
//function InExternalTextFile(const SearchName: String): Boolean;
//var
// i: Integer;
//begin
// if GetArrayLength(Buff) = 0 then if LoadStringsFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff) then
// for i := 0 to GetArrayLength(Buff)-1 do
// begin
// Result := Buff[i] = SearchName;
// if Result then Break;
// end;
//end;
var
Buff: String;
function InExternalTextFile(const SearchName: String): Boolean;
begin
if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
Result := Pos(SearchName, Buff) > 0;
end;
для этого примера положи рядом с экзешником инсталла текстовый файл Install.txt содержащий:
The Elder Scrolls V - Skyrim
на английском языке
на русском языке
Lex_from_Belarus, а я сделал сложнее (наверное, хотя для меня этот вариант проще). В зависимости от нахождения файла рядом (ну или ещё где - путь задаётся в шапке скрипта) с инсталлятором будет отображаться компонент (ну или не будет). If components exist (http://rghost.ru/44939722)и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?Воспользуйся паролем на архив при сжатии.
Johny777, Большое спасибо дружище за примеры (GetDeviceCaps по моему более элегантна)
Ещё вопрос, можно убрать иконку инсталятора с панели задач (не критично просто интересно кто нибудь слышал о током)
Crazy Noise
01-04-2013, 10:22
alert30, Можно и проще.
Посто скопировать в редакторе как UBB-код
http://imageshack.us/scaled/thumb/407/ubb.png (http://imageshack.us/photo/my-images/407/ubb.png/)
получется вот так
[Setup]
AppName=My Program
AppVersion=1.5
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
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\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion
[Icons]
Name: {group}\My Program; Filename: {app}\MyProg.exe
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}
Name: {commondesktop}\My Program; Filename: {app}\MyProg.exe; Tasks: desktopicon
[Run]
Filename: {app}\MyProg.exe; Description: {cm:LaunchProgram,My Program}; Flags: nowait postinstall skipifsilent
Crazy Noise, я говорю о секциях , о копировании через UBB уже и так давно знаю (это уже не по теме).
А у Вас секция [Code] нету.
Лучше Всем расскажу:
[CODE][Code]
begin
end.
[*Code]
begin
end.
[Code]
begin
end.
Lex_from_Belarus
01-04-2013, 15:09
можно конечно, только сделал проще - не три разных файла с компонентами а один в котором столбиком(обязательно для первой функции, которая закоментирована) или просто перечислены компоненты, те если имя компонента есть в файле, то он будет добален в чеклистбокс, если нет то пропущен
вот пример из двух функций (вторая, которая не закомментирована работает быстрее, но в познавательных целях оставил первую (у меня какая-то странная тяга к массивам и первая на их основе )) »
так тут смысл в том, чтобы уменьшить скачиваемый инсталл с наиболее частыми обновляемыми файлами.
Crazy Noise
01-04-2013, 15:57
alert30, Вижу не часто попадалось.
При применении BB таким образом, очень легко ошибиться и не заметить
[]Code]
var
Buff: String;
function InExternalTextFile(const SearchName: String): Boolean;
begin
if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
Result := Pos(SearchName, Buff) > 0;
end;
А у Вас секция [code] нету. »Смысл и так понятен, там не только код но и весь скрипт.
Кто-то запрещает использовать http://forum.oszone.net/images/editor/html.gif или http://forum.oszone.net/images/editor/php.gif ?
[Code]
var
Buff: String;
function InExternalTextFile(const SearchName: String): Boolean;
begin
if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
Result := Pos(SearchName, Buff) > 0;
end;
[Code]
var
Buff: String;
function InExternalTextFile(const SearchName: String): Boolean;
begin
if Buff = '' then LoadStringFromFile(AddBackslash(ExpandConstant('{src}')) + 'Install.txt', Buff);
Result := Pos(SearchName, Buff) > 0;
end;
И ничего не нужно подставлять или изобретать!
Lex_from_Belarus
01-04-2013, 16:14
Lex_from_Belarus, а я сделал сложнее (наверное, хотя для меня этот вариант проще). В зависимости от нахождения файла рядом (ну или ещё где - путь задаётся в шапке скрипта) с инсталлятором будет отображаться компонент (ну или не будет). If components exist
Цитата:
и чтобы xxx1-3.xxx не были просто архивами, чтобы их отдельно нельзя было распаковать. можно ли реализовать такое?
Воспользуйся паролем на архив при сжатии. »
что-то я наверное туплю наверное, но в каждом архиве находится от 2 до 30 компонетов и наверное этот метод не прокатит?
Crazy Noise, ну это Ваше дело. Тег [CODE] и его закрытия тега я привык вставлять.
habib2302
01-04-2013, 19:41
Доброе время суток.Как сделаль (добавить) в инсталлятор и деинсталлятор Wizard Small Image и Wizard Image без фона?
Johny777
02-04-2013, 20:09
habib2302, .Как сделаль (добавить) в инсталлятор и деинсталлятор Wizard Small Image и Wizard Image без фона? »
Использовать ботву (botva2.dll от South) для прозрачных картинок, но тк тебе ещё и для деинсталятора, то проще всего запихать картинки и библиотеку в ресурсы (в экзешник) и грузить оттуда
Важно: в соглашении вызова импортируемых из библы функциий указать delayload (вроде как стоит по дефолту)
код(целых 87 строк :) ):
#include "botva2.iss"
[Setup]
AppName=DrawImageExample by South.Tver
AppVerName=DrawImageExample by South.Tver
DefaultDirName={pf}\ImageExample
OutputBaseFilename=setup
RawDataResource=Botva:botva2.dll|bPic:bPic.png|LiPic:LiPic.png|aPic:aPic.png
[Code]
const
AXEL_YELLOW = $48c1ca;
RT_RCDATA = 10;
function GetFromRes(const ResName, SaveFileName: String): Boolean;
var
lResStream: TResourceStream;
begin
lResStream := TResourceStream.Create(HInstance, ResName, RT_RCDATA);
try
lResStream.SaveToFile(ExpandConstant('{tmp}\') + SaveFileName);
finally
lResStream.Free;
Result := FileExists(ExpandConstant('{tmp}\') + SaveFileName);
end;
end;
procedure InitializeWizard;
var
bPicHandle, bPicHandle2, lPicHandle: THandle;
begin
with WizardForm do
begin
WelcomePage.Color := AXEL_YELLOW;
MainPanel.Color := AXEL_YELLOW;
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_BPIC', 'bPic.png') and GetFromRes('_IS_LIPIC', 'LiPic.png') and GetFromRes('_IS_APIC', 'aPic.png') then
begin
bPicHandle := ImgLoad(WelcomePage.Handle, ExpandConstant('{tmp}\aPic.png'), WizardBitmapImage.Left, WizardBitmapImage.Top, WizardBitmapImage.Width, WizardBitmapImage.Height, True, True);
WizardBitmapImage.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(WelcomePage.Handle);
bPicHandle := ImgLoad(FinishedPage.Handle, ExpandConstant('{tmp}\bPic.png'), WizardBitmapImage2.Left, WizardBitmapImage2.Top, WizardBitmapImage2.Width, WizardBitmapImage2.Height, True, True);
WizardBitmapImage2.Hide;
ImgSetVisibility(bPicHandle, True);
ImgApplyChanges(FinishedPage.Handle);
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;
procedure DeinitializeSetup();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown();
end;
/////////////////////////////////////////////////////////////////////
procedure InitializeUninstallProgressForm();
var
lPicHandle: THandle;
begin
with UninstallProgressForm do
begin
MainPanel.Color := AXEL_YELLOW;
if GetFromRes('_IS_BOTVA', 'botva2.dll') and GetFromRes('_IS_LIPIC', 'LIPic.png') then
begin
lPicHandle := ImgLoad(MainPanel.Handle, ExpandConstant('{tmp}\LiPic.png'), WizardSmallBitmapImage.Left, WizardSmallBitmapImage.Top, WizardSmallBitmapImage.Width, WizardSmallBitmapImage.Height, True, True);
WizardSmallBitmapImage.Hide;
ImgSetVisibility(lPicHandle, True);
ImgApplyChanges(MainPanel.Handle);
end;
end;
end;
procedure DeinitializeUninstall();
begin
if FileExists(ExpandConstant('{tmp}\') + 'botva2.dll') then gdipShutDown();
end;
скрин:
http://img811.imageshack.us/img811/6926/18189759.png (http://imageshack.us/photo/my-images/811/18189759.png/)
архив с примером и со всем необходимым:
http://sendfile.su/788305
PS: для себя я бы не выносил загрузку ресурсов в функцию function GetFromRes(const ResName, SaveFileName: String): Boolean; с точки зрения оптимизации скорости работы
но думаю так будет проще понять что к чему. Потом поменяешь, если захочешь!
Gnom_aka_Lexander
02-04-2013, 20:28
для себя я бы не выносил загрузку ресурсов в функцию function GetFromRes(const ResName, SaveFileName: String): Boolean; с точки зрения оптимизации скорости работы »
наоборот. несколько мелких функций гораздо оптимальнее одного здоровенного уродливого монстра. единственное, для дополнительной оптимизации есь смысл передавать TStrings со списком ресурсов , дабы не создавать для каждого ресурса отдельный объект TResourceStream. Создали и в цикле по списку выгружаем на диск, с очисткой после выгрузки. Это точно будет быстрее, чем столько-же раз создать и разрушить объект.
habib2302
02-04-2013, 21:14
Johny777, а почему в скрипте указанно 3 изображения?
Gnom_aka_Lexander
02-04-2013, 21:45
habib2302, потому, что изображения на первой и на последней страницах - это разные объекты. плюс смалл имидж - 3 ведь получается?
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.