Ru-Board.club
← Вернуться в раздел «Программы»

» Inno Setup (создание инсталяционных пакетов)

Автор: DuhaLab
Дата сообщения: 07.06.2007 18:15
Sero

Респект и уважуха!!!!!!

Небольшая ошибка вот: "Invalid number of parametres" на строку "Page.Values := ExpandConstant('{pf}\My Company\Backup');" как исправить?

Вроде бы как исправил: везде в Page.Values добавил [0] вроде пашет, это правильно??? или как по иному...
Автор: Sero
Дата сообщения: 07.06.2007 22:43

Цитата:
Вроде бы как исправил: везде в Page.Values добавил [0] вроде пашет, это правильно??? или как по иному...

Все правильно


Добавлено:
И еще:
В секции Files у тебя должно быть так:
Source: Files\*; DestDir: {code:GetDir}; Flags: ignoreversion; Check: Russian

Нужно добавить Check: Russian
Автор: DuhaLab
Дата сообщения: 08.06.2007 04:25

Цитата:
Нужно добавить Check: Russian


Этото понятно, значится буду делать дальше, ещё раз спасибо...

Добавлено:
Вопрос: всё работает, но почему то очень медленно идёт установка файлов (сразу скажу, их много), выбранных по данному методу (вторая папка), что подскажешь???? как увеличить скорость установки

Проблема решается, если поставить флаг на "не сжимать" но проблема, что размер на много увеличивается
Автор: Sero
Дата сообщения: 08.06.2007 13:50
DuhaLab
Не знаю как решить эту проблему!
Автор: DuhaLab
Дата сообщения: 08.06.2007 16:09
Sero

в принципе частично решилась, я убрал "непрерывное сжатие" но размер всё равно чутка больше
Автор: iTASmania_Inc
Дата сообщения: 08.06.2007 22:34
Подскажите, пожалуйста, как сделать так, чтобы инсталлятор находил запись в реестре с указанием папки уже установленной программы и предлагал пользователю установить обновление (ну прсто файлы дописать) только в эту папку?

Добавлено:
И ещё: как в этом коде сделать так, чтобы отображались имена копируемых (устанавливаемых) файлов (wpInstalling):

[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName=C:\AppName

[Files]
Source: Files\*; DestDir: {app}; BeforeInstall: MySleep

[Code]
const
SleepTime = 2000;

procedure MySleep();
begin
Sleep(SleepTime);
end;
Автор: paRUS_51
Дата сообщения: 09.06.2007 02:23

Цитата:
Подскажите, пожалуйста, как сделать так, чтобы инсталлятор находил запись в реестре с указанием папки уже установленной программы и предлагал пользователю установить обновление (ну прсто файлы дописать) только в эту папку?


#define AppName "IconDeveloper"

[Setup]
AppName=IconDeveloper
AppVerName=IconDeveloper

DisableDirPage=yes
DefaultDirName={reg:HKLM\SOFTWARE\Stardock\ObjectDesktop\IconDeveloper,Path|}

[Files]
Source: "Files\*"; DestDir: "{app}"; Flags: ignoreversion;

[Code]
Function InitializeSetup(): Boolean; Begin
Result := True;
If RegKeyExists(HKLM, 'SOFTWARE\Stardock\ObjectDesktop\IconDeveloper') Then Begin // Указываешь нужный пункт в реестре
Result := MsgBox('Программа '+ExpandConstant('{#AppName}')+' успешно найдена на вашем ПК.' #13#13 'Установить обновление?', mbConfirmation, MB_YESNO) = idYes;
End Else Begin MsgBox('Программа '+ExpandConstant('{#AppName}')+' не найдена', mbInformation, MB_OK); Result := False; End;
End;

Добавлено:

Цитата:
И ещё: как в этом коде сделать так, чтобы отображались имена копируемых (устанавливаемых) файлов (wpInstalling):

[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName=C:\AppName

[Files]
Source: Files\*; DestDir: {app}; BeforeInstall: MySleep

[Code]
const
SleepTime = 2000;

procedure MySleep();
begin
Sleep(SleepTime);
end;




Получилось реализовать только таким образом:
*******************КОД******************************************************

[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName=C:\AppName

[Files]
Source: Files\*; DestDir: {app}; BeforeInstall: MySleep

[Code]
const
SleepTime = 2000;

procedure MySleep();
begin
WizardForm.FileNameLabel.Caption := CurrentFileName;
Sleep(SleepTime);
end;

****************************************************************************




Добавлено:
iTASmania_Inc

Извиняюсь, малость неправильно написал, измени:
C - WizardForm.FileNameLabel.Caption := CurrentFileName;
На - WizardForm.FileNameLabel.Caption := ExpandConstant(CurrentFileName);
Автор: maxdddca123
Дата сообщения: 09.06.2007 08:45
paRUS_51
Что то у меня с этим кода около 5000 мелких файло распаковываются пол секунды.... Почему ?
Автор: Kirgyz
Дата сообщения: 09.06.2007 09:41
Люди, помогите маленько мне

короче хочу узнать код:

1) чтобы увеличить размер второго маленького изображения инсталлятора (WizardSmallImage 55*55) . Хочется пошире вставить картинку

2) чтобы при выборе папки установке внизу отобржались сразу все локальные диски для удобного выбора ( такое я видел в скрипте с проверкой сист. требований Виктора Доброва, но сам вытащить не могу )

плиз, скажите, срочно надо сделать
Автор: Sero
Дата сообщения: 09.06.2007 09:54
Kirgyz

Цитата:
чтобы увеличить размер второго маленького изображения инсталлятора (WizardSmallImage 55*55) . Хочется пошире вставить картинку


Вот пример:

Код:
procedure InitializeWizard();
begin
with WizardForm do
begin
WizardSmallBitmapImage.Left:=WizardForm.WizardSmallBitmapImage.Left-120
WizardSmallBitmapImage.Width:=177
PageNameLabel.Width:=290
PageDescriptionLabel.Width:=280
end
end;
Автор: iTASmania_Inc
Дата сообщения: 09.06.2007 10:11
paRUS_51
Спасибо большое! ОЧЕНЬ помог!
Автор: Kirgyz
Дата сообщения: 09.06.2007 10:31
Sero
спасибо!
Автор: Victor_Dobrov
Дата сообщения: 09.06.2007 18:57
Corona Skin & SysInfo - обложка Inno Setup со встроенной проверкой системных требований. Небольшие исправления прорисовки кнопок и не только... Увеличит объём инсталлятора всего на 71Кб.
Автор: Sanssanssans
Дата сообщения: 09.06.2007 23:20
Народ помогите пожалуйста: как сделать,чтобы инсталлятор делал бэкап замененных файлов?Например,я устанавливаю в папку ХХХ ,и надо,чтобы в этой папке создалась др.папка,например, ААА и в ней были все заменеенные файлы и файл деинсталляции. Если до меня спрашивали,сильно не пинайте,просто в инете с телефона и все прочитать не удается.
Автор: pom205
Дата сообщения: 10.06.2007 00:04
Да-а, просто гигантские размеры инсталляционного модуля получаются.
Примерно как в Astrum.

Добавлено:
Меня инсталляторы интересуют лишь в плане портабилизации сложных приложений.
Нельзя ли как то решить такую задачку. Чтобы приложение, после работы само забирало свои настройки из конф-файлов и реестра, вертало всё на место(словно его и не было), и само себя перепаковывало обратно с новыми - изменившимися настройками?

Добавлено:
Пока реализую архиваторами с самораспаковкой 7z, WinRK и bat-файлами унутрях.
Но в таких случаях приходится в инсталлятор кидать и сам архиватор, после чего бинарным склеиванием грубо прибиваю спереди sfx-модуль.
Автор: Sampron
Дата сообщения: 10.06.2007 00:43
pom205
Используй NSIS у него меньше инсталляционный модуль (46кб).
Автор: pom205
Дата сообщения: 10.06.2007 01:15
Sampron
Использую, в числе многих других. Инсталлеры для моих задач не самоцель.
Я только прокачиваю возможности наиболее удобной реализации своих идей обустройства своих же идей. Тафталогия. Но их же (идей опять же(не подумайте чего)) - в секунду - миллионы.
Автор: iTASmania_Inc
Дата сообщения: 11.06.2007 00:36
Подмкажите, пожалуйста, реально ли с помощью Restorator'a или Res Hacker'a создать в ресурсах (где-нибудь в Setup.e32) новую страницу WizardPage? И если да - то как?
Автор: Sampron
Дата сообщения: 11.06.2007 00:55
iTASmania_Inc
Наврядли это можно сделать, новую страницу можно сделать через код.
Автор: iTASmania_Inc
Дата сообщения: 11.06.2007 07:32
Sampron
Блин, так сделал через код! Только она идёт как CustomCreatePage! Не понимаю, как на такой странице заблокировать кнопку Далее на странице проверки системных требований!!! Пробовал WizardForm.NextButton.Enabled:=False - не получается, хотя в том же скине от Виктора Доброва всё идёт нормально! Такое ощущение, что через ресурсы сделать это легче! Если можешь, то глянь, пожалуйста, этот скрипт:
[more=SystemTest]
[Setup]
AppName=SystemTest
AppVerName=SystemTest <Version>
CreateAppDir=false

[Files]
Source: get_hw_caps.dll; Flags: dontcopy

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

[Code]
const oneMB = 1024*1024; BufferLen = 50;
type TMemoryStatus = record dwLength, dwMemoryLoad, dwTotalPhys, dwAvailPhys, dwTotalPageFile, dwAvailPageFile, dwTotalVirtual, dwAvailVirtual: Longint; end;
var Memory: TMemoryStatus; FreeMB, TotalMB: Cardinal; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; i: Integer; VolumeName, FileSystemName: String; ListBox: TListBox;

procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus);
external 'GlobalMemoryStatus@kernel32.dll';

function GetVideoCardName(): PChar;
external 'hwc_GetVideoCardName@files:get_hw_caps.dll stdcall';

function GetSoundCardName(): PChar;
external 'hwc_GetSoundCardName@files:get_hw_caps.dll stdcall';

function GetHardDriveFreeSpace(hdd: integer): Integer;
external 'hwc_GetHardDriveFreeSpace@files:get_hw_caps.dll stdcall';

function GetHardDriveName(hdd: Integer): PChar;
external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall';

function GetHardDriveTotalSpace(hdd: integer): Integer;
external 'hwc_GetHardDriveTotalSpace@files:get_hw_caps.dll stdcall';

function GetHardDrivesCount(): Integer;
external 'hwc_GetHardDrivesCount@files:get_hw_caps.dll stdcall';

function GetSoundCards(): Integer;
external 'hwc_GetSoundCards@files:get_hw_caps.dll stdcall';

function GetSystemPage(): Integer;
external 'hwc_GetSystemPage@files:get_hw_caps.dll stdcall';

function GetSystemPhys(): Integer;
external 'hwc_GetSystemPhys@files:get_hw_caps.dll stdcall';

function GetVidMemLocal(): Integer;
external 'hwc_GetVidMemLocal@files:get_hw_caps.dll stdcall';

function GetSystemMetrics(nIndex: Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';

function GetVolumeInformation(PathName, VolumeName: PChar; VolumeNameSize, VolumeSerialNumber, MaxComponentLength, FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint;
external 'GetVolumeInformationA@kernel32.dll stdcall';

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

function MorG(MB, onlyMB: Integer): String; // Значение в строку объёма Мб/Гб (Гб округлим до 3-ёх знаков после запятой)
    begin if (MB < 1000) or (onlyMB > 0) then Result:= IntToStr(MB)+ 'Мб' else Result:= FloatToStr(round(MB/1024*1000)/1000)+ 'Гб' end;

function CheckSystemPage(PreviousPageId: Integer): Integer;
var
SysTestPage: TWizardPage;
ProcessorName: string;

Processor, VideoCardPanel, AudioCardPanel, RAMPanel, PageFilePanel: TMemo;
ProcessorNamePanel, VideoCardNamePanel, AudioCardNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;

ProcessorMHZ: Cardinal;
StaticText, StaticText2: TNewStaticText;
begin
RegQueryStringValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', 'ProcessorNameString', ProcessorName);
RegQueryDWordValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', '~MHz', ProcessorMHZ);
GetVidMemLocal;
GetSoundCards;
GlobalMemoryStatus(Memory);

SysTestPage := CreateCustomPage(PreviousPageId, 'Аппаратное обеспечение', 'Программа установки обнаружила следующие необходимые компоненты');

StaticText := TNewStaticText.Create(SysTestPage);
with StaticText do
begin
Parent := SysTestPage.Surface;
Caption := 'Все компоненты соответствуют требованиям программы.';
StaticText.Font.Color:=clGreen;
Left := 0;
Top := 0;
AutoSize := True;
end;

StaticText2 := TNewStaticText.Create(SysTestPage);
with StaticText2 do
begin
Parent := SysTestPage.Surface;
Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».';
Left := 0;
Top := 220;
AutoSize := True;
end;

//******************************************* [Начало - Процессор] ***************************************************//

Processor := TMemo.Create(SysTestPage);
with Processor do
begin
Text := ' Процессор';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;

Left := ScaleX(0);
Top := ScaleY(30);
Width := ScaleX(100);
Height := ScaleY(22);

ReadOnly := True;
Color := $EEEEEE;
end;


ProcessorNamePanel := TMemo.Create(SysTestPage);
with ProcessorNamePanel do
begin
Text := ' ' + DelSp(ProcessorName) + ' ~' + IntToStr(ProcessorMHZ) + ' MHz';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;

Left := ScaleX(104);
Top := ScaleY(30);
Width := ScaleX(313);
Height := ScaleY(22);

ReadOnly := True;
Color := $CCFFCC;
end;

if ProcessorMHZ < 1800 then //Минимальное значение частоты в MHz
begin
StaticText.Caption := 'Не все компоненты удовлетворяют требованиям программы.';
StaticText.Font.Color := clRed;
ProcessorNamePanel.Color := $CCCCFF;
end;


//******************************************* [Конец - Процессор] ****************************************************//


//******************************************* [Начало - Видеоадаптер] ************************************************//

VideoCardPanel := TMemo.Create(SysTestPage);
with VideoCardPanel do
begin
Text := ' Видеоадаптер';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;

Left := ScaleX(0);
Top := Processor.Top + 27;
Width := ScaleX(100);
Height := ScaleY(22);

ReadOnly := True;
Color := $EEEEEE;
end;

VideoCardNamePanel := TMemo.Create(SysTestPage);
with VideoCardNamePanel do
begin
Text := ' ' + DelSp(GetVideoCardName) + ', '+ MorG(round(GetVidMemLocal/oneMB/64)*64,1) + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +IntToStr(GetSystemMetrics(1));;
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;

Left := ScaleX(104);
Top := VideoCardPanel.Top;
Width := ScaleX(313);
Height := ScaleY(22);

ReadOnly := True;
Color := $CCFFCC;
end;

if round(GetVidMemLocal/oneMB/64)*64 < 128 then //Минимальный объём ОЗУ видеоадаптера в Мб
begin
StaticText.Caption := 'Не все компоненты удовлетворяют требованиям программы.';
StaticText.Font.Color := clRed;
VideoCardNamePanel.Color := $CCCCFF;
end;

//******************************************* [Конец - Видеоадаптер] *************************************************//


//******************************************* [Начало - Звуковая карта] **********************************************//

AudioCardPanel := TMemo.Create(SysTestPage);
with AudioCardPanel do
begin
Text := ' Звуковая карта';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;

Left := ScaleX(0);
Top := VideoCardPanel.Top + 27;
Width := ScaleX(100);
Height := ScaleY(22);

ReadOnly := True;
Color := $EEEEEE;
end;

AudioCardNamePanel := TMemo.Create(SysTestPage);
with AudioCardNamePanel do
begin
Text := ' ' + DelSp(GetSoundCardName) + ' (рекомендуется Creative X-Fi)';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;

Left := ScaleX(104);
Top := AudioCardPanel.Top;
Width := ScaleX(313);
Height := ScaleY(22);

ReadOnly := True;
Color := $CCFFCC;
end;

if
GetSoundCards = 0 then
begin
AudioCardNamePanel.Text:=' Устройство не обнаружено';
StaticText.Caption := 'Не все компоненты удовлетворяют требованиям программы.';
StaticText.Font.Color := clRed;
AudioCardNamePanel.Color := $CCCCFF;
end;

//******************************************* [Конец - Звуковая карта] ***********************************************//


//******************************************* [Начало - ОЗУ] *********************************************************//

RAMPanel := TMemo.Create(SysTestPage);
with RAMPanel do
begin
Text := ' ОЗУ';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;

Left := ScaleX(0);
Top := AudioCardPanel.Top + 27;
Width := ScaleX(100);
Height := ScaleY(22);

ReadOnly := True;
Color := $EEEEEE;
end;

RAMTotalPanel := TMemo.Create(SysTestPage);
with RAMTotalPanel do
begin
Text := ' ' + MorG(round(Memory.dwTotalPhys/oneMB/64)*64,1) + ' всего, ' + MorG(Memory.dwAvailPhys/oneMB,1) +' свободно, ' + MorG((Memory.dwTotalPhys - Memory.dwAvailPhys)/oneMB,1) +' используется';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;

Left := ScaleX(104);
Top := RAMPanel.Top;
Width := ScaleX(313);
Height := ScaleY(22);

ReadOnly := True;
Color := $CCFFCC;
end;

if round(Memory.dwTotalPhys/oneMB/64)*64 < 512 then //Минимальный объём ОЗУ в Мб
begin
StaticText.Caption := 'Не все компоненты удовлетворяют требованиям программы.';
StaticText.Font.Color := clRed;
RAMTotalPanel.Color := $CCCCFF;
end;

//******************************************* [Конец - ОЗУ] **********************************************************//


//******************************************* [Начало - Файл подкачки] ***********************************************//

PageFilePanel := TMemo.Create(SysTestPage);
with PageFilePanel do
begin
Text := ' Файл подкачки';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;

Left := ScaleX(0);
Top := RAMPanel.Top + 27;
Width := ScaleX(100);
Height := ScaleY(22);

ReadOnly := True;
Color := $EEEEEE;
end;

PageFileTotalPanel := TMemo.Create(SysTestPage);
with PageFileTotalPanel do
begin
Text := ' '+MorG(GetSystemPage,1)+' всего, ' + MorG((Memory.dwTotalPageFile - Memory.dwAvailPageFile)/oneMB,0) + ' занято системным кэшем';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;

Left := ScaleX(104);
Top := PageFilePanel.Top;
Width := ScaleX(313);
Height := ScaleY(22);

ReadOnly := True;
Color := $CCFFCC;
end;

if GetSystemPage < 768 then //Минимальный объём файла подкачки в Мб
begin
StaticText.Caption := 'Не все компоненты удовлетворяют требованиям программы.';
StaticText.Font.Color := clRed;
PageFileTotalPanel.Color := $CCCCFF;
end;

Result := SysTestPage.ID;
end;

//******************************************* [Конец - Файл подкачки] ************************************************//

procedure ListBoxOnClick(Sender: TObject);
    begin for i:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[i] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[i],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text)); end;

procedure InitializeWizard();

var
SysTestPage: TWizardPage;
Text: TNewStaticText;
Memo: TMemo;

begin
CheckSystemPage(wpWelcome);

ListBox:= TListBox.Create(WizardForm)
with ListBox do begin
    Color:= $EEEEEE; Font.Size:= 10; Font.Name:= 'Tahoma'; Font.Style:=[fsBold]; Parent:= WizardForm.SelectDirPage; OnClick:= @ListBoxOnClick; Top:= WizardForm.DirEdit.Top +WizardForm.DirEdit.Height +ScaleY(30); Width:= WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left; Height:= WizardForm.DiskSpaceLabel.Top -Top -9;
    FileSystemName:= StringOfChar(' ', BufferLen); VolumeName:= StringOfChar(' ', BufferLen);
    for i:=0 to GetHardDrivesCount-1 do begin
    GetSpaceOnDisk(GetHardDriveName(i), True, FreeMB, TotalMB); GetVolumeInformation(GetHardDriveName(i), VolumeName, BufferLen-1, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, BufferLen-1);
    Items.Add(Copy(Uppercase(GetHardDriveName(i)),0,2)+ Copy(' ',0,14-Length(MorG(TotalMB,0)))+ MorG(TotalMB,0)+ Copy(' всего, ',0,17-Length(MorG(FreeMB,0)))+ MorG(FreeMB,0)+ Copy(' (0',0,4-Length(IntToStr(round(FreeMB/TotalMB*100)))) + FloatToStr(round(FreeMB/TotalMB*100))+ '%) свободно, '+ FileSystemName); end;
end;
    with TNewStaticText.Create(WizardForm) do begin Top:= WizardForm.DirEdit.Top +WizardForm.DirEdit.Height +ScaleY(8); Caption:='Список локальных дисков, присутствующих в системе:'; Parent:= WizardForm.SelectDirPage; end;
end;
[/more]
Автор: Sampron
Дата сообщения: 11.06.2007 11:34
iTASmania_Inc
Попробуй [more=Так][Setup]
AppName=SystemTest
AppVerName=SystemTest <Version>
CreateAppDir=false

[Files]
Source: compiler:get_hw_caps.dll; Flags: dontcopy

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

[Code]
const oneMB = 1024*1024; BufferLen = 50;
type TMemoryStatus = record dwLength, dwMemoryLoad, dwTotalPhys, dwAvailPhys, dwTotalPageFile, dwAvailPageFile, dwTotalVirtual, dwAvailVirtual: Longint; end;
var Memory: TMemoryStatus; FreeMB, TotalMB: Cardinal; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; i: Integer; VolumeName, FileSystemName: String; ListBox: TListBox;
ProcessorName: string;
Processor, VideoCardPanel, AudioCardPanel, RAMPanel, PageFilePanel: TMemo;
ProcessorNamePanel, VideoCardNamePanel, AudioCardNamePanel, RAMTotalPanel, PageFileTotalPanel: TMemo;
ProcessorMHZ: Cardinal;
StaticText, StaticText2: TNewStaticText;
SysTestPage: TWizardPage;
Text: TNewStaticText;
Memo: TMemo;

procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus);
external 'GlobalMemoryStatus@kernel32.dll';

function GetVideoCardName(): PChar;
external 'hwc_GetVideoCardName@files:get_hw_caps.dll stdcall';

function GetSoundCardName(): PChar;
external 'hwc_GetSoundCardName@files:get_hw_caps.dll stdcall';

function GetHardDriveFreeSpace(hdd: integer): Integer;
external 'hwc_GetHardDriveFreeSpace@files:get_hw_caps.dll stdcall';

function GetHardDriveName(hdd: Integer): PChar;
external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall';

function GetHardDriveTotalSpace(hdd: integer): Integer;
external 'hwc_GetHardDriveTotalSpace@files:get_hw_caps.dll stdcall';

function GetHardDrivesCount(): Integer;
external 'hwc_GetHardDrivesCount@files:get_hw_caps.dll stdcall';

function GetSoundCards(): Integer;
external 'hwc_GetSoundCards@files:get_hw_caps.dll stdcall';

function GetSystemPage(): Integer;
external 'hwc_GetSystemPage@files:get_hw_caps.dll stdcall';

function GetSystemPhys(): Integer;
external 'hwc_GetSystemPhys@files:get_hw_caps.dll stdcall';

function GetVidMemLocal(): Integer;
external 'hwc_GetVidMemLocal@files:get_hw_caps.dll stdcall';

function GetSystemMetrics(nIndex: Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';

function GetVolumeInformation(PathName, VolumeName: PChar; VolumeNameSize, VolumeSerialNumber, MaxComponentLength, FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint;
external 'GetVolumeInformationA@kernel32.dll stdcall';

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

function MorG(MB, onlyMB: Integer): String; // Значение в строку объёма Мб/Гб (Гб округлим до 3-ёх знаков после запятой)
begin if (MB < 1000) or (onlyMB > 0) then Result:= IntToStr(MB)+ 'Мб' else Result:= FloatToStr(round(MB/1024*1000)/1000)+ 'Гб' end;

procedure ListBoxOnClick(Sender: TObject);
begin for i:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[i] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[i],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text)); end;

procedure InitializeWizard();
begin
RegQueryStringValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', 'ProcessorNameString', ProcessorName);
RegQueryDWordValue(HKLM, 'HARDWARE\DESCRIPTION\System\CentralProcessor\0', '~MHz', ProcessorMHZ);
GetVidMemLocal;
GetSoundCards;
GlobalMemoryStatus(Memory);

SysTestPage := CreateCustomPage(wpWelcome, 'Аппаратное обеспечение', 'Программа установки обнаружила следующие необходимые компоненты');

StaticText := TNewStaticText.Create(SysTestPage);
with StaticText do
begin
Parent := SysTestPage.Surface;
Caption := 'Все компоненты соответствуют требованиям программы.';
StaticText.Font.Color:=clGreen;
Left := 0;
Top := 0;
AutoSize := True;
end;

StaticText2 := TNewStaticText.Create(SysTestPage);
with StaticText2 do
begin
Parent := SysTestPage.Surface;
Caption := 'Когда Вы будете готовы продолжить установку, нажмите «Далее».';
Left := 0;
Top := 220;
AutoSize := True;
end;

//******************************************* [Начало - Процессор] ***************************************************//

Processor := TMemo.Create(SysTestPage);
with Processor do
begin
Text := ' Процессор';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;
Left := ScaleX(0);
Top := ScaleY(30);
Width := ScaleX(100);
Height := ScaleY(22);
ReadOnly := True;
Color := $EEEEEE;
end;

ProcessorNamePanel := TMemo.Create(SysTestPage);
with ProcessorNamePanel do
begin
Text := ' ' + DelSp(ProcessorName) + ' ~' + IntToStr(ProcessorMHZ) + ' MHz';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;
Left := ScaleX(104);
Top := ScaleY(30);
Width := ScaleX(313);
Height := ScaleY(22);
ReadOnly := True;
Color := $CCFFCC;
end;

//******************************************* [Конец - Процессор] ****************************************************//


//******************************************* [Начало - Видеоадаптер] ************************************************//

VideoCardPanel := TMemo.Create(SysTestPage);
with VideoCardPanel do
begin
Text := ' Видеоадаптер';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;
Left := ScaleX(0);
Top := Processor.Top + 27;
Width := ScaleX(100);
Height := ScaleY(22);
ReadOnly := True;
Color := $EEEEEE;
end;

VideoCardNamePanel := TMemo.Create(SysTestPage);
with VideoCardNamePanel do
begin
Text := ' ' + DelSp(GetVideoCardName) + ', '+ MorG(round(GetVidMemLocal/oneMB/64)*64,1) + ', ' + IntToStr(GetSystemMetrics(0)) + 'x' +IntToStr(GetSystemMetrics(1));;
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;
Left := ScaleX(104);
Top := VideoCardPanel.Top;
Width := ScaleX(313);
Height := ScaleY(22);
ReadOnly := True;
Color := $CCFFCC;
end;

//******************************************* [Конец - Видеоадаптер] *************************************************//


//******************************************* [Начало - Звуковая карта] **********************************************//

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

AudioCardNamePanel := TMemo.Create(SysTestPage);
with AudioCardNamePanel do
begin
Text := ' ' + DelSp(GetSoundCardName) + ' (рекомендуется Creative X-Fi)';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;
Left := ScaleX(104);
Top := AudioCardPanel.Top;
Width := ScaleX(313);
Height := ScaleY(22);
ReadOnly := True;
Color := $CCFFCC;
end;

//******************************************* [Конец - Звуковая карта] ***********************************************//


//******************************************* [Начало - ОЗУ] *********************************************************//

RAMPanel := TMemo.Create(SysTestPage);
with RAMPanel do
begin
Text := ' ОЗУ';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;
Left := ScaleX(0);
Top := AudioCardPanel.Top + 27;
Width := ScaleX(100);
Height := ScaleY(22);
ReadOnly := True;
Color := $EEEEEE;
end;

RAMTotalPanel := TMemo.Create(SysTestPage);
with RAMTotalPanel do
begin
Text := ' ' + MorG(round(Memory.dwTotalPhys/oneMB/64)*64,1) + ' всего, ' + MorG(Memory.dwAvailPhys/oneMB,1) +' свободно, ' + MorG((Memory.dwTotalPhys - Memory.dwAvailPhys)/oneMB,1) +' используется';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;
Left := ScaleX(104);
Top := RAMPanel.Top;
Width := ScaleX(313);
Height := ScaleY(22);
ReadOnly := True;
Color := $CCFFCC;
end;

//******************************************* [Конец - ОЗУ] **********************************************************//


//******************************************* [Начало - Файл подкачки] ***********************************************//

PageFilePanel := TMemo.Create(SysTestPage);
with PageFilePanel do
begin
Text := ' Файл подкачки';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;
Left := ScaleX(0);
Top := RAMPanel.Top + 27;
Width := ScaleX(100);
Height := ScaleY(22);
ReadOnly := True;
Color := $EEEEEE;
end;

PageFileTotalPanel := TMemo.Create(SysTestPage);
with PageFileTotalPanel do
begin
Text := ' '+MorG(GetSystemPage,1)+' всего, ' + MorG((Memory.dwTotalPageFile - Memory.dwAvailPageFile)/oneMB,0) + ' занято системным кэшем';
Alignment := taLeftJustify;
Parent := SysTestPage.Surface;
Left := ScaleX(104);
Top := PageFilePanel.Top;
Width := ScaleX(313);
Height := ScaleY(22);
ReadOnly := True;
Color := $CCFFCC;
end;

//******************************************* [Конец - Файл подкачки] ************************************************//

ListBox:= TListBox.Create(WizardForm)
with ListBox do begin
Color:= $EEEEEE; Font.Size:= 10; Font.Name:= 'Tahoma'; Font.Style:=[fsBold]; Parent:= WizardForm.SelectDirPage; OnClick:= @ListBoxOnClick; Top:= WizardForm.DirEdit.Top +WizardForm.DirEdit.Height +ScaleY(30); Width:= WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left; Height:= WizardForm.DiskSpaceLabel.Top -Top -9;
FileSystemName:= StringOfChar(' ', BufferLen); VolumeName:= StringOfChar(' ', BufferLen);
for i:=0 to GetHardDrivesCount-1 do begin
GetSpaceOnDisk(GetHardDriveName(i), True, FreeMB, TotalMB); GetVolumeInformation(GetHardDriveName(i), VolumeName, BufferLen-1, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, BufferLen-1);
Items.Add(Copy(Uppercase(GetHardDriveName(i)),0,2)+ Copy(' ',0,14-Length(MorG(TotalMB,0)))+ MorG(TotalMB,0)+ Copy(' всего, ',0,17-Length(MorG(FreeMB,0)))+ MorG(FreeMB,0)+ Copy(' (0',0,4-Length(IntToStr(round(FreeMB/TotalMB*100)))) + FloatToStr(round(FreeMB/TotalMB*100))+ '%) свободно, '+ FileSystemName); end;
end;
with TNewStaticText.Create(WizardForm) do begin Top:= WizardForm.DirEdit.Top +WizardForm.DirEdit.Height +ScaleY(8); Caption:='Список локальных дисков, присутствующих в системе:'; Parent:= WizardForm.SelectDirPage; end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = SysTestPage.ID then

if ProcessorMHZ < 3800 then //Минимальное значение частоты в MHz
begin
StaticText.Caption := 'Не все компоненты удовлетворяют требованиям программы.';
StaticText.Font.Color := clRed;
ProcessorNamePanel.Color := $CCCCFF;
WizardForm.NextButton.Enabled:=False
end;

if round(GetVidMemLocal/oneMB/64)*64 < 128 then //Минимальный объём ОЗУ видеоадаптера в Мб
begin
StaticText.Caption := 'Не все компоненты удовлетворяют требованиям программы.';
StaticText.Font.Color := clRed;
VideoCardNamePanel.Color := $CCCCFF;
WizardForm.NextButton.Enabled:=False
end;

if GetSoundCards = 0 then
begin
AudioCardNamePanel.Text:=' Устройство не обнаружено';
StaticText.Caption := 'Не все компоненты удовлетворяют требованиям программы.';
StaticText.Font.Color := clRed;
AudioCardNamePanel.Color := $CCCCFF;
WizardForm.NextButton.Enabled:=False
end;


if round(Memory.dwTotalPhys/oneMB/64)*64 < 512 then //Минимальный объём ОЗУ в Мб
begin
StaticText.Caption := 'Не все компоненты удовлетворяют требованиям программы.';
StaticText.Font.Color := clRed;
RAMTotalPanel.Color := $CCCCFF;
WizardForm.NextButton.Enabled:=False
end;

if GetSystemPage < 768 then //Минимальный объём файла подкачки в Мб
begin
StaticText.Caption := 'Не все компоненты удовлетворяют требованиям программы.';
StaticText.Font.Color := clRed;
PageFileTotalPanel.Color := $CCCCFF;
WizardForm.NextButton.Enabled:=False
end;
end;[/more]
Автор: iTASmania_Inc
Дата сообщения: 11.06.2007 12:21
Sampron
СПАСИБО!!!!!!!!!!!!!
И ещё раз СПАСИБО!!!!!!!!!!!!!!! за то, что код оптимизировал!!!!!!!!!!!!!!!!!
Автор: Chanka
Дата сообщения: 11.06.2007 13:03
Народ кто поможет сделать следующие. Все, наверное, помнят пример из руководства по программированию от Kindly, где после удаления программы проверяется, не осталось ли в папке посторонних файлов. Можно ли его переделать, чтобы это выглядело так - http://stream.ifolder.ru/2310170
Автор: Sanssanssans
Дата сообщения: 11.06.2007 13:39

Цитата:
Народ помогите пожалуйста: как сделать,чтобы инсталлятор делал бэкап замененных файлов?Например,я устанавливаю в папку ХХХ ,и надо,чтобы в этой папке создалась др.папка,например, ААА и в ней были все заменеенные файлы и файл деинсталляции. Если до меня спрашивали,сильно не пинайте,просто в инете с телефона и все прочитать не удается.

Извините,что повторяюсь,но никто не знает?
Автор: Unc1e
Дата сообщения: 11.06.2007 14:23
Народ, как пользоваться дизассемблером? Я написал .bat фаил
disasm CompiledCode.bin 123.txt
но там такой корявый код получился. Кто знает как его сделать более читабельным?
Автор: Sero
Дата сообщения: 11.06.2007 21:40
Sanssanssans
Вот пример .
Автор: iTASmania_Inc
Дата сообщения: 11.06.2007 23:14
Sampron
Нашёл в подредактированном скрипте небольшую неточность: у тебя идёт if CurPageID = SysTestPage.ID then и сразу проверка других условий. А begin и соответственно end забыл . Ну, это так, пустяк. Не мог бы ты мне, пожалуйста, ещё помочь и я от тебя отстану, а то уже задолбал, наверное:

1) Почему когда я использую этот самый скрипт, любая TMemo-область, которая закрашивается (в ходе проверки условия) в красный цвет, закрашивается неполностью: она по краям обведена небольшой зелёной каёмочкой, при наведении курсора - окончательно закрашивается в красный цвет! Это только у меня? И можно ли с этим что-нибудь сделать?

2) Можно ли в твоих новеньких скинах (в частности Blue, он лучше всех, на мой взгляд, с кнопками вышел) создать CreateCustomPage и сделать в зависимости от условия неактивной клавишу "Далее"? (Просто хочу скрестить код проверки системных требований со скином, а эта кнопка нехорошая не хочет делаться неактивной: максимально, что получилось наэкспериментировать - это убрать текст кнопки на задний план . Наверное, UpdateButton мешается, куда её можно вставить ещё, кроме как CurPageChanged.)

3) Можно ли создать Splash-заставку с элементами Transparent, но которая не будет закрываться, если по ней щёлкнуть мышой???
Автор: Sanssanssans
Дата сообщения: 12.06.2007 10:15
Sero ,
ОГРОМНОЕ СПАСИБО ТЕБЕ!!! Посмотри личку.
Автор: Kirgyz
Дата сообщения: 12.06.2007 12:43
Люди, видел когда-то тут выкладывали скин STATE с управлением MP3, где был MusicButton.bmp.

ПЛИЗ дайте такой же код, но для обычного скина, очень надо.

СПАСИБО за ПОМОЩЬ!
Автор: Chuvakstepan
Дата сообщения: 12.06.2007 12:58
Задумка такая - при старте инсталла, идёт проверка наличия ключа в реестре. Если ключ есть, то кнопка "далее" становится "Играть". И после нажатия на неё инсталл закрывается и запускается игра (путь к ней в реестре)
Как подобное реализовать? никто не сможет помочь?

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Mail.ru агент - вход не выполнен


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.