Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


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,

Цитата saurn:
Alloc Пост http://forum.oszone.net/post-1932100-239.html»
касательно процентов установки вот тебе пример лучше
у того примера 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
на английском языке
на русском языке
Это сообщение посчитали полезным следующие участники:

Отправлено: 03:30, 01-04-2013 | #47