ABBAT,
Цитата 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,
Цитата saurn:
по этому самому принципу можно извлечь кол-во необходимого места и из WizardForm.DiskSpaceLabel. Если нет компонентов в инстале.
Так верно? »
|
молоток, всё верно!
saurn,
касательно процентов установки вот тебе пример лучше
у того примера 2 минуса
1. использование необязательной в расширенной версии инно библиотеки innocallback.dll для получения адреса процедуры...
2. использование таймера у которого по умолчанию задержка + он стоит в очередях и задержка может усилиться
для себя уже сделал другой пример, но ещё не выкладывал
принцип такой:
прогрессбар является наследником TWinControl или другим словом он окно, а значит для него действует стандартная оконная функция винды (
http://msdn.microsoft.com/en-us/libr...=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,
Цитата 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
на английском языке
на русском языке