Свободное общение

AlexZetCrow

Новичок
Правила данные были приняты после моей регистрации..
Раньше я только читал и переписывался в лс.. в посты не лез ибо не доходили руки до самого Inno Setup
Хотя часть ресурсов всё же доступно и скачиваю, использую, пробую проверяю стараюсь разобраться.. без DLL тут вообще делать нечего, приходится обращаться к сторонним ресурсам с этими dll либо потрошить чужие репаки, что тоже не очень хорошо.

К тому же на самом форуме можно скачивать данные DLL вместе с кодом и примерами, что напрочь расходится с правилами.


P.S. Почему правила работают двояко ? Заходим на данный пост и скачиваем от туда Готовую Сборку Прототипа 2 https://krinkels.org/threads/skript-prototype-2.3148/ Правим что написано и получаем готовый мануал.. Но проку от него ,если у вас не хватает мозгов самим разобраться и сделать с нуля, потому что нет доступа к библиотекам на самом форуме.. но есть отдельные билды готовые со встроенными библиотеками и рабочими скриптами, тогда к чему эти правила?
 

Вложения

Последнее редактирование:

Nemko

Дилетант
Модератор
AlexZetCrow написал(а):
Почему правила работают двояко?
AlexZetCrow, несколько причин:
  • Некоторые пользователи не желают оформить свои "наработки" в виде ресурса.
  • Правила были введены недавно, а запрета скачивать из "Прикрепленных файлов" нет. Может и введут.
  • К новым примерам пользователи порой вынуждены прикреплять инструменты и код с задекларированными функциями, так как порой познаний собеседников недостаточно.
  • Может еще чего...
Ссылаетесь на двоякость правил, а созданная Вами тема поменяла суть вопроса уже несколько раз. Может переименовать ее: "Хочу знать абсолютно все и обо всем как можно скорее". Так не бывает. Я такой же мало знающий, но считаю: "В чужой монастырь со своим уставом не ходят". Отбросим инфантильность и нарциссизм, было же сказано об новых правилах: "Это вынужденная мера и она не обсуждается". Может связано с безопасностью форума, ddos-угрозами, сервер платный, а может еще чего. Если нравиться форум, не вижу преград взять пропуск за 3$, да я на транспорт трачу больше в день. У меня были права на скачивания, но решил приобрести все равно и чтобы Вы там не думали про меня после этого. Может слышали про бесплатные проекты, которые хочется поддержать (Inno Setup, Mp3tag, Blender, AIMP, так и данный форум доступен бесплатно, нужна лишь Ваша активность (10 - симпатий).
 
Последнее редактирование:

AlexZetCrow

Новичок
AlexZetCrow, несколько причин:
  • Некоторые пользователи не желают оформить свои "наработки" в виде ресурса.
  • Правила были введены недавно, а запрета скачивать из "Прикрепленных файлов" нет. Может и введут.
  • К новым примерам пользователи порой вынуждены прикреплять инструменты и код с задекларированными функциями, так как порой познаний собеседников недостаточно.
  • Может еще чего...
Ссылаетесь на двоякость правил, а созданная Вами тема поменяла суть вопроса уже несколько раз. Может переименовать ее: "Хочу знать абсолютно все и обо всем как можно скорее". Так не бывает. Я такой же мало знающий, но считаю: "В чужой монастырь со своим уставом не ходят". Отбросим инфантильность и нарциссизм, было же сказано об новых правилах: "Это вынужденная мера и она не обсуждается". Может связано с безопасностью форума, ddos-угрозами, сервер платный, а может еще чего. Если нравиться форум, не вижу преград взять пропуск за 3$, да я на транспорт трачу больше в день. У меня были права на скачивания, но решил приобрести все равно и чтобы Вы там не думали про меня после этого. Может слышали про бесплатные проекты, которые хочется поддержать (Inno Setup, Mp3tag, Blender, AIMP, так и данный форум доступен бесплатно, нужна лишь Ваша активность (10 - симпатий).
Простите, просто половина туториалов без DLL никак вообще не реализуемы ((
А активность с меня не очень, недостаток знаний в программировании.

Про плату не знал, будет возможность внесу свои 3 бакса, а вы не в курсе как решить проблему ?
Я смог всё же отыскать системные требования
Но как быть, как можно проигнорировать запрет кнопки далее?

Код взят из FAQ за авторством SBalykov
У меня кнопка горит серой, не могу прожать.
Просто хотел составить сведения о системе для пользователя в соответствии с минимальными требованиями, чтоб пользователь был в курсе о проблемах или недостатках системы и брал на себя риск дальнейшей установки.
Код:
#define NeedSystem = "5.1.3";

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

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

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
  oneMB = 1024*1024;
  NeedMHz = 1800;
  NeedVideoRAM = 128;
  NeedSoundCard = 'Creative X-Fi';
  NeedMB = 512;
  NeedPageFile = 1024;

type
#ifdef UNICODE
  PChar = PAnsiChar;
#else
  AnsiChar = Char;
#endif

THardwareRequirementSnapShot = record
  WinName, WinBits, SPack: String;
  WinVer: TWindowsVersion;
end;

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;

TMixerCaps = record
  vPid, vDriverVersion: DWord;
  sName: array [0..31] of Char; Support, cDestinations: DWord;
end;

TMemoryStatusEx = record
  dwLength, dwMemoryLoad: DWord;
  LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
  LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
  LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
  HiAvailExtendedVirtual: Integer;
end;

var
  InfoPage: TWizardPage;
  TopText, BottomText: TNewStaticText;
  ChangeText: Boolean;
  SystemPanel, ProcessorPanel, VideoPanel,
  AudioPanel, RAMPanel, PageFilePanel: TMemo;
  SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
  AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  lpCaps: TMixerCaps;
  MemoryEx: TMemoryStatusEx;
  i, n, errCode: Integer;
  Keys: TArrayOfString;
  DeviceValue: Cardinal;
  lpDisplayDevice: PDisplay_Device;
  SystemName, DeviceName, SoundName, DeviceKey, String: String;
  DeviceNamed: AnsiString;
  HWREQ: THardwareRequirementSnapShot;

function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean; external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
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 'CreateDC{#A}@GDI32 stdcall';
function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean; external 'EnumDisplayDevices{#A}@user32.dll stdcall';
function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt; external 'mixerGetDevCaps{#A}@winmm.dll stdcall';
function mixerGetNumDevs: Integer; external 'mixerGetNumDevs@winmm.dll stdcall';

///Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
  Result := (Bytes/Multiple + 1)*Multiple
  else
  Result := Bytes
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 NumToStr(Float: Extended): string;
begin
  Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
end;

/// Конвертация чисел Mb, Gb, Tb
function MbOrTb(Byte: Extended): string;
begin
if Byte < 1024 then Result:= NumToStr(Byte) + ' MB' else
if Byte/1024 < 1024 then
  Result:= NumToStr(Byte/1024) + ' GB' else
  Result:= NumToStr(Byte/oneMB) + ' TB';
end;

/// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
  Result := Trim(String)
end;

/// Информация о версии сервис пака
function DecodeSystemStr(Str: String): TWindowsVersion;
var tmp, s: String;
begin
  tmp := str;
  s := Copy(tmp, 1, Pos('.', tmp)-1);
  Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.Major := StrToInt(s);
  s := Copy(tmp, 1, Pos('.', tmp)-1);
  Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.minor := StrToInt(s);
  s := Copy(tmp, 1, Pos('.', tmp)-1);
  Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.Build:= StrToInt(s);
  s := Copy(tmp, 1, Pos('.', tmp)-1);
  Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.ServicePackMajor := StrToInt(s);
end;

/// Информация о версии системы
function HWREQ_CompareWindows: Boolean;
var tmp: TWindowsVersion;
begin
  Result := False;
  tmp := DecodeSystemStr('{#NeedSystem}');
if HWREQ.WinVer.NTPlatform then begin
if (tmp.Major <= HWREQ.WinVer.Major) then
if (tmp.Minor <= HWREQ.WinVer.Minor) then
if (tmp.ServicePackMajor <= HWREQ.WinVer.ServicePackMajor) then
  Result := True;
end;
end;

/// Проверка процессоров
function CheckCPU(NeedMHz: Integer): Boolean;
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 SearchCardName(const DeviceName: String): String;
begin
for i:= 0 to 9 do
  RegQueryStringValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'AdapterDesc', DeviceName);
  Result := DeviceName;
end;

/// Модель Установленной Видеокарты
function CardDeviceName: Boolean;
begin
  SearchCardName(DeviceName);
  Result := (Pos('AMD', DeviceName) <> Pos('Gigabyte', DeviceName)) or (Pos('NVIDIA', DeviceName) <> Pos('MSI', DeviceName)) or (Pos('ASUS', DeviceName) <> Pos('Palit', DeviceName));
end;

// Сведения о Производителе Компьютера
function SystemManufacturer(SManufacturer: String): String;
begin
  RegQueryStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\SystemInformation', 'SystemManufacturer', SManufacturer);
  Result := SManufacturer;
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 InitializeWizard();
begin
  InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
'Программа установки обнаружила следующие наобходимые компоненты.');
with InfoPage do begin
  ChangeText := False

TopText := TNewStaticText.Create(nil)
with TopText do begin
  Parent := InfoPage.Surface
  Left := 0
  Align := alTop;
  AutoSize := True
end;

BottomText := TNewStaticText.Create(nil)
with BottomText do begin
  Parent := InfoPage.Surface
  Caption := 'Когда Вы будете готовы продолжить установку, нажмите "Далее".'
  Font.Color := clBlack
  Left := 0
  Top := 200
  AutoSize := True
end;

SystemPanel := TMemo.Create(nil)
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(nil)
with SystemVersionPanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := SystemPanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := True
end;

/// Информации о системе из реестра
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName', SystemName) then
  HWREQ.WinName := DelSP(SystemName);
  GetWindowsVersionEx(HWREQ.WinVer);

/// Информации о битности системы
if IsWin64 then
  HWREQ.WinBits := 'x64' else
  HWREQ.WinBits := 'x86';

/// Вывод информации о системе
if HWREQ.WinVer.ServicePackMajor > 0 then
  SystemVersionPanel.Text := ' ' + HWREQ.WinName+' SP'+IntToStr(HWREQ.WinVer.ServicePackMajor)+' '+HWREQ.WinBits+
' ('+IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+
'.'+IntToStr(HWREQ.WinVer.Build)+'), '+SystemManufacturer('SManufacturer') else
  SystemVersionPanel.Text := HWREQ.WinName+' '+HWREQ.WinBits+' ('+IntToStr(HWREQ.WinVer.Major)+
'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.Build)+
'); '+SystemManufacturer('SManufacturer');
  SystemVersionPanel.Color := $CCFFCC
if IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.ServicePackMajor) < '{#NeedSystem}'
then begin
  SystemVersionPanel.Color := $CCCCFF
  ChangeText := True
end;

/// Процессор:
ProcessorPanel := TMemo.Create(nil)
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(nil)
with ProcessorMHzPanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := ProcessorPanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := 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 := 'Процессоры';

/// Видеокарта:
VideoPanel := TMemo.Create(nil)
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(nil)
with VideoRAMPanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := VideoPanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := True
end;

  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);
  StringChange(DeviceKey, '\Registry\Machine\', '');
  errCode := 1;
  DeviceValue := 0;

if CardDeviceName then begin
for i := 0 to 9 do
if RegQueryBinaryValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'HardwareInformation.MemorySize',DeviceNamed) then
end else
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceNamed) then
for n := 1 to Length(DeviceNamed) do begin
  DeviceValue := DeviceValue + Ord(DeviceNamed[n])*errCode;
  errCode := errCode*$100;
  end else
if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
else
if CardDeviceName then begin
for i := 0 to 9 do
RegQueryDWordValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'HardwareInformation.MemorySize',DeviceValue);
end 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 CardDeviceName then
  VideoRAMPanel.Text := DelSp(DeviceName) + ', ' + IntToStr(DeviceValue/oneMB) + ' Mb' else
  VideoRAMPanel.Text := DelSp(DeviceName) + ' (Integrated), ' + MbOrTb(DeviceValue/oneMB)
  else begin
if DeviceValue = 0 then
  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)';

/// Звуковая карта:
AudioPanel := TMemo.Create(nil)
with AudioPanel do begin
  Alignment := taCenter
  Parent := InfoPage.Surface
  Left := ScaleX(0)
  Top := VideoPanel.Top + 27
  Text := 'Звуковая карта'
  Width := ScaleX(100)
  Height := ScaleY(22)
  ReadOnly := True
  Color := $EEEEEE
end;

AudioNamePanel := TMemo.Create(nil)
with AudioNamePanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := AudioPanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := True
end;

AudioNamePanel.Color := $CCFFCC;
for errCode := 0 to mixerGetNumDevs do begin
  mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps));
  SoundName := ' '
for n := 0 to 31 do
  SoundName := SoundName + lpCaps.sName[n];
  Delete(SoundName, Pos(Chr(0), SoundName), 31);
  Delete(SoundName, Pos(' [', SoundName), 31);
  StringChange(SoundName, 'SB ', 'Creative ');
  Delete(SoundName, Pos(' Audio', SoundName), 31);
  SetArrayLength(Keys, errCode);
if errCode > 0 then Keys[errCode-1] := SoundName;
end;

/// Вывод информации о звуковой карте
if GetArrayLength(Keys) > 1 then begin
  AudioPanel.Text := 'Звуковые карты';
  AudioNamePanel.Text := '';
for n := 1 to GetArrayLength(Keys) do
  AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1];
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 + ')';

/// Объём памяти (RAM)
RAMPanel := TMemo.Create(nil)
with RAMPanel do begin
  Alignment := taCenter
  Parent := InfoPage.Surface
  Left := ScaleX(0)
  Text := 'Объём памяти'
  Top := AudioPanel.Top + 27
  Width := ScaleX(100)
  Height := ScaleY(22)
  ReadOnly := True
  Color := $EEEEEE
end;

RAMTotalPanel := TMemo.Create(nil)
with RAMTotalPanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := RAMPanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := True
end;

  RAMTotalPanel.Color := $CCFFCC;
if not CheckMemorySize(NeedMB) then begin
  RAMTotalPanel.Color := $CCCCFF;
  ChangeText := True;
end;

/// Вывод информации об установленной памяти
RAMTotalPanel.Text := ' ' + MbOrTb(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB) + ' всего, ' +
MbOrTb((Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys))/oneMB) + ' используется, ' +
MbOrTb(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB) + ' свободно';

/// Виртуальная память (pagefile)
PageFilePanel := TMemo.Create(nil)
with PageFilePanel do begin
  Alignment := taCenter
  Parent := InfoPage.Surface
  Left := ScaleX(0)
  Text := 'Файл подкачки'
  Top := RAMPanel.Top + 27
  Width := ScaleX(100)
  Height := ScaleY(22)
  ReadOnly := True
  Color := $EEEEEE
end;

PageFileTotalPanel := TMemo.Create(nil)
  with PageFileTotalPanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := PageFilePanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := True
end;

/// Вывод информации о файле подкачки
  PageFileTotalPanel.Color := $CCFFCC;
  PageFileTotalPanel.Text := ' ' + MbOrTb((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys))/oneMB) + ' всего, ' +
MbOrTb((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB) + ' занято системным кэшем';
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then begin
  PageFileTotalPanel.Color := $CCCCFF;
  ChangeText := True;
  end;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = InfoPage.ID then begin
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;
end;
И ещё вопрос, как связаны функции, можно ли объединять функции в одну, сильно ли критично изменение названий функций или так не работает? Ругается на одинаковые GetDeviceCaps

(Код из проверки системных требования)
IntToStr(GetSystemMetrics(1)) + ' (' + IntToStr(GetDeviceCaps(CreateDC('DISPLAY','','',0),14) *
GetDeviceCaps(CreateDC('DISPLAY','','',0),12)) + ' bit)';

Код из Splash (пришлось изменить GetDeviceCaps на GetDeviceCaps2 боюсь что-то испортил)


function GetDC(HWND: hWnd): HDC; external 'GetDC@user32.dll stdcall';
function GetDeviceCaps2(HDC: HDC; Index: Integer): Integer; external 'GetDeviceCaps@gdi32.dll stdcall';
function ReleaseDC(HWND: hWnd; DC: HDC): Integer; external 'ReleaseDC@user32.dll stdcall';

function GetMonitorInfo: TPoint;
var
DC: HDC;
Screen, null: TPoint;
begin
Result:=null;
DC:=GetDC(MainForm.Handle);
Screen.x:=GetDeviceCaps2(DC, 08);
Screen.y:=GetDeviceCaps2(DC, 10);
if (Screen.x <> 0) and (Screen.y <> 0) then Result:=Screen;
ReleaseDC(MainForm.Handle, DC);
end;
 

Вложения

AlexZetCrow

Новичок
Нашел решение
Вкратце из предыдущего скажу так

if IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.ServicePackMajor) > '{#NeedSystem}'
Тут есть условия функции сумма меньше больше либо равно заданному числу, так вот!
Я смог разузнать как исправить ситуацию без доступа к необходимой установки, ругался на ОС

Изначально в функции было это значение
if IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.ServicePackMajor) < '{#NeedSystem}'
< '{#NeedSystem}' означает что заданная вами ОС должна быть больше всегда! Что в корне не верно.. Хотя может касаться старых игр, которые на новую ОС не ставится.
#define NeedSystem = "5.1.3"; оставил без изменений

В общем:
= '{#NeedSystem} - Строго под заданную ОС
< '{#NeedSystem} - Только для старых ОС
>'{#NeedSystem} - Только для новых ОС
 

Nemko

Дилетант
Модератор
AlexZetCrow, нет смысла изобретать велосипед, закрепил пример, там убраны строки с изменением параметра Enabled для для NextButton, а также добавлен модуль для создание Splash заставки средствами WinApi (без Dll автор по моему - El Sanchez). Для создания прозрачных Splash необходимо BMP c альфа каналом и глубиной цвета 32-бит, а также с черным фоном (пример там же). Удачи.
 

Вложения

  • 16.2 KB Просмотры: 14

AlexZetCrow

Новичок
Ну я вроде подправил функцию и заработал код ))
Всё равно спасибо, ваш метод явно лучше.
Сейчас разбираюсь со сжатием и распаковкой.. Если есть варианты как сделать, скажите пожалуйста как поэтапно сделать Бины архиватором отдельной подставив их уже в сам код Inno Setup
 

Nemko

Дилетант
Модератор
AlexZetCrow, думаю "Бины" - ".bin" файлы создаваемые Inno Setup, то никак (ИМХО). Стоит посмотреть в сторону ISDone (не знаю доступен ли он) и паковать в архивы (7zip, WinRar, FreeArc).
 

AlexZetCrow

Новичок
AlexZetCrow, думаю "Бины" - ".bin" файлы создаваемые Inno Setup, то никак (ИМХО). Стоит посмотреть в сторону ISDone (не знаю доступен ли он) и паковать в архивы (7zip, WinRar, FreeArc).
Имею в виду Bin созданные 7zip архиватором.

ISDone есть вместе сборкой Прототип скачал. там всё имеется, но ничего не понятно кроме кода, где есть описание о порядке установки бинов, FILES пункт не содержит компонентов, как я понимаю отдельные компоненты надо будет как-то по иному прописывать при использовании ISDone
Также имеется прога для повторного сжатия архивов скачивал отдельно.
 

Andreo Fadio

Ветеран
FILES пункт не содержит компонентов, как я понимаю отдельные компоненты надо будет как-то по иному прописывать при использовании ISDone
Можно и в пункт files прописывать, если они не большого обьема.
 

Andreo Fadio

Ветеран
также добавлен модуль для создание Splash заставки средствами WinApi (без Dll автор по моему - El Sanchez). Для создания прозрачных Splash необходимо BMP c альфа каналом и глубиной цвета 32-бит,
По моему лучше уж dll использовать и подсовывать png без геморроя с форматом. Библиотека для splash заставки все равно весит ни о чем, на весе установки не скажется никак.
 

AlexZetCrow

Новичок
По моему лучше уж dll использовать и подсовывать png без геморроя с форматом. Библиотека для splash заставки все равно весит ни о чем, на весе установки не скажется никак.
Смотри такой вопрос, как можно менять иконки установленных уже папок? Ну или в процессе установки подкидывать свои иконки к этим создаваемым папкам?

Кстати по архивам, не выйдет, разве что отдельно компоненты и то не все можн запихнуть в [FILES]

https://krinkels.org/threads/faq-po-inno-setup.7/ Уже пробовал как он zxcvvcxz и выходит только одна папка, группа всё равно не подкрашивается, пробовал подставлять, ярлыки отдельные указать могу, остальное нет. Помогите пожалуйста
 

Andreo Fadio

Ветеран
Кстати по архивам, не выйдет, разве что отдельно компоненты и то не все можно запихнуть в [FILES]
там можно больше, чем кажется - вы просто не особо разбираетесь.
Смотри такой вопрос, как можно менять иконки установленных уже папок? Ну или в процессе установки подкидывать свои иконки к этим создаваемым папкам?
подбрасывать во время установки и на PostInstall обработке уже делать пропись отображения иконки для конкретной папки, если она существует.
 

AlexZetCrow

Новичок
там можно больше, чем кажется - вы просто не особо разбираетесь.

подбрасывать во время установки и на PostInstall обработке уже делать пропись отображения иконки для конкретной папки, если она существует.
Ну я разобрался, просто вписав ту же иконку, что используется при создании Setup
Тот же метод сработал.. просто нужно было, чтоб имена совпадали, а иконки можно было разные включить.

Ещё такой вопрос, как вписать предупредительное сообщение с ДА НЕТ при не соответствии с минимальными требованиями?

Минимальные требования я брыл с FAQ и там есть одна загвоздка, если не соответствует, то не высвечивается кнопка ДАЛЕЕ
Думал включить каким-нибудь образом ветку с предупредительным сообщением для пользователя и возможностью продолжить установку.


Брал код у SBalykov

Помогите добавить предупредительное сообщение позволяющее сделать кнопку ДАЛЕЕ активной. Спасибо


Код:
Code:
#define NeedSystem = "5.1.3";

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.

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

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
  DISPLAY_DEVICE_PRIMARY_DEVICE = 4;
  oneMB = 1024*1024;
  NeedMHz = 1800;
  NeedVideoRAM = 128;
  NeedSoundCard = 'Creative X-Fi';
  NeedMB = 512;
  NeedPageFile = 1024;

type
#ifdef UNICODE
  PChar = PAnsiChar;
#else
  AnsiChar = Char;
#endif

THardwareRequirementSnapShot = record
  WinName, WinBits, SPack: String;
  WinVer: TWindowsVersion;
end;

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;

TMixerCaps = record
  vPid, vDriverVersion: DWord;
  sName: array [0..31] of Char; Support, cDestinations: DWord;
end;

TMemoryStatusEx = record
  dwLength, dwMemoryLoad: DWord;
  LoTotalPhys, HiTotalPhys, LoAvailPhys, HiAvailPhys,
  LoTotalPageFile, HiTotalPageFile, LoAvailPageFile, HiAvailPageFile,
  LoTotalVirtual, HiTotalVirtual, LoAvailVirtual, HiAvailVirtual, LoAvailExtendedVirtual,
  HiAvailExtendedVirtual: Integer;
end;

var
  InfoPage: TWizardPage;
  TopText, BottomText: TNewStaticText;
  ChangeText: Boolean;
  SystemPanel, ProcessorPanel, VideoPanel,
  AudioPanel, RAMPanel, PageFilePanel: TMemo;
  SystemVersionPanel, ProcessorMHzPanel, VideoRAMPanel,
  AudioNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
  lpCaps: TMixerCaps;
  MemoryEx: TMemoryStatusEx;
  i, n, errCode: Integer;
  Keys: TArrayOfString;
  DeviceValue: Cardinal;
  lpDisplayDevice: PDisplay_Device;
  SystemName, DeviceName, SoundName, DeviceKey, String: String;
  DeviceNamed: AnsiString;
  HWREQ: THardwareRequirementSnapShot;

function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): Boolean; external 'GlobalMemoryStatusEx@kernel32.dll stdcall';
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 'CreateDC{#A}@GDI32 stdcall';
function EnumDisplayDevices(lpDevice, iDevNum: DWord; var lpDisplayDevice: PDisplay_Device; dwFlags: DWord): Boolean; external 'EnumDisplayDevices{#A}@user32.dll stdcall';
function mixerGetDevCaps(uDeviceID: LongInt; var lpCaps: TMixerCaps; uSize: LongInt): LongInt; external 'mixerGetDevCaps{#A}@winmm.dll stdcall';
function mixerGetNumDevs: Integer; external 'mixerGetNumDevs@winmm.dll stdcall';

///Дополнить число до кратного Multiple
function ToMultiple(Bytes, Multiple: Integer): Integer;
begin
if Abs(Bytes/Multiple) > Bytes/Multiple then
  Result := (Bytes/Multiple + 1)*Multiple
  else
  Result := Bytes
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 NumToStr(Float: Extended): string;
begin
  Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
end;

/// Конвертация чисел Mb, Gb, Tb
function MbOrTb(Byte: Extended): string;
begin
if Byte < 1024 then Result:= NumToStr(Byte) + ' MB' else
if Byte/1024 < 1024 then
  Result:= NumToStr(Byte/1024) + ' GB' else
  Result:= NumToStr(Byte/oneMB) + ' TB';
end;

/// Удаление начальных, конечных и повторных пробелов
function DelSp(String: String): String;
begin
while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1);
  Result := Trim(String)
end;

/// Информация о версии сервис пака
function DecodeSystemStr(Str: String): TWindowsVersion;
var tmp, s: String;
begin
  tmp := str;
  s := Copy(tmp, 1, Pos('.', tmp)-1);
  Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.Major := StrToInt(s);
  s := Copy(tmp, 1, Pos('.', tmp)-1);
  Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.minor := StrToInt(s);
  s := Copy(tmp, 1, Pos('.', tmp)-1);
  Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.Build:= StrToInt(s);
  s := Copy(tmp, 1, Pos('.', tmp)-1);
  Delete(tmp, 1, Pos('.', tmp));
if (s <> '') then Result.ServicePackMajor := StrToInt(s);
end;

/// Информация о версии системы
function HWREQ_CompareWindows: Boolean;
var tmp: TWindowsVersion;
begin
  Result := False;
  tmp := DecodeSystemStr('{#NeedSystem}');
if HWREQ.WinVer.NTPlatform then begin
if (tmp.Major <= HWREQ.WinVer.Major) then
if (tmp.Minor <= HWREQ.WinVer.Minor) then
if (tmp.ServicePackMajor <= HWREQ.WinVer.ServicePackMajor) then
  Result := True;
end;
end;

/// Проверка процессоров
function CheckCPU(NeedMHz: Integer): Boolean;
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 SearchCardName(const DeviceName: String): String;
begin
for i:= 0 to 9 do
  RegQueryStringValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'AdapterDesc', DeviceName);
  Result := DeviceName;
end;

/// Модель Установленной Видеокарты
function CardDeviceName: Boolean;
begin
  SearchCardName(DeviceName);
  Result := (Pos('AMD', DeviceName) <> Pos('Gigabyte', DeviceName)) or (Pos('NVIDIA', DeviceName) <> Pos('MSI', DeviceName)) or (Pos('ASUS', DeviceName) <> Pos('Palit', DeviceName));
end;

// Сведения о Производителе Компьютера
function SystemManufacturer(SManufacturer: String): String;
begin
  RegQueryStringValue(HKLM, 'SYSTEM\CurrentControlSet\Control\SystemInformation', 'SystemManufacturer', SManufacturer);
  Result := SManufacturer;
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 InitializeWizard();
begin
  InfoPage := CreateCustomPage(wpLicense, 'Аппаратное и программное обеспечение',
'Программа установки обнаружила следующие наобходимые компоненты.');
with InfoPage do begin
  ChangeText := False

TopText := TNewStaticText.Create(nil)
with TopText do begin
  Parent := InfoPage.Surface
  Left := 0
  Align := alTop;
  AutoSize := True
end;

BottomText := TNewStaticText.Create(nil)
with BottomText do begin
  Parent := InfoPage.Surface
  Caption := 'Когда Вы будете готовы продолжить установку, нажмите "Далее".'
  Font.Color := clBlack
  Left := 0
  Top := 200
  AutoSize := True
end;

SystemPanel := TMemo.Create(nil)
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(nil)
with SystemVersionPanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := SystemPanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := True
end;

/// Информации о системе из реестра
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows NT\CurrentVersion', 'ProductName', SystemName) then
  HWREQ.WinName := DelSP(SystemName);
  GetWindowsVersionEx(HWREQ.WinVer);

/// Информации о битности системы
if IsWin64 then
  HWREQ.WinBits := 'x64' else
  HWREQ.WinBits := 'x86';

/// Вывод информации о системе
if HWREQ.WinVer.ServicePackMajor > 0 then
  SystemVersionPanel.Text := ' ' + HWREQ.WinName+' SP'+IntToStr(HWREQ.WinVer.ServicePackMajor)+' '+HWREQ.WinBits+
' ('+IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+
'.'+IntToStr(HWREQ.WinVer.Build)+'), '+SystemManufacturer('SManufacturer') else
  SystemVersionPanel.Text := HWREQ.WinName+' '+HWREQ.WinBits+' ('+IntToStr(HWREQ.WinVer.Major)+
'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.Build)+
'); '+SystemManufacturer('SManufacturer');
  SystemVersionPanel.Color := $CCFFCC
if IntToStr(HWREQ.WinVer.Major)+'.'+IntToStr(HWREQ.WinVer.Minor)+'.'+IntToStr(HWREQ.WinVer.ServicePackMajor) < '{#NeedSystem}'
then begin
  SystemVersionPanel.Color := $CCCCFF
  ChangeText := True
end;

/// Процессор:
ProcessorPanel := TMemo.Create(nil)
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(nil)
with ProcessorMHzPanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := ProcessorPanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := 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 := 'Процессоры';

/// Видеокарта:
VideoPanel := TMemo.Create(nil)
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(nil)
with VideoRAMPanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := VideoPanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := True
end;

  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);
  StringChange(DeviceKey, '\Registry\Machine\', '');
  errCode := 1;
  DeviceValue := 0;

if CardDeviceName then begin
for i := 0 to 9 do
if RegQueryBinaryValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'HardwareInformation.MemorySize',DeviceNamed) then
end else
if RegQueryBinaryValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceNamed) then
for n := 1 to Length(DeviceNamed) do begin
  DeviceValue := DeviceValue + Ord(DeviceNamed[n])*errCode;
  errCode := errCode*$100;
  end else
if RegQueryDWordValue(HKLM, DeviceKey, 'HardwareInformation.MemorySize', DeviceValue) then
else
if CardDeviceName then begin
for i := 0 to 9 do
RegQueryDWordValue(HKLM,'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}\000'+IntToStr(i),'HardwareInformation.MemorySize',DeviceValue);
end 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 CardDeviceName then
  VideoRAMPanel.Text := DelSp(DeviceName) + ', ' + IntToStr(DeviceValue/oneMB) + ' Mb' else
  VideoRAMPanel.Text := DelSp(DeviceName) + ' (Integrated), ' + MbOrTb(DeviceValue/oneMB)
  else begin
if DeviceValue = 0 then
  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)';

/// Звуковая карта:
AudioPanel := TMemo.Create(nil)
with AudioPanel do begin
  Alignment := taCenter
  Parent := InfoPage.Surface
  Left := ScaleX(0)
  Top := VideoPanel.Top + 27
  Text := 'Звуковая карта'
  Width := ScaleX(100)
  Height := ScaleY(22)
  ReadOnly := True
  Color := $EEEEEE
end;

AudioNamePanel := TMemo.Create(nil)
with AudioNamePanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := AudioPanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := True
end;

AudioNamePanel.Color := $CCFFCC;
for errCode := 0 to mixerGetNumDevs do begin
  mixerGetDevCaps(errCode-1, lpCaps, SizeOf(lpCaps));
  SoundName := ' '
for n := 0 to 31 do
  SoundName := SoundName + lpCaps.sName[n];
  Delete(SoundName, Pos(Chr(0), SoundName), 31);
  Delete(SoundName, Pos(' [', SoundName), 31);
  StringChange(SoundName, 'SB ', 'Creative ');
  Delete(SoundName, Pos(' Audio', SoundName), 31);
  SetArrayLength(Keys, errCode);
if errCode > 0 then Keys[errCode-1] := SoundName;
end;

/// Вывод информации о звуковой карте
if GetArrayLength(Keys) > 1 then begin
  AudioPanel.Text := 'Звуковые карты';
  AudioNamePanel.Text := '';
for n := 1 to GetArrayLength(Keys) do
  AudioNamePanel.Text := AudioNamePanel.Text + Keys[n-1];
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 + ')';

/// Объём памяти (RAM)
RAMPanel := TMemo.Create(nil)
with RAMPanel do begin
  Alignment := taCenter
  Parent := InfoPage.Surface
  Left := ScaleX(0)
  Text := 'Объём памяти'
  Top := AudioPanel.Top + 27
  Width := ScaleX(100)
  Height := ScaleY(22)
  ReadOnly := True
  Color := $EEEEEE
end;

RAMTotalPanel := TMemo.Create(nil)
with RAMTotalPanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := RAMPanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := True
end;

  RAMTotalPanel.Color := $CCFFCC;
if not CheckMemorySize(NeedMB) then begin
  RAMTotalPanel.Color := $CCCCFF;
  ChangeText := True;
end;

/// Вывод информации об установленной памяти
RAMTotalPanel.Text := ' ' + MbOrTb(Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys)/oneMB) + ' всего, ' +
MbOrTb((Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys) -
Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys))/oneMB) + ' используется, ' +
MbOrTb(Size64(MemoryEx.HiAvailPhys, MemoryEx.LoAvailPhys)/oneMB) + ' свободно';

/// Виртуальная память (pagefile)
PageFilePanel := TMemo.Create(nil)
with PageFilePanel do begin
  Alignment := taCenter
  Parent := InfoPage.Surface
  Left := ScaleX(0)
  Text := 'Файл подкачки'
  Top := RAMPanel.Top + 27
  Width := ScaleX(100)
  Height := ScaleY(22)
  ReadOnly := True
  Color := $EEEEEE
end;

PageFileTotalPanel := TMemo.Create(nil)
  with PageFileTotalPanel do begin
  Alignment := taLeftJustify
  Parent := InfoPage.Surface
  Left := ScaleX(104)
  Top := PageFilePanel.Top
  Width := ScaleX(310)
  Height := ScaleY(22)
  ReadOnly := True
end;

/// Вывод информации о файле подкачки
  PageFileTotalPanel.Color := $CCFFCC;
  PageFileTotalPanel.Text := ' ' + MbOrTb((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiTotalPhys, MemoryEx.LoTotalPhys))/oneMB) + ' всего, ' +
MbOrTb((Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile) -
Size64(MemoryEx.HiAvailPageFile, MemoryEx.LoAvailPageFile))/oneMB) + ' занято системным кэшем';
if Size64(MemoryEx.HiTotalPageFile, MemoryEx.LoTotalPageFile)/oneMB < NeedPageFile then begin
  PageFileTotalPanel.Color := $CCCCFF;
  ChangeText := True;
  end;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = InfoPage.ID then begin
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;
end;

Внизу представил фото иконок, о которых говорил работают они сейчас так и системные требования с которыми хочется разобраться.
 

Вложения

Andreo Fadio

Ветеран
Помогите добавить предупредительное сообщение позволяющее сделать кнопку ДАЛЕЕ активной. Спасибо
проще сделать кнопку активной всегда и повесить предупреждение по нажатию на кнопку Далее

 

Вложения

AlexZetCrow

Новичок
проще сделать кнопку активной всегда и повесить предупреждение по нажатию на кнопку Далее


Вы гений!)))
Вам уже говорили?
Просто вы столь терпеливы на новичков вроде меня и во стольких вопросах мне помогли))
Без вас ничего бы не вышло ))
 

Andreo Fadio

Ветеран

zettend

Старожил
Народ, выручайте. Возможно заставить батник делать так:
У меня в папке /data есть структура типа /data/data1; /data/data2

Возможно как-то сделать, что-бы батник искал все папки в data, в моем случае это data1, data2... и создавал соответственно архивы содержимого этих папок, например:
/data1/*.* > data1.bin
/data2/*.* > data2.bin
Ну и что-бы архивы содержали в себе не саму папку, а её содержимое.

В данный момент использую батники Тимика
Код:
@Echo Off
Color 0B

Title MaxArc By Timick
@Echo.***************************************************
@Echo.*                                                 *
@Echo.*                MaxArc By Timick                 *
@Echo.*                                                 *
@Echo.***************************************************
TimeOut 2
CLS

set STARTTIME=%TIME%
PackEXE\arc.exe a -s; -ep1 -di -i2 -r -ed -hp1g2x3h7421 -mMAX GameSetup\DataARC_MAX.bin PackedData\*.*
set ENDTIME=%TIME%

for /F "tokens=1-4 delims=:.," %%a in ("%STARTTIME%") do (set /A "start=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100")
for /F "tokens=1-4 delims=:.," %%a in ("%ENDTIME%") do (set /A "end=(((%%a*60)+1%%b %% 100)*60+1%%c %% 100)*100+1%%d %% 100")
set /A elapsed=end-start
set /A hh=elapsed/(60*60*100), rest=elapsed%%(60*60*100), mm=rest/(60*100), rest%%=60*100, ss=rest/100, cc=rest%%100
if %hh% lss 10 set hh=0%hh%
if %mm% lss 10 set mm=0%mm%
if %ss% lss 10 set ss=0%ss%
if %cc% lss 10 set cc=0%cc%
set DURATION=%hh%:%mm%:%ss%,%cc%

@Echo.*****************************************************
@Echo.*                                                   *
@Echo.*           Started Pack  : %STARTTIME%             *
@Echo.*           Finished Pack : %ENDTIME%             *
@Echo.*                                                   *
@Echo.*           Total  Time   : %DURATION%             *
@Echo.*                                                   *
@Echo.*****************************************************
@Echo.

Pause
 

Aron

Мимокрокодил
Объясните пожалуйста, почему у меня нет ссылок для скачивания?
Потому что я новичек? Или браузер нужен поновее? Или что нибудь еще?
 
Сверху