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

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

Автор: TuBaal
Дата сообщения: 19.07.2007 16:56
Привет всем. В поисках ответа на мой вопрос прочитал большую часть форума, просмотрел всю документацию по инсталлятору, но ответа так и не нашел, возможно я его упустил где-нибудь...
Вопрос следующий:
Как с помощью данного инсталлятор осуществить слудующую задачу:

Есть 4 других инсталлятора программного обеспечения, написанного на данной софтине для установки сервера, настройки оного, автоматического апгрейда, разворчавания базы на нем, заливка бекапа базы и установка программной продукции. Так вот каждая из этих 4й составляющих требует перезагрузки компьютера. Перезагружать просто это я сделал, благо это не сложно, а вот проблема в другом - как сделать, чтобы после перезагрузки у меня инсталлятор продолжал инсталляцию с того момента, на котором ушел на перезагруз. Знаю есть коды выхода инсталлятора, вроде как мона получить эти коды выхода с помощью внутренней функции, но как потом обратно запустить инсталлятор я не понимаю. Потому пока что реализовал только ручным запуском и выбором следующего копонента для установки.

Очень нужна ваша помощь, может кто уже делал такое). Буду очень благодарен)
Автор: Genri
Дата сообщения: 19.07.2007 17:48
Kindly
Цитата:
поправь, по возможности, пожалуйста (и ридонли).
-- с размером исправил быстро (спасибо Victor_Dobrov за тестирование). А вот с ридонли пришлось повозиться. [more=Результат]
Код:
[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

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

[Code]
const
bidDelAll = 1;
bidSkipAll = 2;
var
Form: TSetupForm;
CheckListBox: TNewCheckListBox;
AllButton, UnAllButton: TButton;
CancelButton, DelButton: TButton;

MsgForm: TSetupForm;
MsgAllButton, MsgSkipAllButton: TButton;
MsgCancelButton, MsgDelButton: TButton;

DelAllReadOnly: Boolean;
SkipAllReadOnly: Boolean;

function Size64(Hi, Lo: integer): Extended;
var
i: integer;
begin
Result:= Lo;
if Lo < 0 then
Result:= Result + 2147483647 + 2147483647 + 2;
i:= Hi;
while i > 0 do
begin
Result:= Result + 2147483647 + 2147483647 + 2;
i:= i - 1;
end;
end;

procedure FillListBox(const fromDir, fileMask: string; Level: Byte);
var
FSR, DSR: TFindRec;
FindResult: Boolean;
APath: string;
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
{files} i:= CheckListBox.AddCheckBox(FSR.Name,
FloatToStr(Size64(FSR.SizeHigh, FSR.SizeLow)) + ' 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
{dir} i:= CheckListBox.AddCheckBox(DSR.Name,'DIR', 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
CheckListBox.Checked[0]:= TButton(Sender).Tag = 0;
end;

procedure MsgButtonOnClick(Sender: TObject);
begin
Case TButton(Sender).Tag of
bidDelAll : DelAllReadOnly:= True;
bidSkipAll: SkipAllReadOnly:= True;
end;
MsgForm.Close;
end;

function DelMsgBox(FileName: string): Boolean;
var
MsgLabel: TLabel;
begin
MsgForm:= CreateCustomForm;
MsgForm.ClientWidth := ScaleX(400);
MsgForm.ClientHeight := ScaleY(120);
MsgForm.Caption := 'Files to delete';
MsgForm.Center;

MsgLabel := TLabel.Create(MsgForm);
MsgLabel.Left := ScaleX(20);
MsgLabel.Top := ScaleY(20);
MsgLabel.Caption:= FileName + ' is protected file or directory !' + #10#10#13 +
'Do you want to delete the file with READONLY attribute ?';
MsgLabel.Parent := MsgForm;

MsgAllButton := TButton.Create(MsgForm);
MsgAllButton.Parent := MsgForm;
MsgAllButton.Width := ScaleX(75);
MsgAllButton.Height := ScaleY(23);
MsgAllButton.Left := ScaleX(20);
MsgAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgAllButton.Caption := 'Delete All';
MsgAllButton.Tag:= bidDelAll;
MsgAllButton.OnClick := @MsgButtonOnClick;

MsgSkipAllButton := TButton.Create(MsgForm);
MsgSkipAllButton.Parent := MsgForm;
MsgSkipAllButton.Width := ScaleX(75);
MsgSkipAllButton.Height := ScaleY(23);
MsgSkipAllButton.Left := MsgAllButton.Left + MsgAllButton.Width + ScaleX(10);
MsgSkipAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgSkipAllButton.Caption := 'Skip All';
MsgSkipAllButton.Tag:= bidSkipAll;
MsgSkipAllButton.OnClick := @MsgButtonOnClick;

MsgCancelButton := TButton.Create(MsgForm);
MsgCancelButton.Parent := MsgForm;
MsgCancelButton.Width := ScaleX(75);
MsgCancelButton.Height := ScaleY(23);
MsgCancelButton.Left := MsgForm.ClientWidth - MsgCancelButton.Width - ScaleX(20);
MsgCancelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
MsgCancelButton.Caption := 'Skip';
MsgCancelButton.ModalResult := mrCancel;

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

MsgForm.ActiveControl:= MsgCancelButton;

if MsgForm.ShowModal() = mrOk then
Result:= True
else
Result:= False;
end;

procedure DeleteFiles();
var
SR: TFindRec;
i: integer;
str: string;
ResultCode: Integer;
begin
DelAllReadOnly:= False;
SkipAllReadOnly:= False;
for i:= CheckListBox.Items.Count - 1 downto 0 do
begin
if CheckListBox.State[i] = cbChecked then
begin
str:= Trim(TStrings(CheckListBox.ItemObject[i]).Text);
FindFirst(str, SR);
if ((SR.Attributes and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY) then
if Not (DelAllReadOnly or SkipAllReadOnly) then
if DelMsgBox(SR.Name) then
Exec('attrib', ' -h -s -r ' + '"' + str + '"',
'', SW_HIDE, ewWaitUntilTerminated, ResultCode);
if DelAllReadOnly then
Exec('attrib', ' -h -s -r ' + '"' + str + '"',
'', SW_HIDE, ewWaitUntilTerminated, ResultCode);

FindClose(SR);
DeleteFile(str);
RemoveDir(str);
end;
end;
end;

procedure BrowseRemainedFiles();
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:= 0;
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:= 1;
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;

Form.ActiveControl:= CancelButton;

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 DeleteFiles();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
BrowseRemainedFiles();
end;
Автор: Kindly
Дата сообщения: 19.07.2007 18:10
Genri, спасибо! Конечно, потестируем. Гонял старый скрипт, но так и не понял: можно ли в этот CheckListBox сделать горизонтальную прокрутку? Вроде как она этим объектом не поддерживается? Но не думаю, что это важно. Если еще форму растянуть, то пользователю нужно будет иметь неудаленных около 20 вложенных одна в одной папок, чтобы удалямые файлы не были показаны в списке.
Автор: Genri
Дата сообщения: 19.07.2007 18:28
Kindly
Цитата:
можно ли в этот CheckListBox сделать горизонтальную прокрутку?
-- думаю нет. Разве что можно выставить CheckListBox.Offset:= 0;
Автор: Kindly
Дата сообщения: 19.07.2007 18:56
Genri, если будет время - попробуешь реализовать второй ProgressBar, который бы показывал ход установки каждого файла в отдельности под основным ProgressBar-ом? Видел же такие инсталлы? Пример с установкой каждого файла в процентах также порадовал. Когда-то наши форумчане хотели этого, но видимо забыли. Фича была бы обалденной.
Автор: Sero
Дата сообщения: 19.07.2007 18:59
Kindly

Цитата:
Фича была бы обалденной.

Абсолютно согласен! давно хотел такую фишку реализовать в Inno.
Автор: iTASmania_Inc
Дата сообщения: 19.07.2007 21:04
Хотел спросить у знающих, а можно ли определять размер видеокарты каким-нибудь другим способом, отличным и от скрипта GloThin и NightW0lf, и от оболочки Corona Skin Victora Dobrova? Например, вот так:

function GetVideoCardDev(): Integer;
external 'hwc_GetVideoCardDev@files:get_hw_caps.dll stdcall';

function GetVideoCardVen(): Integer;
external 'hwc_GetVideoCardVen@files:get_hw_caps.dll stdcall';

/////----/////----/////

Text := IntToStr(GetVideoCardDev - GetVideoCardVen) + 'Мб'

или что-то в этом роде? Вообще реализуемо?

Добавлено:
То есть, чтобы размер определялся точно на любой машине, а не на одной конкретно взятой!
Автор: Victor_Dobrov
Дата сообщения: 20.07.2007 04:16

Цитата:
можно ли в этот CheckListBox сделать горизонтальную прокрутку?

Вот так имена всех файлов будет видно:

[Setup]
AppName=MaxTextLength
AppVerName=MaxTextLength
CreateAppDir=false

[Code]
var string: string;
const MaxLength = 48;

Procedure InitializeWizard;
Begin
    string:= ' Test max string Length 1234567890абвгдежзийклмнопрстуфхцчшщъыьэюяёАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯЁ';
    string:= ' ...' + Copy(string, Length(string)-MaxLength, MaxLength);
    MsgBox(string + #10#13 ' MaxLength = ' + IntToStr(MaxLength), mbInformation, mb_Ok);
End;
Автор: TuBaal
Дата сообщения: 20.07.2007 08:48
Genri
Спасибо, сейчас попробую это реализовать.. придется правда от общей инсталлялки отказаться
Автор: Genri
Дата сообщения: 20.07.2007 09:18
TuBaal -- ну если очень надо, то можно и все собрать в одном инсталляторе, а в RunOnce прописывать запуск себя же, но с разными параметрами. И в зависимости от параметра, автоматом пропускать уже пройденные шаги.

Но на мой взгляд, это неоправданно. Во-первых, это усложнит код, отладку и внесение изменений. Во-вторых, на каждом этапе выполняются совершенно различные, но равноправные задачи. Например, при установке возможно нужна страница расположения файлов. Такая же страница, опять-таки, возможно нужна при установке программной продукции... Но так как штатная только одна, остальные придется прописывать вручную.

Добавлено:
Victor_Dobrov -- насколько я понимаю, проблема не в длине пути (кроме первой строки, в списке отображаются только имена. А первую можно ставить любой при минимальных переделках), сколько в кол-ве вложенных папок. При большом их кол-ве, сами чекбоксы будут визуально находиться за границей листбокса, а имена тем более.
Автор: Kindly
Дата сообщения: 20.07.2007 10:23
Genri
CheckListBox.Offset:= 0;
катит. Не думаю, что у пользователя будет столько уже вложенных папок после удаления. Последний скрипт с CheckListBox погонял - ничего некорректного не обнаружил.

p.s. Не мог бы ты еще поправить скрипт, когда устанавливаются файлы, с указанием процентов и их размера? Вчера паковал игру, в которой архив был около 40 метров, скрипт посчитал неправильный размер (где-то около 10 мб).
Автор: TuBaal
Дата сообщения: 20.07.2007 10:39
Genri

Я думаю сделать так, надеюсь получится, в основном инсталляторе прописать в секции code на реакцию кнопки отмена, чтобы в реестр по пути, указанном тобой выше тип заменялся на none. А в интегрированных инсталляторах прописать запуск основного инсталлятора, но паралельно в них же прописать опять же в секции code на кнопку отмена скидывание значения реестра. Таким образом по идее должно получится, что при вызове основного инсталлятор и выборе определенного критерия установки, запуска соответсвующего инсталлятора, последний пропишет запуск главного и тд пока не пройдет весь список компонентов, либо пока пользователь сам не прервет установку.
Как думаешь, реально ли такое?
Автор: Genri
Дата сообщения: 20.07.2007 10:43
Kindly -- скрипт подсчитал правильно.... только для предыдущего файла Для корректного отображения, размер надо указывать в BeforeInstall.

дополнение: что-то я заработался BeforeInstall файла еще нет, а значит и размера нет. Виноват.


Добавлено:
TuBaal
Цитата:
реально ли такое?
-- реально все. Только иногда дорого
А в реестр лучше писать только тогда, когда действительно надо. Например, когда закончен первый этап и осталось только перегрузить, вывести сообщение типа "Для завершения установки требуется перегрузка. Перегрузить сейчас ?" и две кнопки ОК, Отмена. Вне зависимости от ответа пользователя, прописать ключ в реестр, но при ОК еще и дать команду на рестарт. Тогда не надо будет и удалять.

ЗЫ. Все вышеизложенное сугубо ИМХО. Как будет лучше, не знает никто (включая пользователя и разработчика)


Автор: Shmel88
Дата сообщения: 20.07.2007 18:30
подскажите плиз.. как написать диалог:

=========================

192.168. (поле ввода) . (поле ввода)

nick (поле ввода)

=========================

и переменные из этих полей ввода, должны записыватся в файлы типа mirc.ini

спасибо..

читал.. хелп, но чего то непонял как задать переменные, и прицепить их к полям ввода.., + как задать координаты полям .. X\Y\W\H
Автор: koc
Дата сообщения: 20.07.2007 19:26
сделал DisableDirPage=true
Как теперь проверять свободное место и выдавать мессадж, если ег онедостаточно?
Можно не отключать эту страницу, а просто сделать неактивным выбор папки?
Автор: Vetal83
Дата сообщения: 20.07.2007 20:44
koc
[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[Code]
procedure InitializeWizard();
begin
WizardForm.DirBrowseButton.Enabled:=False
WizardForm.DirEdit.Enabled:=False
end;
Автор: koc
Дата сообщения: 20.07.2007 21:41
Vetal83
благодарю.
Автор: Genri
Дата сообщения: 21.07.2007 02:10
Kindly
Цитата:
реализовать второй ProgressBar, который бы показывал ход установки каждого файла в отдельности под основным ProgressBar-ом?
-- мороки много. У Инно события изменения прогресса - нет, размера файла до установки - нет, общего размера - нет. Кое-что [more=можно]
Код:
#define SrcPath "Files\"
#define Mask "*.*"

#define FindHandle
#define FindResult
#define SearchPath SrcPath + Mask
#define AllFilesSize 0
#define CurFileSize 0

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[Files]
Source: InnoCallback.dll; Flags: dontcopy
#sub ProcessFoundFile
#define FileName FindGetFileName(FindHandle)
Source: {#SrcPath}{#FileName}; DestDir: "{tmp}"; Flags: ignoreversion; BeforeInstall: ProgressInit(); AfterInstall: ProgressReset()
#expr CurFileSize = FileSize(SrcPath + FileName)
#expr AllFilesSize = AllFilesSize + CurFileSize
#expr WriteIni( SourcePath    + "\\SizeInfo.ini","Name", FileName, CurFileSize )
#expr WriteIni( SourcePath    + "\\SizeInfo.ini","Size", "AllSize", AllFilesSize )
#endsub

#for {FindHandle = FindResult = FindFirst(SearchPath, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile

Source: SizeInfo.ini; Flags: dontcopy

[Code]
type
TMsg = record
hwnd: HWnd;
msg: Word;
wParam: Word;
lParam: Word;
time: Longint;
pt: TPoint;
end;

TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);

var
Msg: TMsg;
TimerID: LongWord;
ProgressBar: TNewProgressBar;
CurrentFileSize: LongInt;
OneStepSize: LongInt;
OldPosition: LongInt;
ReadyFlag: Boolean;
lbl, lbl1: TLabel;

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:innocallback.dll stdcall';


procedure ProgressInit();
begin
ProgressBar.Min:= 0;
ProgressBar.Position:= 0;
OldPosition:= WizardForm.ProgressGauge.Position;

ProgressBar.Max:= GetIniInt('Name', ExtractFileName(ExpandConstant(CurrentFileName)), 0, 0, 0, ExpandConstant('{tmp}\SizeInfo.ini')) ;

ReadyFlag:= True;
end;

procedure ProgressReset();
begin
ReadyFlag:= False;
end;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
res: LongWord;
begin
if ReadyFlag then
begin
ProgressBar.Position:= ProgressBar.Position + (WizardForm.ProgressGauge.Position - OldPosition) ;
OldPosition:= WizardForm.ProgressGauge.Position;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var
pfunc: LongWord;
begin
if CurStep = ssInstall then
begin
pfunc:= WrapTimerProc(@OnTimer, 4);
TimerID:= SetTimer(0, 0, 20, pfunc);
end;
end;

procedure InitializeWizard();
begin
ReadyFlag:= False;
ExtractTemporaryFile('SizeInfo.ini');

ProgressBar := TNewProgressBar.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressBar.Left := Left;
ProgressBar.Top := Top + ScaleX(30);
ProgressBar.Width := Width;
ProgressBar.Height := Height;
ProgressBar.Parent := WizardForm.InstallingPage;
ProgressBar.Position := 0;
end;
end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;
Автор: omals
Дата сообщения: 21.07.2007 11:12
вопрос
как можно остановить виндовий сервис а затем запустить его (например спулер)
спс.
Автор: Genri
Дата сообщения: 21.07.2007 12:00
net stop имя_сервиса

Добавлено:
net start имя_сервиса
Автор: Shmel88
Дата сообщения: 21.07.2007 15:04
Подскажите как слепить вместе два скрипта..

этот


Код:


var
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;

{ hazyneIP_Activate }

procedure hazyneIP_Activate(Page: TWizardPage);
begin
// enter code here...
end;

{ hazyneIP_ShouldSkipPage }

function hazyneIP_ShouldSkipPage(Page: TWizardPage): Boolean;
begin
Result := False;
end;

{ hazyneIP_BackButtonClick }

function hazyneIP_BackButtonClick(Page: TWizardPage): Boolean;
begin
Result := True;
end;

{ hazyneIP_NextkButtonClick }

function hazyneIP_NextButtonClick(Page: TWizardPage): Boolean;
begin
Result := True;
end;

{ hazyneIP_CancelButtonClick }

procedure hazyneIP_CancelButtonClick(Page: TWizardPage; var Cancel, Confirm: Boolean);
begin
// enter code here...
end;

{ hazyneIP_CreatePage }

function hazyneIP_CreatePage(PreviousPageId: Integer): Integer;
var
Page: TWizardPage;
begin
Page := CreateCustomPage(
PreviousPageId,
ExpandConstant('{cm:hazyneIP_Caption}'),
ExpandConstant('{cm:hazyneIP_Description}')
);

{ Label1 }
Label1 := TLabel.Create(Page);
with Label1 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:hazyneIP_Label1_Caption0}');
Left := ScaleX(24);
Top := ScaleY(24);
Width := ScaleX(306);
Height := ScaleY(13);
end;

{ Label2 }
Label2 := TLabel.Create(Page);
with Label2 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:hazyneIP_Label2_Caption0}');
Left := ScaleX(216);
Top := ScaleY(104);
Width := ScaleX(50);
Height := ScaleY(16);
Font.Color := -16777208;
Font.Height := ScaleY(-13);
Font.Name := 'Tahoma';
end;

{ Label3 }
Label3 := TLabel.Create(Page);
with Label3 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:hazyneIP_Label3_Caption0}');
Left := ScaleX(48);
Top := ScaleY(104);
Width := ScaleX(133);
Height := ScaleY(14);
Font.Color := -16777208;
Font.Height := ScaleY(-12);
Font.Name := 'Tahoma';
end;

{ Label4 }
Label4 := TLabel.Create(Page);
with Label4 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:hazyneIP_Label4_Caption0}');
Left := ScaleX(48);
Top := ScaleY(152);
Width := ScaleX(100);
Height := ScaleY(14);
Font.Color := -16777208;
Font.Height := ScaleY(-12);
Font.Name := 'Tahoma';
end;

{ Label5 }
Label5 := TLabel.Create(Page);
with Label5 do
begin
Parent := Page.Surface;
Caption := ExpandConstant('{cm:hazyneIP_Label5_Caption0}');
Left := ScaleX(292);
Top := ScaleY(104);
Width := ScaleX(4);
Height := ScaleY(13);
end;

{ Edit1 }
Edit1 := TEdit.Create(Page);
with Edit1 do
begin
Parent := Page.Surface;
Left := ScaleX(272);
Top := ScaleY(104);
Width := ScaleX(17);
Height := ScaleY(21);
Font.Color := -16777208;
Font.Height := ScaleY(-11);
Font.Name := 'Tahoma';
TabOrder := 0;
Text := ExpandConstant('{cm:hazyneIP_Edit1_Text0}');
end;

{ Edit2 }
Edit2 := TEdit.Create(Page);
with Edit2 do
begin
Parent := Page.Surface;
Left := ScaleX(296);
Top := ScaleY(104);
Width := ScaleX(33);
Height := ScaleY(21);
Font.Color := -16777208;
Font.Height := ScaleY(-11);
Font.Name := 'Tahoma';
TabOrder := 1;
Text := ExpandConstant('{cm:hazyneIP_Edit2_Text0}');
end;

{ Edit3 }
Edit3 := TEdit.Create(Page);
with Edit3 do
begin
Parent := Page.Surface;
Left := ScaleX(216);
Top := ScaleY(144);
Width := ScaleX(113);
Height := ScaleY(21);
TabOrder := 2;
Text := ExpandConstant('{cm:hazyneIP_Edit3_Text0}');
end;

with Page do
begin
OnActivate := @hazyneIP_Activate;
OnShouldSkipPage := @hazyneIP_ShouldSkipPage;
OnBackButtonClick := @hazyneIP_BackButtonClick;
OnNextButtonClick := @hazyneIP_NextButtonClick;
OnCancelButtonClick := @hazyneIP_CancelButtonClick;
end;

Result := Page.ID;
end;

{ hazyneIP_InitializeWizard }

procedure InitializeWizard();
begin
hazyneIP_CreatePage(wpWelcome);
end;

Автор: Victor_Dobrov
Дата сообщения: 21.07.2007 15:58
про второй ProgressBar: Я считаю что при распаковке файлов он не нужен.
Другое дело, что используя таймер InnoCallBack.dll, можно в центре под основным прогрессом показывать проценты распаковки (не используя AfterInstall), а справа показывать нарастающий объём копируемых файлов. А слева под прогрессом уменьшать счётчик ещё не распакованных файлов.
Используя примеры Genri, я теперь могу сделать это в своей обложке Corona Skin.
Автор: serg_aka_lain
Дата сообщения: 21.07.2007 16:45

для Shmel88

в личку посмотри.
Автор: Genri
Дата сообщения: 22.07.2007 20:06
[more=Здесь]
Код:
#include "WindowsHook.iss"

#define SrcPath "Files\"
#define Mask "*.*"

#define FindHandle
#define FindResult
#define SearchPath SrcPath + Mask
#define AllFilesSize 0
#define CurFileSize 0

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program

[Files]
Source: InnoCallback.dll; Flags: dontcopy
#sub ProcessFoundFile
#define FileName FindGetFileName(FindHandle)
Source: {#SrcPath}{#FileName}; DestDir: "{app}"; Flags: ignoreversion; BeforeInstall: ProgressInit(); AfterInstall: ProgressReset()
#expr CurFileSize = FileSize(SrcPath + FileName)
#expr AllFilesSize = AllFilesSize + CurFileSize
#expr WriteIni( SourcePath    + "\\SizeInfo.ini","Name", FileName, CurFileSize )
#expr WriteIni( SourcePath    + "\\SizeInfo.ini","Size", "AllSize", AllFilesSize )
#endsub

#for {FindHandle = FindResult = FindFirst(SearchPath, 0); FindResult; FindResult = FindNext(FindHandle)} ProcessFoundFile

Source: SizeInfo.ini; Flags: dontcopy


Код:
var
ProgressBar: TNewProgressBar;
OldPosition: LongInt;
ReadyFlag : Boolean;
KBHookID, WndHookID: LongWord;

function LOWORD(lw: LongWord): LongWord;
begin
Result:= lw shr 16;
end;

procedure ProgressInit();
begin
ProgressBar.Min:= 0;
ProgressBar.Position:= 0;
OldPosition:= WizardForm.ProgressGauge.Position;

ProgressBar.Max:= GetIniInt('Name', ExtractFileName(ExpandConstant(CurrentFileName)), 0, 0, 0, ExpandConstant('{tmp}\SizeInfo.ini')) ;

ReadyFlag:= True;
end;

procedure ProgressReset();
begin
ReadyFlag:= False;
end;

function ChangePos(var oldpos: LongInt; newpos: LongInt): Longint;
begin
Result:= newpos - oldpos;
oldpos:= newpos;
end;

/////////////////// обработка события SendMessage //////////////////////////////////
procedure OnWndHook(Code: Integer; wParam: Word; lParam: TCWPSTRUCT); //
begin //
if Code < 0 then //
begin //
CallNextWNDPROC(WndHookID,code,wParam,lparam); //
Exit; //
end; //
//
if (Code = HC_ACTION) and(LOWORD(lParam.msg) = WM_PAINT) and ReadyFlag then //
ProgressBar.Position:= ProgressBar.Position + //
ChangePos(OldPosition, WizardForm.ProgressGauge.Position ); //
//
CallNextWNDPROC(WndHookID,code,wParam,lparam); //
end; //
////////////////////////////////////////////////////////////////////////////////////
////////////////////// обработка событий клавиатуры ////////////////////////////////
procedure OnKBHook(Code: Integer; wParam: Word; lParam: LongWord); //
begin //
if Code < 0 then //
begin //
CallNextKBHook(WndHookID,code,wParam,lparam); //
Exit; //
end; //
//
if (Code = HC_ACTION) and //
(wParam = Ord('B')) and // клавиша "B" //
((LOWORD(lParam) and KF_UP) <> 0) and // отпущена //
(GetKeyState(VK_SHIFT) < 0) then // при нажатом шифте //
MsgBox('You press SHIFT + ''B''', mbInformation, MB_OK); //
//
CallNextKBHook(WndHookID,code,wParam,lparam); //
end; //
////////////////////////////////////////////////////////////////////////////////////

procedure InitializeWizard();
begin
ReadyFlag:= False;
ExtractTemporaryFile('SizeInfo.ini');
WndHookID:= SetCALLWNDPROCHook(@OnWndHook); // 1. установка SendMessage хука
KBHookID:= SetKBHook(@OnKBHook); // 2. установка клавиатурного хука

ProgressBar := TNewProgressBar.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressBar.Left := Left;
ProgressBar.Top := Top + ScaleX(30);
ProgressBar.Width := Width;
ProgressBar.Height := Height;
ProgressBar.Parent := WizardForm.InstallingPage;
ProgressBar.Position := 0;
end;
end;

procedure DeinitializeSetup();
begin
HookFree(WndHookID); // 3. удаление SendMessage хука
HookFree(KBHookID); // 4. удаление клавиатурного хука
end;
Автор: iTASmania_Inc
Дата сообщения: 22.07.2007 21:58
А можно ли как-нибудь изменить цвет прогресс-бара?
Автор: Vetal83
Дата сообщения: 22.07.2007 22:42
iTASmania_Inc
Нельзя, инно использует стиль ХР, это зависит от визуального оформления системы, разве что использовать NSIS_SkinCrafter_Plugin.dll
Автор: iTASmania_Inc
Дата сообщения: 22.07.2007 22:54
Vetal83

Цитата:
Нельзя

Обидно! Просто я использую прогресс-бар на синем фоне - а при копировании заметны по углам прогресс-бара некие серости , что не есть гуд.
NSIS_SkinCrafter_Plugin.dll - не выход, поскольку я использую скин InstallShield, а отказываться от него не хочется.
Автор: Vetal83
Дата сообщения: 22.07.2007 23:12
iTASmania_Inc

Цитата:
использую скин InstallShield, а отказываться от него не хочется

Я тоже его использую, сам писал, а как изменить цвет заднего фона незнаю, ProgressGauge не поддерживает свойства Color
Автор: Kindly
Дата сообщения: 23.07.2007 10:35
Genri, спасибо, пока не успел опробовать. Когда-то один продвинутый программер сказал, что такое вроде можно еще реализовать с помощью апи CreateThread:

Прототип функции CreateThread:
HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,
SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress,
LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);

Genri, что ты насчет этого думаешь?
Автор: Genri
Дата сообщения: 23.07.2007 11:24
Kindly -- я думаю, что это еще один способ организовать обработку изменения позиции прогресс-бара. Какой из них лучше (таймер, хук или поток), пусть скажут програмеры. Но проблема не в этом. Проблема с получением размера текущего файла. Обидно, что реально это значение в инно есть (PSetupFileLocationEntry(Entries[seFileLocation][LocationEntry])^.OriginalSize), но оно недоступно. Возможно QuickeneR мог бы указать, куда двигаться.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

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


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