Показать полную графическую версию : [архив] Inno Setup .:[все вопросы]:.
Serega,
Спасибо то что нужно!!! :yes:
Мне в PM задали вопрос, решил написать его здесь, т.к. другим может быть интересен ответ на этот вопрос...
Не знаете ли вы, как можно сделать окно "исталлятора" передвигаемым при выполнение, например этого?:
Exec(ExpandConstant('{tmp}\arc.exe'), 'x '+AddQuotes(ExpandConstant('{app}\data.arc'))+' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewWaitUntilTerminated, Res);
Нужно в скрипте написать функцию ожидания, здесь поможет ISTask.dll (http://www.forum.oszone.ru/attachment.php?attachmentid=24147&d=1238669557).
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Files]
Source: compiler:Libraries\ISTask.dll; Flags: dontcopy
[Code]
type
_TMsg = record
hwnd: HWND;
message: LongWord;
wParam: Longint;
lParam: Longint;
time: LongWord;
pt: TPoint;
end;
const
PM_REMOVE = 1;
// пpовеpяет очеpедь пpикладной задачи на сообщение и копиpует его в Msg,
// если в очеpеди нет сообщений, функция выполняет немедленный возвpат и пеpедает упpавление Windows.
function PeekMessage(var lpMsg: _TMsg; hWnd: HWND;
wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
// пеpеводит комбинации wm_KeyDown/Up в wm_Char или wm_DeadChar и комбинации wm_SysKeyDown/Up в wm_SysChar или
// wm_SysDeadChar и напpавляет символьное сообщение в очеpедь пpикладной задачи.
function TranslateMessage(const lpMsg: _TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
// пеpедает в Msg сообщение оконной функции окна
function DispatchMessage(const lpMsg: _TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';
function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload setuponly';
procedure Application_ProcessMessages;
var
Msg: _TMsg;
begin
while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
procedure Run; // здесь ваша функция, где выполняется запуск программы
var
Res: Integer;
begin
// запускаем программу с параметром ewNoWait
if Exec(ExpandConstant('{tmp}\arc.exe'), 'x ' + AddQuotes(ExpandConstant('{app}\data.arc')) + ' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewNoWait, Res) then
while RunTaskA('arc.exe', False) do // проверяем, работает ли программа
Application_ProcessMessages;
end;
Serega, спасибо за пример.
Только, зачем создавать процедуру Run, если всё прекрасно работает через процедуру CurStepChanged?
Примерно так:
procedure CurStepChanged(CurStep: TSetupStep);
var
Res: Integer;
begin
if CurStep = ssPostInstall then begin
begin
// запускаем программу с параметром ewNoWait
if Exec(ExpandConstant('{app}\arc.exe'), 'x '+AddQuotes(ExpandConstant('{app}\arc.arc'))+' -y -dp'+AddQuotes(ExpandConstant('{app}')), '', SW_HIDE, ewNoWait, Res) then
while RunTaskA('arc.exe', False) do // проверяем, работает ли программа
Application_ProcessMessages;
end;
Только, зачем создавать процедуру Run, если всё прекрасно работает через процедуру CurStepChanged? »
Согласен, я показал для примера и даже указал в комментариях:
procedure Run; // здесь ваша функция, где выполняется запуск программы »
я же не знаю, в какой процедуре вы будете запускать файл...
Здравствуйте.У меня к вам просьба вот в этот скрипт 1.добавить freearc.(чтобы архивы были рядом с setup.exe)2.и еще добавит фоновую музыку (.mp3) 3. чтобы у музыки была кнопка play\pause. (ps я нуб в inno setup)скрипт (http://forum.ru-board.com/topic.cgi?forum=5&topic=30413&start=2426&limit=1&m=1#1)
Подскажите, пожалуйста, какой Flags применить для отмены регистрации DLL при деинсталяции (или достаточно указать Flags: regserver).
Спасибо.
Здравствуйте.У меня к вам просьба вот в этот скрипт »
Существует утилита, для объединения скриптов - InnoSetup Script Joiner (http://issjoiner.codeplex.com/)
Подскажите, пожалуйста, какой Flags применить для отмены регистрации DLL при деинсталяции (или достаточно указать Flags: regserver »
Достаточно.
Как определить факт установленного .NET Framework 1 ?
BlackSelf
29-07-2009, 14:52
mityafm, подойдет?
[Setup]
AppName=NETFramewrok
AppVerName=NETFramewrok
DefaultDirName={pf}\NETFramewrok
DisableStartupPrompt=true
InternalCompressLevel=none
Compression=none
[_Code]
function InitializeSetup(): Boolean;
var
ErrorCode: Integer;
NetFrameWorkInstalled : Boolean;
Result1 : Boolean;
begin
NetFrameWorkInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\.NETFramework\policy\v1.0');
if NetFrameWorkInstalled =true then
begin
Result := true;
end;
if NetFrameWorkInstalled = false then
begin
NetFrameWorkInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\.NETFramework\policy\v1.1');
if NetFrameWorkInstalled =true then
begin
Result := true;
end;
if NetFrameWorkInstalled =false then
begin
Result1 := MsgBox('This setup requires the .NET Framework. Please download and install the .NET Framework and run this setup again. Do you want to download the framwork now?',
mbConfirmation, MB_YESNO) = idYes;
if Result1 =false then
begin
Result:=false;
end
else
begin
Result:=false;
ShellExec('open', 'http://download.microsoft.com/download/a/a/c/aac39226-8825-44ce-90e3-bf8203e74006/dotnetfx.exe','','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
end;
end;
end;
end;
Как определить факт установленного .NET Framework 1 »
Накидал пример, необходимо указать, только минимальную версию .NET Framework:
; определение версии установленного .Net Framework
[Setup]
AppName=NetFramework
AppVerName=NetFramework
DefaultDirName={pf}\NetFramework
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
VersionInfoCopyright=Serega
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Code]
const
MinNetFrameWork = 'v1.1'; // минимальная версия NetFrameWork
var
url: string;
function GetNetFrameWork(ver: string): Integer;
begin
// страница загрузок http://www.microsoft.com/downloads/results.aspx?pocId=&freetext=Framework&DisplayLang=ru
Result:= 5;
url:= 'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe';
case ver of
'v1.0':
begin
// по этой ссылке v1.1, т.к. ссылку на v1.0, я не нашёл... раритет... ;)
url:= 'http://download.microsoft.com/download/0/8/6/086e7824-ddad-45c0-b765-721e5e28e4c5/dotnetfx.exe';
Result:= 0;
end;
'v1.1':
begin
url:= 'http://download.microsoft.com/download/0/8/6/086e7824-ddad-45c0-b765-721e5e28e4c5/dotnetfx.exe';
Result:= 1;
end;
'v2.0':
begin
url:= 'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe';
Result:= 2;
end;
'v3.0':
begin
url:= 'http://download.microsoft.com/download/4/d/a/4da3a5fa-ee6a-42b8-8bfa-ea5c4a458a7d/dotnetfx3setup.exe';
Result:= 3;
end;
'v3.5':
begin
url:= 'http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe';
Result:= 4;
end;
end;
end;
function SearchNetFrameWork: Boolean;
var
Error: Integer;
VerNetFrameWork: array of string;
VerNetFrameWorkInstalled: TArrayOfString;
i, n: Integer;
begin
VerNetFrameWork:= ['v1.0', 'v1.1', 'v2.0', 'v3.0', 'v3.5'];
SetArrayLength(VerNetFrameWork, GetArrayLength(VerNetFrameWork));
if RegGetSubkeyNames(HKLM, 'SOFTWARE\Microsoft\.NETFramework\policy', VerNetFrameWorkInstalled) then
begin
SetArrayLength(VerNetFrameWorkInstalled, GetArrayLength(VerNetFrameWorkInstalled));
for i:= 0 to GetArrayLength(VerNetFrameWorkInstalled)-1 do
begin
for n:= 0 to GetArrayLength(VerNetFrameWork)-1 do
if VerNetFrameWorkInstalled[i] = VerNetFrameWork[n] then
if n >= GetNetFrameWork(MinNetFrameWork) then
begin
Result:= True;
Break;
end
else
begin
if MsgBox('Для этой программы требуется установленный .NET Framework не ниже ' + MinNetFrameWork + '. ' +
'Пожалуйста загрузите и установите .NET Framework и запустите установку снова. ' +
'Вы хотите загрузить .NET Framework сейчас?', mbConfirmation, MB_YESNO) = idYes then
ShellExec('open', url,'','',SW_SHOWNORMAL,ewNoWait,Error);
Result:= False;
end;
end;
end;
end;
function InitializeSetup: Boolean;
begin
if SearchNetFrameWork then Result:= True;
end;
Привет. Только что опять друг попросил слегка переделать тот скрипт. Два нюанса:
1. Добавить строку, чтобы инсталятор проверял систему Windows 7, тоесть работал
2. При любом раскладе, если любой параметр, видеокарта, процессор, система, звуковая, озу. не соответствует минимальному значению, всё равно чтобы кнопка далее была активна.
С первым пунктом мне кажется можно так, но я не уверен:
...
if //(Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and // Windows 2000 SP4
//(Pos('XP Service Pack 1', SystemVersionPanel.Text) = 0) and // Windows XP SP1
(Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and // Windows XP SP2
(Pos('XP Service Pack 3', SystemVersionPanel.Text) = 0) and // Windows XP SP3
(Pos('Vista', SystemVersionPanel.Text) = 0) then // Windows Vista (c любым SP или без него)
(Pos('Windows 7', SystemVersionPanel.Text) = 0) then // Windows 7
begin
SystemVersionPanel.Color := $CCCCFF
ChangeText := True
end
...
А вот со вторым пунктом, чтобы сделать активную кнопку при любом раскладе, не знаю где... Возможно здесь
...
if ChangeText = True then
begin
TopText.Top := 0
TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям программы.' #13
'Пожалуйста, проверьте позиции, выделенные красным цветом.'
TopText.Font.Color := clRed
WizardForm.NextButton.Enabled := False // Сменить на True ???
end
else
begin
TopText.Caption := 'Все компоненты соответствуют минимальным требованиям программы.'
TopText.Font.Color := clGreen
TopText.Top := 8
WizardForm.NextButton.Enabled := True
end
end;
...
Исходный скрипт. Не получилось в один коммент записать, т.к. ограничение в 30000 символов, общий коммент превышает.
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!
#define MyAppName "Need for Speed Most Wanted"
#define MyAppVerName "Need for Speed Most Wanted"
#define MyAppPublisher "EA Games Company."
#define MyAppURL "http://www.needforspeed.com/"
#define MyAppExeName "bin\XR_3DA.exe"
#define TIME_FOR_VIEW 1
[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
;AppId={{337AE44F-3DF6-4C55-AFCA-AAA9A6436F0E}
AppName={#MyAppName}
AppVerName={#MyAppVerName}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
SetupIconFile=C:\speed.ico
AllowNoIcons=yes
LicenseFile=E:\Need for Speed Most Wanted\Support\en-uk_eula.txt
InfoBeforeFile=E:\Need for Speed Most Wanted\Readme.txt
OutputDir=E:\
OutputBaseFilename=Need for Speed Most Wanted
DiskSpanning=yes
; Если поставить значение '2' будет требовать второй диск, нужно расчитать размер
; от общего размера пакуемых файлов. Минимальный = '262144'
SlicesPerDisk=1
DiskSliceSize=2100000000
DiskClusterSize=4096
ReserveBytes=0
; Хорошее сжатие, обычное
;Compression=lzma/ultra
SolidCompression=yes
; Максимальное 64'битное
Compression=lzma/ultra64
InternalCompressLevel=ultra64
[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl
[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons};
;Flags: unchecked
[Files]
Source: compiler:Libraries\InnoCallback.dll; Flags: dontcopy
Source: D:\Programms\Я_Автоустановка\BartPE\Image\Image_2.bmp; Flags: dontcopy
; Папка упаковываемой игры
Source: "E:\S.T.A.L.K.E.R\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; WorkingDir: {app}
Name: {group}\SaveEditor; Filename: {app}\SaveEditor.exe; WorkingDir: {app}
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; WorkingDir: {app}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; WorkingDir: {app}; Tasks: desktopicon
Name: {group}\{cm:UninstallProgram, Need for Speed Most Wanted}; Filename: {uninstallexe}; WorkingDir: {app}
[_Code]
type
PDisplay_Device = record
cb: DWord;
DeviceName: array [0..31] of char;
DeviceString: array [0..127] of char;
StateFlags: DWord;
DeviceID, DeviceKey: array [0..127] of char;
end;
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TMixerCaps = record
vPid, vDriverVersion: DWord;
sName: array [0..31] of char;
Support, cDestinations: DWord;
end;
// Проверка версии Windows
#if Pos("4.", GetFileVersion(AddBackslash(GetEnv("windir")) + "Explorer.exe")) == 1
{Win9x}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, LoAvailPhys, LoTotalPageFile, LoAvailPageFile,
LoTotalVirtual, LoAvailVirtual, LoAvailExtendedVirtual, HiTotalPhys,
HiAvailPhys, HiTotalPageFile, HiAvailPageFile, HiTotalVirtual, HiAvailVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatus@kernel32.dll stdcall';
#else
{WinNT}
TMemoryStatusEx = record
dwLength, dwMemoryLoad: DWord;
LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
HiAvailExtendedVirtual: Integer;
end;
function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean;
external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
#endif
const
// Менять минимальные системные значения
DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
oneMB = 1024*1024;
NeedMHz = 1500;
NeedVideoRAM = 64;
NeedSoundCard = 'Creative X-Fi';
NeedMB = 256;
NeedPageFile = 1024;
var
WelcomeLabel1,WelcomeLabel2,FinishedHeadingLabel,RunLabel,
FinishedLabel,PageNameLabel,PageDescriptionLabel:TLabel;
RunMyProg: TCheckBox;
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;
InfoPage: TWizardPage;
TopText, BottomText: TNewStaticText;
ChangeText: Boolean;
SystemPanel, ProcessorPanel, VideoPanel,
AudioPanel, RAMPanel, PageFilePanel: TMemo;
SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
lpCaps: TMixerCaps;
Version: TWindowsVersion;
MemoryEx: TMemoryStatusEx;
n, errCode: Integer;
Keys: TArrayOfString;
DeviceValue: Cardinal;
lpDisplayDevice: PDisplay_Device;
function GetSystemMetrics(nIndex: Integer): Integer;
external 'GetSystemMetrics@user32.dll stdcall';
function GetDeviceCaps(hDC, nIndex: Integer): Integer;
external 'GetDeviceCaps@GDI32 stdcall';
function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
external 'CreateDCA@GDI32 stdcall';
function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean;
external 'EnumDisplayDevicesA@user32.dll stdcall';
function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt;
external 'mixerGetDevCapsA@winmm.dll stdcall';
function mixerGetNumDevs: Integer;
external 'mixerGetNumDevs@winmm.dll stdcall';
//--------------
function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';
function Progress: Integer;
begin
with WizardForm.ProgressGauge do Result := (Position - Min)/((Max - Min)/100);
end;
function CurrTimer: Integer;
var
i: Integer;
begin
i:= Progress;
if ((i > 0) and (i < 4)) then Result:= 1 else
if ((i > 4) and (i < 8)) then Result:= 2 else
if ((i > 8) and (i < 12)) then Result:= 3 else
if ((i > 12) and (i < 16)) then Result:= 4 else
if ((i > 16) and (i < 20)) then Result:= 5 else
if ((i > 20) and (i < 24)) then Result:= 6 else
if ((i > 24) and (i < 28)) then Result:= 7 else
if ((i > 28) and (i < 32)) then Result:= 8 else
if ((i > 32) and (i < 36)) then Result:= 9 else
if ((i > 36) and (i < 40)) then Result:= 10 else
if ((i > 40) and (i < 44)) then Result:= 11 else
if ((i > 44) and (i < 48)) then Result:= 12 else
if ((i > 48) and (i < 52)) then Result:= 13 else
if ((i > 52) and (i < 56)) then Result:= 14 else
if ((i > 56) and (i < 60)) then Result:= 15 else
if ((i > 60) and (i < 64)) then Result:= 16 else
if ((i > 64) and (i < 68)) then Result:= 17 else
if ((i > 68) and (i < 72)) then Result:= 18 else
if ((i > 72) and (i < 76)) then Result:= 19 else
if ((i > 76) and (i < 80)) then Result:= 20 else
if ((i > 80) and (i < 84)) then Result:= 21 else
if ((i > 84) and (i < 88)) then Result:= 22 else
if ((i > 88) and (i < 91)) then Result:= 23 else
if ((i > 91) and (i < 94)) then Result:= 24 else
if ((i > 94) and (i < 97)) then Result:= 25 else
if ((i > 97) and (i < 100)) then Result:= 26;
end;
procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
case CurrTimer of
1: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_2.bmp')) end;
...
26: begin SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_27.bmp')) end;
end;
end;
procedure RLabelOnClick(Sender: TObject);
begin
if RunMyProg.Checked = False then
begin
RunMyProg.Checked := True;
end else
RunMyProg.Checked := False;
end;
// функция для запуска программы если отмечен чебокс
procedure CurStepChanged(CurStep: TSetupStep);
var
ErrorCode: Integer;
begin
if CurStep = ssDone then
begin
if RunMyProg.Checked = True then
Exec(ExpandConstant('{app}\speed.exe'), '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
end;
// Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
Result := (Bytes/Multiple + 1)*Multiple
else
Result := Bytes;
end;
// Перевод числа в значение Бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)
function ByteOrTB(Bytes: Extended; noMB: Boolean): String;
begin
if not noMB then
Result := FloatToStr(Int(Bytes)) + ' Мб'
else
if Bytes < 1024 then
Result := FloatToStr(Int(Bytes)) + ' Бт'
else
if Bytes/1024 < 1024 then
Result := FloatToStr(round((Bytes/1024)*10)/10) + ' Кб'
else
if Bytes/oneMB < 1024 then
Result := FloatToStr(round(Bytes/oneMB*100)/100) + ' Мб'
else
if Bytes/oneMB/1000 < 1024 then
Result := FloatToStr(round(Bytes/oneMB/1024*1000)/1000) + ' Гб'
else
Result := FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) + ' Тб'
StringChange(Result, ',', '.')
end;
// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1)
Result := Trim(String)
end;
function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2
for Hi := Hi-1 downto 0 do Result := Result + $7FFFFFFF + $7FFFFFFF + 2
end;
function CheckCPU(NeedMHz: Integer): Boolean;
var
String: String;
begin
String := 'Hardware\Description\System\CentralProcessor'; RegGetSubkeyNames(HKLM, String, Keys) // Количество ядер
for n := 0 to GetArrayLength(Keys)-1 do
RegQueryStringValue(HKLM, String + '\' + Keys[n], 'ProcessorNameString', Keys[n])
if not RegQueryDWordValue(HKLM, String + '\0', '~MHz', DeviceValue) or (DeviceValue < NeedMHz) then
Exit
else
Result := True
end;
function CheckMemorySize(NeedRAM: Integer): Boolean;
begin
MemoryEx.dwLength := SizeOf(MemoryEx);
if not GlobalMemoryStatusEx(MemoryEx) then
MsgBox('Ошибка функции:' + #13 + 'GlobalMemoryStatusEx', mbError, mb_Ok)
else
if (ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) < NeedRAM) then
Exit
else
Result := True;
end;
procedure CreateCheckForm();
begin
TopText := TNewStaticText.Create(InfoPage)
with TopText do
begin
Parent := InfoPage.Surface
Left := 0
AutoSize := True
end
BottomText := TNewStaticText.Create(InfoPage)
with BottomText do
begin
Parent := InfoPage.Surface
Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».'
Font.Color := clBlack
Left := 0
Top := 200
AutoSize := True
end
SystemPanel := TMemo.Create(InfoPage)
with SystemPanel do
begin
Text := 'Система'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ScaleY(33)
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end
SystemVersionPanel := TMemo.Create(InfoPage)
with SystemVersionPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := SystemPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end
ProcessorPanel := TMemo.Create(InfoPage)
with ProcessorPanel do
begin
Text := 'Процессор'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := SystemPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end
ProcessorMHzPanel := TMemo.Create(InfoPage)
with ProcessorMHzPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := ProcessorPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end
VideoPanel := TMemo.Create(InfoPage)
with VideoPanel do
begin
Text := 'Видеоадаптер'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := ProcessorPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end
VideoRAMPanel := TMemo.Create(InfoPage)
with VideoRAMPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := VideoPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end
AudioPanel := TMemo.Create(InfoPage)
with AudioPanel do
begin
Text := 'Звуковая карта'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := VideoPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end
AudioNamePanel := TMemo.Create(InfoPage)
with AudioNamePanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := AudioPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end
RAMPanel := TMemo.Create(InfoPage)
with RAMPanel do
begin
Text := 'Объём памяти'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := AudioPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end
RAMTotalPanel := TMemo.Create(InfoPage)
with RAMTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := RAMPanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end
PageFilePanel := TMemo.Create(InfoPage)
with PageFilePanel do
begin
Text := 'Файл подкачки'
Alignment := taCenter
Parent := InfoPage.Surface
Left := ScaleX(0)
Top := RAMPanel.Top + 27
Width := ScaleX(100)
Height := ScaleY(22)
ReadOnly := True
Color := $EEEEEE
end;
PageFileTotalPanel := TMemo.Create(InfoPage)
with PageFileTotalPanel do
begin
Alignment := taLeftJustify
Parent := InfoPage.Surface
Left := ScaleX(104)
Top := PageFilePanel.Top
Width := ScaleX(310)
Height := ScaleY(22)
ReadOnly := True
end
end;
procedure UpdateInfo();
var
DeviceName, DeviceKey: String;
begin
ChangeText := False
GetWindowsVersionEx(Version)
// Операционная система:
SystemVersionPanel.Color := $CCFFCC
DeviceKey := 'Software\Microsoft\Windows NT\CurrentVersion'
if not UsingWinNT then StringChange(DeviceKey, 'Windows NT', 'Windows')
RegQueryStringValue(HKLM, DeviceKey, 'ProductName', DeviceName)
if RegQueryStringValue(HKLM, DeviceKey, 'CSDVersion', DeviceKey) then
DeviceName := DeviceName + ' ' + DeviceKey
StringChange(DeviceName, 'Microsoft ', '')
SystemVersionPanel.Text := ' ' + DeviceName + ' сборка ' + IntToStr(Version.Major) + '.' + IntToStr(Version.Minor) +
'.' + IntToStr(Version.Build)
if //(Pos('2000 Service Pack 4', SystemVersionPanel.Text) = 0) and // Windows 2000 SP4
//(Pos('XP Service Pack 1', SystemVersionPanel.Text) = 0) and // Windows XP SP1
(Pos('XP Service Pack 2', SystemVersionPanel.Text) = 0) and // Windows XP SP2
(Pos('XP Service Pack 3', SystemVersionPanel.Text) = 0) and // Windows XP SP3
(Pos('Vista', SystemVersionPanel.Text) = 0) then // Windows Vista (c любым SP или без него)
begin
SystemVersionPanel.Color := $CCCCFF
ChangeText := True
end
// Процессор:
ProcessorMHzPanel.Color := $CCFFCC
if not CheckCPU(NeedMHz) then
begin
ProcessorMHzPanel.Color := $CCCCFF
ChangeText := True
end
ProcessorMHzPanel.Text := ' ' + DelSp(Keys[0]) + ' @' + IntToStr(DeviceValue) + ' MHz'
if GetArrayLength(Keys) > 1 then
ProcessorPanel.Text := 'Процессоры' // + ' (' + IntToStr(GetArrayLength(Keys)) + ')'
// Видеокарта:
VideoRAMPanel.Color := $CCFFCC
lpDisplayDevice.cb := SizeOf(lpDisplayDevice)
DeviceKey := ''
n := 0
while not (EnumDisplayDevices(0, n, lpDisplayDevice, 0) and
(lpDisplayDevice.StateFlags and DISPLAY_DEVICE_PRIMARY_DEVICE > 0)) and (n < 127) do n := n + 1
for n := 0 to 127 do DeviceKey := DeviceKey + lpDisplayDevice.DeviceKey[n]
Delete(DeviceKey, Pos(Chr(0), DeviceKey), 127) // Ключ драйвера получаем из API
StringChange(DeviceKey, '\Registry\Machine\', '')
errCode := 1
DeviceValue := 0
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceName) then
for n := 1 to Length(DeviceName) do
begin
DeviceValue := DeviceValue + Ord(DeviceName[n])*errCode
errCode := errCode*$100
end
else
if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
else
RegQueryDWordValue(HKLM, DeviceKey + '\Info', 'VideoMemory', DeviceValue)
DeviceName := ''
for n := 0 to 127 do DeviceName := DeviceName + lpDisplayDevice.DeviceString[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 127)
if DeviceName <> '' then
if DeviceValue > 0 then
VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ', '+ ByteOrTB(DeviceValue/oneMB, False)
else
VideoRAMPanel.Text := ' ' + DelSp(DeviceName) + ' (Standard), '+ ByteOrTB(DeviceValue/oneMB, False)
else
begin
VideoRAMPanel.Text := ' Драйвер устройства не обнаружен'
VideoRAMPanel.Color := $CCCCFF
ChangeText := True
end
if (DeviceValue/oneMB < NeedVideoRAM) then
begin
VideoRAMPanel.Color := $CCCCFF
ChangeText := True
end
VideoRAMPanel.Text := VideoRAMPanel.Text + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +
IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)'
// Звуковая карта:
AudioNamePanel.Color := $CCFFCC
// for errCode := 0 to 1 do // Вывод основного звукового устройства
for errCode := 0 to mixerGetNumDevs do
begin
mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps))
DeviceName := ' '
for n := 0 to 31 do DeviceName := DeviceName + lpCaps.sName[n]
Delete(DeviceName, Pos(Chr(0), DeviceName), 31)
Delete(DeviceName, Pos(' [', DeviceName), 31)
StringChange(DeviceName, 'SB ', 'Creative ')
Delete(DeviceName, Pos(' Audio', DeviceName), 31)
SetArrayLength(Keys, errCode)
if errCode > 0 then Keys[errCode-1] := DeviceName
end
if GetArrayLength(Keys) > 1 then
begin
AudioPanel.Text := 'Звуковые карты'
// AudioPanel.Text := 'Звуковые карты (' + IntToStr(GetArrayLength(Keys)) +')'
AudioNamePanel.Text := ''
for n := 1 to GetArrayLength(Keys) do
AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1] // + '(' + IntToStr(n) + ')'
end
else
if GetArrayLength(Keys) = 0 then
begin
AudioNamePanel.Text := ' Драйвер устройства не обнаружен'
AudioNamePanel.Color := $CCCCFF
ChangeText := True
end
else
AudioNamePanel.Text := Keys[0]
if Pos(NeedSoundCard, AudioNamePanel.Text) = 0 then
AudioNamePanel.Text := AudioNamePanel.Text + ' (рекомендуется ' + NeedSoundCard + ')'
// Объём памяти:
RAMTotalPanel.Color := $CCFFCC
if not CheckMemorySize(NeedMB) then
begin
RAMTotalPanel.Color := $CCCCFF
ChangeText := True
end
RAMTotalPanel.Text := ' ' + ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16), False) + ' всего, ' +
ByteOrTB(ToMultiple(trunc(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB), 16) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' используется, ' +
ByteOrTB(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB, False) + ' свободно'
// Виртуальная память:
PageFileTotalPanel.Color := $CCFFCC
PageFileTotalPanel.Text := ' ' + ByteOrTB(Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB, False) + ' всего, ' +
ByteOrTB((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB, False) + ' занято системным кэшем'
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then
begin
PageFileTotalPanel.Color := $CCCCFF
ChangeText := True
end
if ChangeText = True then
begin
TopText.Top := 0
TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям программы.' #13
'Пожалуйста, проверьте позиции, выделенные красным цветом.'
TopText.Font.Color := clRed
WizardForm.NextButton.Enabled := False
end
else
begin
TopText.Caption := 'Все компоненты соответствуют минимальным требованиям программы.'
TopText.Font.Color := clGreen
TopText.Top := 8
WizardForm.NextButton.Enabled := True
end
end;
procedure CurPageChanged(CurPageID: Integer);
var
pfunc: LongWord;
begin
WelcomeLabel1.Caption := WizardForm.WelcomeLabel1.Caption;
WelcomeLabel2.Caption := WizardForm.WelcomeLabel2.Caption;
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
FinishedHeadingLabel.Caption := WizardForm.FinishedHeadingLabel.Caption;
FinishedLabel.Caption := WizardForm.FinishedLabel.Caption;
// здесь придётся вручную вводить требуемый текст
RunLabel.Caption := 'Запустить игру';
if CurPageID = InfoPage.ID then UpdateInfo(); // Обновление информации о системе
if (CurPageID = wpInstalling) then begin
pfunc := WrapTimerProc(@OnTimer, 4);
TimerID := SetTimer(0, 0, 1000, pfunc);
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
SplashImage.Show;
end
else begin
WizardForm.ProgressGauge.Hide;
WizardForm.StatusLabel.Hide;
SplashImage.Hide;
end;
if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then begin
with WizardForm do begin
InnerNotebook.Show;
Bevel1.Show;
MainPanel.Show;
PageNameLabel.Show;
PageDescriptionLabel.Show;
end;
end;
end;
procedure InitializeWizard();
var
i: Integer;
// Меняем размер окна установки
//begin
//WizardForm.ClientHeight:= 800;
// WizardForm.ClientWidth:= 750;
//WizardForm.Height:= 500;
// WizardForm.Width:= 700;
begin
InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
'Программа установки обнаружила следующие необходимые компоненты.')
CreateCheckForm() // Создание объектов TMemo, в которых будет выводится информация о системе
UpdateInfo() // Обновление информации о системе
// ну не все же 26 штук перечислять
for i:= 2 to 27 do ExtractTemporaryFile('Image_' + IntToStr(i) + '.bmp');
currTime := 0;
with WizardForm do begin
WelcomeLabel1.Hide;
WelcomeLabel2.Hide;
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
FinishedHeadingLabel.Hide;
FinishedLabel.Hide;
// незнаю почему, но Hide не действует. Поэтому просто уменьшил размер
RunList.Height := 0;
RunList.Width := 0;
FilenameLabel.Hide;
with StatusLabel do begin
Parent := WizardForm;
Top := ScaleY(315);
Left := ScaleX(10);
Width := ScaleX(200);
Hide;
end;
with ProgressGauge do begin
Parent := WizardForm;
Top := ScaleY(330);
// Сдвигаем прогресс бар вниз
//WizardForm.ProgressGauge.Top := ScaleY(430);
Left := ScaleX(10);
Width := ScaleX(380);
Height := ScaleX(18);
Hide;
end;
end;
SplashImage := TBitmapImage.Create(WizardForm);
with SplashImage do begin
Top := 0;
Left := 0;
Width := WizardForm.MainPanel.Width;
Height := WizardForm.Bevel.Top;
Parent := WizardForm.InnerPage;
Stretch := True;
Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_10.bmp'));
Hide;
end;
with WizardForm do begin
WizardBitmapImage.Align:=true;
WizardBitmapImage2.Align:=true;
WizardSmallBitmapImage.Align:=true;
end;
WelcomeLabel1:= TLabel.Create(WizardForm);
with WelcomeLabel1 do begin
Left:=ScaleX(10);
Top := ScaleY(10);
Width := ScaleX(350);
Height := ScaleY(75);
AutoSize := False;
WordWrap := True;
Font.Color := clGreen;
// здесь можно поиграть шрифтом
// WelcomeLabel1.Font.Style := [fsBold];
// WelcomeLabel1.Font.Name:='MS Sans Serif';
Font.Size := 14;
Transparent := True;
Parent := WizardForm.WelcomePage;
end;
WelcomeLabel2:=TLabel.Create(WizardForm);
with WelcomeLabel2 do begin
Left := ScaleX(10);
Top := ScaleY(70);
Width := ScaleX(200);
Height := ScaleY(300);
AutoSize := False;
WordWrap := True;
Font.Color := clGreen;
Font.Style := [fsBold];
Font.Size := 10;
Transparent := True;
Parent := WizardForm.WelcomePage;
end;
PageNameLabel := TLabel.Create(WizardForm);
with PageNameLabel do begin
Left := ScaleX(25);
Top := ScaleY(10);
Width := ScaleX(300);
Height := ScaleY(14);
AutoSize := False;
WordWrap := True;
Font.Color := $339933;
Font.Style := [fsBold];
Font.Size := 11;
Transparent := True;
Parent := WizardForm.MainPanel;
end;
PageDescriptionLabel := TLabel.Create(WizardForm);
with PageDescriptionLabel do begin
Left := ScaleX(40);
Top := ScaleY(25);
Width := ScaleX(475);
Height := ScaleY(30);
AutoSize := False;
WordWrap := True;
Font.Color := $339933;
Font.Style := [fsBold];
Font.Size := 9;
Transparent := True;
Parent := WizardForm.MainPanel;
end;
FinishedHeadingLabel:= TLabel.Create(WizardForm);
with FinishedHeadingLabel do begin
Left := ScaleX(10);
Top := ScaleY(10);
Width := ScaleX(320);
Height := ScaleY(75);
AutoSize := False;
WordWrap := True;
Font.Color := clBlue;
// здесь тоже можно поиграть шрифтом
// FinishedHeadingLabel.Font.Style := [fsBold];
// FinishedHeadingLabel.Font.Name:='MS Sans Serif';
Font.Size := 14;
Transparent := True;
Parent := WizardForm.FinishedPage;
end;
FinishedLabel:= TLabel.Create(WizardForm);
with FinishedLabel do begin
Left := ScaleX(10);
Top := ScaleY(70);
Width := ScaleX(220);
Height := ScaleY(300);
AutoSize := False;
WordWrap := True;
Font.Color := clRed;
Font.Size := 10;
Transparent := True;
Parent := WizardForm.FinishedPage;
end;
RunMyProg := TCheckBox.Create(WizardForm);
with RunMyProg do begin
Parent := WizardForm.FinishedPage;
Left := ScaleX(10);
Top := ScaleY(270);
Width := ScaleX(13);
Height := ScaleX(13);
Checked := True; // чтоб чебокс был отмечен, раскоментируй строку
end;
RunLabel:= TLabel.Create(WizardForm);
with RunLabel do begin
Left := ScaleX(30);
Top := ScaleY(270);
Width := ScaleX(200);
Height := ScaleY(20);
AutoSize := False;
WordWrap := True;
Font.Color := clGreen;
Font.Style := [fsBold];
Font.Size := 10;
OnClick := @RLabelOnClick;
Transparent := True;
Parent := WizardForm.FinishedPage;
end;
end;
procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;
С первым пунктом мне кажется можно так, но я не уверен: »
Я тоже не уверен на все сто, но помоему так.
А вот со вторым пунктом, чтобы сделать активную кнопку при любом раскладе, не знаю где... »
Можно просто удалить WizardForm.NextButton.Enabled:= False и WizardForm.NextButton.Enabled:= True, т.е.:
...
if ChangeText = True then
begin
TopText.Top := 0;
TopText.Caption := 'Не все компоненты удовлетворяют минимальным требованиям программы.' + #13 +
'Пожалуйста, проверьте позиции, выделенные красным цветом.';
TopText.Font.Color := clRed;
end
else
begin
TopText.Caption := 'Все компоненты соответствуют минимальным требованиям программы.';
TopText.Font.Color := clGreen;
TopText.Top := 8;
end;
end;
...
P.S.
Забываем про знаки ';' в конце строк... ;)
Ребята, у меня такой вопрос: я подставляю картинку в левый нижний угол, но можно ли как нибудь сделать, чтобы она отображалась на всех страницах, кроме страницы распаковки??? (использую слайд-шоу, и картинка выглядывает из-под прогресс-бара). И как вручную указать требуемое свободное место на диске здесь (http://s40.radikal.ru/i090/0907/90/c2ed96628a32.jpg) (своё число mb указать)
Спасибо Serega, уже потихоньку соображаю самостоятельно. :teeth:Забываем про знаки ';' в конце строк... »Так тож я ничего не правил, как было. :)
Подскажите пожалуйста как такой инсталл сделать, чтоб было такое оформление, и были функции удалений сохраненй и игр?
Сделано классно, я вытаскивал код, скомпилировал, а картинка сужается.
Сделать отдельно такую тему отдельно.
user_123
30-07-2009, 17:56
Подскажите пожалуйста, как в inno setup реализовать следующее:
1. В программе удаления сделать список дополнительных задач (как [tasks] в программе установки; нужно для удаления определённого каталога со все его содержимым) . Показ стандартного (системного) диалога с запросом меня не очень устраивает, т.к. я делаю многоязычный инсталлятор, а в секции [code] {cm:*} не работает...
2. На черточке внизу диалогового окна написать текст (копирайт).
3. Во всех диалоговых окнах инсталлятора и деинсталлятора (кроме заголовка окна) сделать отображаение AppVerName вместо AppName.
Прошу прощение, если это уже обсуждалось... у меня дорогой интернет-трафик и поэтому я не имею возможности просматривать всё подряд... Заранее благодарен.
1. Добавить строку, чтобы инсталятор проверял систему Windows 7, тоесть работал »
На Windows 7 в ветке
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion] значение ProductName следующее
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion]
"ProductName"="Windows 7 Ultimate"
И я так понимаю, нужно так? :dont-know Или прокатит и предыдущая запись?
...
(Pos('Windows 7 Ultimate', SystemVersionPanel.Text) = 0) then // Windows 7...
serg aka lain
30-07-2009, 23:59
чтобы она отображалась на всех страницах, кроме страницы распаковки??? »
конечно,
procedure CurPageChanged(CurPageID: Integer);
begin
показать картинку. (нужный код)
if CurPageID = wpInstalling then
begin
не показывать картинку. (нужный код)
end;
end;
И как вручную указать требуемое свободное место на диске здесь (своё число mb указать) »
[Setup]
ExtraDiskSpaceRequired=45678901234
; (1048576 bytes = 1 megabyte)
procedure CurPageChanged(CurPageID: Integer);
begin
показать картинку. (нужный код)
if CurPageID = wpInstalling then
begin
не показывать картинку. (нужный код)
end;
end; »
вот только я не знаю, что писать вместо того, что я выделил....
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC