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

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

Автор: Genri
Дата сообщения: 15.07.2007 00:34
iTASmania_Inc
Цитата:
как суммировать размеры файлов по ходу инсталляции и выводить под прогресс-баром их процентное отношение к размеру ВСЕХ файлов инсталлятора? Ну, то есть показывать проценты установки?
-- порадовала первая часть - только интеллектуально развитые люди могут так усложнить вопрос "как показывать проценты установки"

А если серьезно, то на мой взгляд, если необходимо отображать проценты установки, нет необходимости высчитывать соотношения размеров файлов, так как данные процесса установки уже присутствуют (в WizardForm.ProgressGauge). Их надо только перевести в проценты. В итоге это может выглядеть примерно так:

Код:
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Files]
Source: setup.log; DestDir: {app}; AfterInstall: ExtLog()
Source: Files\*; DestDir: {app}; AfterInstall: ExtLog()

[Code]
var
ProgressLabel: TLabel;

procedure ExtLog();
begin
SaveStringToFile(ExpandConstant('{app}\setup.log'), #13#10 + GetDateTimeString('dd/mm/yyyy hh:nn:ss', '-', ':') +
' - ' + ExpandConstant(CurrentFileName), True);
with WizardForm.ProgressGauge do
ProgressLabel.Caption:= IntToStr((Position-Min)/((Max - Min)/100)) + '%';
end;

procedure InitializeWizard();
begin
ProgressLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top := Top + Height + ScaleY(8);
ProgressLabel.Left:= Left + Width/2 - ScaleX(8);
ProgressLabel.Caption := 'TLabel';
ProgressLabel.AutoSize := True;
ProgressLabel.Parent := WizardForm.InstallingPage;
end;
end;
Автор: iTASmania_Inc
Дата сообщения: 15.07.2007 00:39
Genri
Класс!!!!!!!!!!!!!!!!!!!!!!!!! Ещё раз СПАСИБО!!!
Автор: Genri
Дата сообщения: 15.07.2007 00:42
maxdddca123 -- а я и не пропадал. А по поводу двоичного файла - я все еще жду ответа на письмо двух-недельной давности :

Кому: maxdddca123
Дата: 29-06-2007 18:07
Тема: Двоичный файл




Добавлено:
maxdddca123
Цитата:
как сделать копию файла, к имени которого необходимо добавить дату и время создания копии ?
-- не совсем понятно, в какой момент делать копию, по какому событию, в зависимости от каких условий, какого файла, дату/время к имени добавить до или после, имя подразумевается с расширением или без ? В общем случае, можно например так :

Код:
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Files]
Source: Files\*; DestDir: {app}; BeforeInstall: CreateBackup()

[Code]
procedure CreateBackup();
begin
if FileExists(ExpandConstant(CurrentFileName)) then
FileCopy(ExpandConstant(CurrentFileName),
ExpandConstant('{app}\') +
GetDateTimeString('dd/mm/yyyy hh:nn:ss ', '-', '-') +
ExtractFileName(ExpandConstant(CurrentFileName)), True)
end;
Автор: maxdddca123
Дата сообщения: 15.07.2007 01:47
Genri
Млин, хот ы бы напомнил, что в личку вопрос задал ! Я её не читаю. Я ответил, послал двоичный файл. С копией файла пойдёт
Автор: Victor_Dobrov
Дата сообщения: 15.07.2007 03:11
Corona Skin & Check System Requirements - обложка для Inno Setup с проверкой системных требований.
Исправил подсчёт объёма Видеопамяти, вывод названия Процессора и ошибки при Encryption=true. Минимальные требования и параметры оформления Справки теперь можно прописывать в главном скрипте. Переделал звуковое оформление. Функции CheckPassword и CheckSerial включаются из Corona_kernel.iss при наличии в [Setup] директив Password, DefaultUserInfoSerial. Шифрование поддерживается. Чтобы показывать проценты установки, для секции [Files] добавьте в строку каждого файла-источника ;AfterInstall: ShowPercents
Автор: Kindly
Дата сообщения: 15.07.2007 12:48
Нужно после удаления создать новую форму, в которой был бы размещен TNewCheckListBox.
После удаления (перед завершающим сообщением) выполнялся бы поиск всех неудаленных файлов, включая папки, и результат бы выводился в CheckListBox, в котором можно было бы отметить флажки, тем самым выбрать удаляемые файлы и папки. Также на форме должны находиться кнопки: "Select All" и "Deselect All" и "Delete". Данная задача сложна для меня, поэтому прошу помощи у знающих людей.
Автор: iTASmania_Inc
Дата сообщения: 15.07.2007 17:30
Народ, подскажите, пожалуйста, как вызвать страницу wpPreparing?
Автор: Victor_Dobrov
Дата сообщения: 16.07.2007 06:01
Вот так:

[Files]
Source: C:\Windows\explorer.exe; DestDir: {win}; Flags: restartreplace ignoreversion

Откажись от перезагрузки, вновь запусти инсталлер и попробуй завершить установку.
Автор: iTASmania_Inc
Дата сообщения: 16.07.2007 06:46
Victor_Dobrov
БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!!!
Но при explorer.exe не хочет появляться wpPreparing, интересно почему?
Хотя если использовать ntuser.dat.log, то всё прекрасно смотрится.
Автор: maxdddca123
Дата сообщения: 16.07.2007 09:32
Genri
Ну вот опять пропал Вы скачали мой двоичный файл ?
Автор: Genri
Дата сообщения: 16.07.2007 10:39
maxdddca123 -- я всегда здесь. но когда много работы, успеваю только просмотреть тему. файл скачал.

Цитата:
есть проги, которые просмартирвают подобные двоичные файлы
-- дай линк на проги для примера.

Автор: maxdddca123
Дата сообщения: 16.07.2007 16:53
Genri
Вот пример самой простой проги... Мне бы примерно то же самое сделать, тока в инно )))
Всмысле сохранять инфу в текстовый файл, а потом уже делать различные манипуляции.
data.cod.ru/1326284234
Автор: NightW0lf
Дата сообщения: 16.07.2007 19:04
[удалено]
Автор: uzer001
Дата сообщения: 17.07.2007 09:24
народ подскажите как-нибудь можно изменить скрипт уже собранного сетапа без распаковки-сборки заного... а то если инсталятор весит 3 гига каждый раз заного собирать из-за мелкой ошибки давольно муторно
да, кстати можно ли обойти ограничение в 2 гига на файл сетапа, чтобы например инсталятор весил 3 гига ОДНИМ файлом
Автор: iTASmania_Inc
Дата сообщения: 17.07.2007 11:15
В руководстве от Kindly есть пример для того, чтобы задать внешний курсор для отдельных типов компонентов инсталлятора.
Собственно вопрос: подскажите, пожалуйста, как задать курсор для скролл-бара?
Абсолютно любого, например на странице wpReady (ReadyMemo)

Добавлено:
И ещё: можно показывать проценты установки во время инсталяции, а можно ли при этом ещё показывать размер копируемого в данный момент файла, ну там, как-нибудь через GetSize организовать?
Автор: NightW0lf
Дата сообщения: 17.07.2007 11:49
uzer001

Цитата:
народ подскажите как-нибудь можно изменить скрипт уже собранного сетапа без распаковки-сборки заного...

Насколько я знаю то нет.

Цитата:
а то если инсталятор весит 3 гига каждый раз заного собирать из-за мелкой ошибки давольно муторно

Тогда просто сделай так - запакуй все файлы установки в SFX архив 7-Zip'a и включи распаковки в секции Run для удобства можешь положить их рядом с сетапом, и если ты вдруг нашел ошибку в скрипте то просто пересобери его а файлы небудут компилиться.

Цитата:
да, кстати можно ли обойти ограничение в 2 гига на файл сетапа, чтобы например инсталятор весил 3 гига ОДНИМ файлом

Насколько я знаю то так:

Код:
[Setup]
;Разбиение на диски
DiskSpanning=yes
;Размер тома в байтах (здесь 695 мегабайт)
DiskSliceSize=730000000
Автор: kpblc
Дата сообщения: 17.07.2007 14:28
Уважаемые, подскажите, плиз. Честно прочитал всю ветку, но ответа что-то не увидел.
Суть в следующем. В моем инсталле надо зарегистрировать несколько dll и ocx. Естественно, что можно "потребовать установку под админом", но в силу некоторых причин такое решение не катит. В то же время меня терзают смутные подозрения, что можно попробовать как-то выполнять регистрацию dll и ocx до момента вывода окна логизации в системе. Ясно, что надо прописывать какой-то хитрый код. Не поможете? Спасибо.
---
P.S. Единственное, что нашел - это на vbstreets.ru файлик regsvrex.exe, который регистрирует одну (!) указанную dll / ocx под текущим пользователем и не требует админских прав. Но у меня этих dll / ocx больше 20 штук, не будешь же прописывать каждый!
===
Добавлено: Прошу прощения, в справке, что указана в шапке, вроде как нашел решение своей проблемы. Спасибо за инфу
Автор: iTASmania_Inc
Дата сообщения: 17.07.2007 16:46
Никто не поможет со следующей задачкой?
Выложите, пожалуйста, кому не трудно. не изменнённые значения, полученные через GetVidMemLocal из функции:
function GetVidMemLocal(): Integer;
external 'hwc_GetVidMemLocal@files:get_hw_caps.dll stdcall';
Значения преобразовывать не надо!
Особенно нужны значения, полученные с систем, где видеокарта меньше или равна 64Мб.
Заранее, спасибо!
Автор: Genri
Дата сообщения: 17.07.2007 17:29
Kindly
Цитата:
Нужно после удаления создать новую форму, в которой был бы размещен TNewCheckListBox.
После удаления (перед завершающим сообщением) выполнялся бы поиск всех неудаленных файлов, включая папки, и результат бы выводился в CheckListBox, в котором можно было бы отметить флажки, тем самым выбрать удаляемые файлы и папки. Также на форме должны находиться кнопки: "Select All" и "Deselect All" и "Delete".
-- любопытная задача. Может иметь практическое применение. Только есть риск, что пользователь установит программу в системную директорию, со всеми вытекающими последствиями при таком подходе. Пример [more=здесь]
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

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

[Code]
const
bidAll = 0;
bidUnAll = 1;

var
Form: TSetupForm;
CheckListBox: TNewCheckListBox;
AllButton, UnAllButton: TButton;
CancelButton, DelButton: TButton;

procedure FillListBox(const fromDir, fileMask: string; Level: Byte);
var
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: string;
Hi, Lo: Extended;
i: integer;

begin
APath := AddBackslash(fromDir);
FindResult := FindFirst(APath + fileMask, FSR);
try
while FindResult do
begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
begin
//file
Hi:= FSR.SizeHigh;
Lo:= FSR.SizeLow;
If Hi < 0 Then Hi:= Hi + (65536*65536);
If Lo < 0 Then Lo:= Lo + (65536*65536);
i:= CheckListBox.AddCheckBox(FSR.Name,
FloatToStr((Hi * (65536*65536)) + Lo) + ' byte',
Level, True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[i]).Text:= APath + FSR.Name;
end;
FindResult := FindNext(FSR);
end;
FindResult := FindFirst(APath + '*.*', DSR);
while FindResult do
begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and
not ((DSR.Name = '.') or (DSR.Name = '..')) then
begin
// dirs
i:= CheckListBox.AddCheckBox(DSR.Name, '', Level, True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[i]).Text:= APath + DSR.Name;
{Recursion} FillListBox(APath + DSR.Name, fileMask, Level+1);
end;
FindResult := FindNext(DSR);
end;
finally
FindClose(FSR);
FindClose(DSR);
end;
end;

procedure ButtonOnClick(Sender: TObject);
begin
Case TButton(Sender).Tag of
bidAll : CheckListBox.Checked[0]:= True;
bidUnAll: CheckListBox.Checked[0]:= False;
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
i: integer;
str: string;
begin
if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
begin
Form:= CreateCustomForm;
Form.ClientWidth := ScaleX(400);
Form.ClientHeight := ScaleY(400);
Form.Caption := 'Files to delete';
Form.Center;

CheckListBox := TNewCheckListBox.Create(Form);
CheckListBox.Left:= ScaleX(20);
CheckListBox.Top:= ScaleY(20);
CheckListBox.Width:= Form.ClientWidth - ScaleX(20*2);
CheckListBox.Height:= Form.ClientHeight - ScaleY(23*2 + 20);
CheckListBox.Parent:= Form;


AllButton := TButton.Create(Form);
AllButton.Parent := Form;
AllButton.Width := ScaleX(75);
AllButton.Height := ScaleY(23);
AllButton.Left := ScaleX(20);
AllButton.Top := Form.ClientHeight - ScaleY(23 + 10);
AllButton.Caption := 'Select All';
AllButton.Tag:= bidAll;
AllButton.OnClick := @ButtonOnClick;

UnAllButton := TButton.Create(Form);
UnAllButton.Parent := Form;
UnAllButton.Width := ScaleX(75);
UnAllButton.Height := ScaleY(23);
UnAllButton.Left := AllButton.Left + AllButton.Width + ScaleX(10);
UnAllButton.Top := Form.ClientHeight - ScaleY(23 + 10);
UnAllButton.Caption := 'Clear All';
UnAllButton.Tag:= bidUnAll;
UnAllButton.OnClick := @ButtonOnClick;

CancelButton := TButton.Create(Form);
CancelButton.Parent := Form;
CancelButton.Width := ScaleX(75);
CancelButton.Height := ScaleY(23);
CancelButton.Left := Form.ClientWidth - CancelButton.Width - ScaleX(20);
CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
CancelButton.Caption := 'Cancel';
CancelButton.ModalResult := mrCancel;
CancelButton.Cancel := True;

DelButton := TButton.Create(Form);
DelButton.Parent := Form;
DelButton.Width := ScaleX(75);
DelButton.Height := ScaleY(23);
DelButton.Left := CancelButton.Left - DelButton.Width - ScaleX(10);
DelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
DelButton.Caption := 'Delete';
DelButton.ModalResult := mrOk;

CheckListBox.AddCheckBox(ExpandConstant('{app}'), '', 0, True, True, False, True, TStringList.Create);
TStrings(CheckListBox.ItemObject[0]).Text:= ExpandConstant('{app}');
FillListBox(ExpandConstant('{app}'), '*', 1);

if Form.ShowModal() = mrOk then
begin
for i:= CheckListBox.Items.Count - 1 downto 0 do
begin
if CheckListBox.State[i] = cbChecked then
begin
str:= Trim(TStrings(CheckListBox.ItemObject[i]).Text);
DeleteFile(str);
RemoveDir(str);
end;
end;
end;
end;
end;
Автор: Victor_Dobrov
Дата сообщения: 18.07.2007 01:19

Цитата:
Выложите значения, полученные через GetVidMemLocal: Особенно нужны значения, полученные с систем, где видеокарта меньше или равна 64Мб.

Попробуй так:
n:=1 while GetVidMemLocal/oneMB > n do n:= n*2 {n - объём видеопамяти}
от 16 (или 8) Мб объём видеопамяти определяется правильно, при меньших надо умножать на 2.
Автор: Genri
Дата сообщения: 18.07.2007 02:22
iTASmania_Inc
Цитата:
как задать курсор для скролл-бара?
-- если я правильно понял, надо только для скролл-баров, но не для самих контролов. Тогда по-простому - никак.


Цитата:
можно показывать проценты установки во время инсталяции, а можно ли при этом ещё показывать размер копируемого в данный момент файла

-- [more=Здесь]
Код:
[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Files]
Source: Files\*; DestDir: {app}; AfterInstall: Progress()

[Code]
var
ProgressLabel, SizeLabel: TLabel;

procedure Progress();
var
size: integer;

begin
with WizardForm.ProgressGauge do
ProgressLabel.Caption:= IntToStr((Position-Min)/((Max - Min)/100)) + '%';

FileSize(ExpandConstant(CurrentFileName), size);
SizeLabel.Caption:= IntToStr(size) + ' bytes';
end;

procedure InitializeWizard();
begin
ProgressLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top := Top + Height + ScaleY(8);
ProgressLabel.Left:= Left + Width/2 - ScaleX(8);
ProgressLabel.AutoSize := True;
ProgressLabel.Parent := WizardForm.InstallingPage;
end;

SizeLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
SizeLabel.Top := Top + Height + ScaleY(8);
SizeLabel.Left:= Left;
SizeLabel.AutoSize := True;
SizeLabel.Parent := WizardForm.InstallingPage;
end;
end;
Автор: maxdddca123
Дата сообщения: 18.07.2007 08:54
Genri
А меня чем нить порадуешь с двоичным файлом ?
Автор: Genri
Дата сообщения: 18.07.2007 09:07
maxdddca123 -- пока нет. слегка глянул - писать много.
Автор: iTASmania_Inc
Дата сообщения: 18.07.2007 12:14
Victor_Dobrov
Спасибо (!!!) за упрощённый подсчёт обьёма видеопамяти, как раз видел в новой версии оболочки Corona Skin! Только я из любопытства запросил непеределанные значения - очень уж любопытно поглядеть, почему они не совпадают (может так и должно) с реальным объёмом видеопамяти.
Genri
Спасибо!
Автор: maxdddca123
Дата сообщения: 18.07.2007 16:15
Genri
Спасибо за личку, проверю, сообщу !
Автор: Kindly
Дата сообщения: 18.07.2007 18:16
Genri, спасибо большое, задача действительно любопытная. Я ее подсмотрел в инсталляторе Setup Factory в продуктах от Indigo Rose.
Цитата:
Только есть риск, что пользователь установит программу в системную директорию, со всеми вытекающими последствиями при таком подходе.
Ну а мы предварительно не позволим пользователю установить приложение в существующую директорию.

Автор: Genri
Дата сообщения: 18.07.2007 18:26
Kindly -- в этом скрипте Victor_Dobrov заметил баг с определением размера больших файлов. По возможности поправлю.



Добавлено:
и еще - не удаляются файлы только для чтения. Но это уже на любителя. Если файл ридонли, значит это кому-нибудь нужно!
Автор: Kindly
Дата сообщения: 18.07.2007 19:03
Genri, поправь, по возможности, пожалуйста (и ридонли). Я еще домой из кафешки не добежал, чтобы попробовать предыдущий пример.
Автор: Zloy_Gelud
Дата сообщения: 18.07.2007 19:24
Народ
А есть ли какой-нидь сайт, на котором отдельно выложены Ваши iss-примеры. Если нет, то никто не хотел бы этим вопросом заняться?
Автор: Kindly
Дата сообщения: 18.07.2007 19:28
Zloy_Gelud
Специального сайта нету, но примеров куча, как на форуме, так и в руководствах из шапки. Смотри, вникай... Также на форуме оф.сайта можно многое узнать.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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