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

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

Автор: Diawer
Дата сообщения: 06.06.2008 16:06
htuos
спасибо за помощь, но для полного счастья помоги ещё изменить иконку в окне выбора языка.
Автор: Raf_SE
Дата сообщения: 06.06.2008 16:11
SotM
А можно чтоб в период патчинга, появлялось другое системное сообщение? Желательно через это {cm:W32ART_POD}
Автор: SotM
Дата сообщения: 06.06.2008 16:23
Raf_SE
Тоесть системное сообщение?
Можно, например, создать на текущей странице визарда какой нить Label и Caption у него задать {cm:W32ART_POD}. Это как один из вариантов, а другого что-то я не могу придумать.

Diawer
Вряд ли это получится, окно выбора языка появляется до секции кода (насколько я знаю).
Так что иконку можно там сменить только через секцию Setup.
Автор: Raf_SE
Дата сообщения: 06.06.2008 16:30
SotM
Блин, я наверно неправильно выразился, мне нужно чтобы над прогресс баром, во время патчинга было написано не "Распаковка файлов", а {cm:W32ART_POD}
Просто это процес не быстрый, юзер может подумать что инсталляха зависла.
Автор: AlexDJ666
Дата сообщения: 06.06.2008 16:56
SotM, я смотрел процедуру, но так и не понял, где фигурирует указание, на каком месте находится та или иная страница. Как в данном случае работают Page.ID?

Добавлено:
Genri, и снова спасибо! Вот это очень грамотное объяснение! СПАСИБО!

Вопрос с номерами страниц снят
Автор: Raf_SE
Дата сообщения: 06.06.2008 19:05
Нашел код определяющий разрешение монитора юзера, Теперь прозьба: ктонить может его встроить в мой код?

[more=Разрешение монитора][Files]
Source: 640.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 800.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1024.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1152.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1280.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1600.bmp; DestDir: {tmp}; Flags: dontcopy

[Code]
function GetDC(HWND: DWord): DWord;
external 'GetDC@user32.dll stdcall';

function GetDeviceCaps(DC: DWord; Index: Integer): Integer;
external 'GetDeviceCaps@gdi32.dll stdcall';

function ReleaseDC(HWND: DWord;DC: DWord): Integer;
external 'ReleaseDC@user32.dll stdcall';

function ShowWindow(hWnd: DWord; nCmdShow: Integer): boolean;
external 'ShowWindow@user32.dll stdcall';

function SetWindowLong(hWnd: DWord; nIndex: Integer; dwNewLong: Longint): Longint;
external 'SetWindowLongA@user32.dll stdcall';

procedure InitializeWizard();
var
bgImage : TBitmapImage;
bgImageName: String;
width: integer;
dc: DWord;

begin
bgImage:=TBitmapImage.Create(MainForm)
bgImage.Align:=alClient
bgImage.Stretch:=True
bgImage.Parent:=MainForm

dc:=GetDC(MainForm.Handle)
width:=GetDeviceCaps(dc,8)
ReleaseDC(MainForm.Handle,dc)

if width <=640 then
bgImageName:='640.bmp'

else if width<=800 then
bgImageName:='800.bmp'

else if width<=1024 then
bgImageName:='1024.bmp'

else if width<=1152 then
bgImageName:='1152.bmp'

else if width<=1280 then
bgImageName:='1280.bmp'

else
bgImageName:='1600.bmp'

ExtractTemporaryFile(bgImageName)
bgImage.bitmap.LoadFromFile(expandConstant('{tmp}\'+bgImageName))

SetWindowLong(MainForm.Handle,-16,$80000000)
ShowWindow(Mainform.Handle,SW_SHOWMAXIMIZED)
end;[/more] [more=Мой код][Code]
function ShouldSkipPage(CurPage: Integer): Boolean;
begin
if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
case CurPage of
wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
wpSelectDir, wpSelectProgramGroup, wpInfoAfter:
Result := True;
end;
end;

const
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;


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

var Form : TSetupForm;
BackImage, SlideImage: TBitmapImage;
TimerID: LongWord;
S : String;
Width, Height:Integer;


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

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

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

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


function PercentProgress(): Integer;
begin
with WizardForm.ProgressGauge do
begin
Result:=(Position-Min)/((Max - Min)/100)
end
end;


procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);

var Percent: Integer;

begin
Percent:= PercentProgress;
with SlideImage do
begin
if ((percent>0) and (percent<4) and (Tag<>1)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd1.bmp')
Tag:=1
end
else
if ((percent>5) and (percent<8) and (Tag<>2)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd2.bmp')
Tag:=2
end
else
if ((percent>9) and (percent<13) and (Tag<>3)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd3.bmp')
Tag:=3
end
else
if ((percent>14) and (percent<18) and (Tag<>4)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd4.bmp')
Tag:=4
end
else
if ((percent>19) and (percent<23) and (Tag<>5)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd5.bmp')
Tag:=5
end
else
if ((percent>24) and (percent<28) and (Tag<>6)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd6.bmp')
Tag:=6
end
else
if ((percent>32) and (percent<36) and (Tag<>7)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd7.bmp')
Tag:=7
end
else
if ((percent>37) and (percent<41) and (Tag<>8)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd8.bmp')
Tag:=8
end
else
if ((percent>42) and (percent<46) and (Tag<>9)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd9.bmp')
Tag:=9
end
else
if ((percent>47) and (percent<51) and (Tag<>10)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd10.bmp')
Tag:=10
end
else
if ((percent>52) and (percent<56) and (Tag<>11)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd11.bmp')
Tag:=11
end
else
if ((percent>57) and (percent<61) and (Tag<>12)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd12.bmp')
Tag:=12
end
else
if ((percent>62) and (percent<66) and (Tag<>13)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd13.bmp')
Tag:=13
end
else
if ((percent>67) and (percent<71) and (Tag<>14)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd14.bmp')
Tag:=14
end
else
if ((percent>72) and (percent<76) and (Tag<>15)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd15.bmp')
Tag:=15
end
else
if ((percent>77) and (percent<81) and (Tag<>16)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd16.bmp')
Tag:=16
end
else
if ((percent>82) and (percent<86) and (Tag<>17)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd17.bmp')
Tag:=17
end
else
if ((percent>87) and (percent<91) and (Tag<>18)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd18.bmp')
Tag:=18
end
else
if ((percent>92) and (percent<96) and (Tag<>19)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd19.bmp')
Tag:=19
end
else
if ((percent>97) and (percent<100) and (Tag<>20)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd20.bmp')
Tag:=20
end
end
end;


function sndPlaySound(lpszSoundName: string; uFlags: cardinal):integer;
external 'sndPlaySoundA@winmm.dll stdcall';

procedure InitializeWizard();
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then
begin
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
end
else
begin
ExtractTemporaryFile(ExpandConstant('splash.wav'));
sndPlaySound(ExpandConstant('{tmp}\splash.wav'), $0001 or $0008);

WizardForm.Position:= poScreenCenter;
Width:= GetSystemMetrics(0);
Height:= GetSystemMetrics(1);
MainForm.BorderStyle:= bsNone;
MainForm.Left:= 0;
MainForm.Top:= 0;
MainForm.Width:= Width;
MainForm.Height:= Height;

ExtractTemporaryFile('1.bmp');
S:= ExpandConstant('{tmp}')+'\1.bmp';

BackImage:=TBitmapImage.Create(MainForm);
BackImage.Bitmap.LoadFromFile(S);
BackImage.Align:= alClient;
BackImage.Parent:= MainForm;
BackImage.Stretch:= True;
MainForm.Visible:= True;

ExtractTemporaryFile('1.bmp');
ExtractTemporaryFile('bbrd1.bmp');
ExtractTemporaryFile('bbrd2.bmp');
ExtractTemporaryFile('bbrd3.bmp');
ExtractTemporaryFile('bbrd4.bmp');
ExtractTemporaryFile('bbrd5.bmp');
ExtractTemporaryFile('bbrd6.bmp');
ExtractTemporaryFile('bbrd7.bmp');
ExtractTemporaryFile('bbrd8.bmp');
ExtractTemporaryFile('bbrd9.bmp');
ExtractTemporaryFile('bbrd10.bmp');
ExtractTemporaryFile('bbrd11.bmp');
ExtractTemporaryFile('bbrd12.bmp');
ExtractTemporaryFile('bbrd13.bmp');
ExtractTemporaryFile('bbrd14.bmp');
ExtractTemporaryFile('bbrd15.bmp');
ExtractTemporaryFile('bbrd16.bmp');
ExtractTemporaryFile('bbrd17.bmp');
ExtractTemporaryFile('bbrd18.bmp');
ExtractTemporaryFile('bbrd19.bmp');
ExtractTemporaryFile('bbrd20.bmp');
end;
end;

procedure CurPageChanged(CurPageID: Integer);
var Pfunc : LongWord;
begin
If CurPageID = wpInstalling then
begin
Form := CreateCustomForm();

Form.Width:= MainForm.Width;
Form.Height:= MainForm.Height;
Form.BorderStyle := bsNone;
Form.Color:=clBlack;
Form.Parent:=MainForm;
Form.Position:=poScreenCenter;

Form.Show();

pfunc:=WrapTimerProc(@OnTimer, 4)
TimerID:=SetTimer(0, 0, 500, pfunc)

S:= (ExpandConstant('{tmp}') + '\bbrd1.bmp');

SlideImage:= TBitmapImage.Create(Form);
with SlideImage do
begin
Align:= alClient;
Stretch:= True;
Bitmap.LoadFromFile(S);
Parent:= Form;
Tag:= 1;
end

with WizardForm do
begin
MainPanel.Hide;
Bevel1.Hide;
Width:= ScaleX(395);
Height:= ScaleY(142);
Left:= ScaleX(0);
Top:= ScaleY(0);
Left:= ScaleX(MainForm.Width-420);
Top:= ScaleY(MainForm.Height-170);
InnerNotebook.Left:= ScaleX(10);
InnerNotebook.Top:= ScaleY(10);
InnerNotebook.Width:= ScaleX(370);
StatusLabel.Left:= ScaleX(0);
StatusLabel.Top:= ScaleY(0);
StatusLabel.Width:= WizardForm.InnerNotebook.Width;
FileNameLabel.Left:= ScaleX(0);
FileNameLabel.Top:= ScaleY(20);
FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
ProgressGauge.Top:= ScaleY(40);
ProgressGauge.Width:= WizardForm.InnerNotebook.Width;
CancelButton.BringToFront;
CancelButton.Left:= ScaleX(154);
CancelButton.Top:= ScaleY(80);
end
end

if CurPageID = wpFinished then
begin
Form.Free;
KillTimer(0, TimerID);
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Position:=poScreenCenter;
end

if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
(CurPageID = wpSelectComponents) then
WizardForm.BackButton.Visible := False;
end;


procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Res: Integer;
begin
case CurUninstallStep of
usPostUninstall:
begin
if DirExists(ExpandConstant('{app}')) then
if ExpandConstant('{language}') = 'ua' then
case MsgBox('Папка "' + ExpandConstant('{app}') + '" не порожня.'#13#13 +
'"Так" – повне видалення всіх файлів у папці, включаючи саму папку.' #13#13 +
'"Ні" – відкрити папку в провіднику, щоб вручну видалити файли.'#13#13 +
'"Скасувати" – нічого не робити, видалити папку пізніше самостійно.', mbInformation, MB_YESNOCANCEL) of

IDYES:
if not DelTree(ExpandConstant('{app}'), True, True, True) then
MsgBox('Папка не видалена.' #13#13 'Папка або один з файлів у ній задіяні іншою програмою.', mbError, MB_OK);

IDNO:
if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Помилка відкриття.' #13#13 'Папка не знайдена.', mbError, MB_OK);

IDCANCEL: Form.Close;
end
else
if ExpandConstant('{language}') = 'ru' then
case MsgBox('Папка "' + ExpandConstant('{app}') + '" не пуста.'#13#13 +
'"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
'"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
'"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of

IDYES:
if not DelTree(ExpandConstant('{app}'), True, True, True) then
MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);

IDNO:
if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);

IDCANCEL: Form.Close;
end
else
case MsgBox('Directory "' + ExpandConstant('{app}') + '" is not empty.'#13#13 +
'"Yes" to delete all of the files in the directory, including the directory itself.' #13#13 +
'"No" to open the directory with explorer to delete the files manually.'#13#13 +
'"Cancel" to do nothing and delete the directory later manually. ', mbInformation, MB_YESNOCANCEL) of

IDYES:
if not DelTree(ExpandConstant('{app}'), True, True, True) then
MsgBox('Directory is not deleted.' #13#13 'Directory or one of the files are used by the other application.', mbError, MB_OK);

IDNO:
if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Error opening the directory.' #13#13 'Directory is not found.', mbError, MB_OK);

IDCANCEL: Form.Close;
end
end
end
end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
Result := True;
if CurPage = wpSelectDir then
if DirExists( ExpandConstant('{app}') ) then
begin
MsgBox(ExpandConstant('{cm:InstallationIsNotEnabled}'), mbError, mb_Ok);
Result := False;
end
end;
[/more]
Автор: htuos
Дата сообщения: 06.06.2008 23:50
Diawer

Цитата:
помоги ещё изменить иконку в окне выбора языка

думаю, что не помогу, т.к.
1.у формы BorderStyle=bsDialog, т.е. иконки вообще нет, но это не критично
2.LangForm создается еще до главной формы приложения (MainForm), и до того как вызывается InitializeSetup, т.е. из секции [Code_] до нее не добраться
по крайней мере я не знаю как
Автор: KurtWagner
Дата сообщения: 07.06.2008 00:11
Как это сделать? http://kurtwagner.wen.ru/Simpsons.jpg помогите ПОЖАЛУЙСТА... зачем усложнять ДА прост так чтоб красиво было!!! и как вместо фона установки "белый цвет" поменять на черный или на другой???
Автор: serg_aka_lain
Дата сообщения: 07.06.2008 00:26
KurtWagner

Цитата:
Как это сделать?


[more]
procedure InitializeWizard();
begin
with WizardForm do
begin
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left := ScaleX(0);
Top := ScaleY(0);
Width := Mainpanel.Width;
Height := MainPanel.Height;
end;
end;
end;
end;

как вместо фона установки "белый цвет"
- так BackColor=clBlack BackColor2=clBlack
[/more]

Raf_SE


Цитата:
ктонить может его встроить в мой код?


смотри в личку.

Автор: Diawer
Дата сообщения: 07.06.2008 17:15
SotM
htuos
Жаль, что нельзя это сделать, но спасибо за разеснение.
Щас только подумал, а наверняка можно изменить иконку (большую) на странице с прогрессбаром когда идёт деинсталляция.


Добавлено:
Без изменений осталась только она.
Автор: Raf_SE
Дата сообщения: 07.06.2008 18:56
serg_aka_lain
Чисто из любопытства протестировал твой код для растягивания WizardSmallImage, и вобщем вот что вышло:
Автор: serg_aka_lain
Дата сообщения: 07.06.2008 20:03
Raf_SE

Пример был как растянуть картинку на MainPanel,
а PageNameLabel, PageDescriptionLabel нужно отключить в
InitializeWizard
PageNameLabel.Hide;
PageDescriptionLabel.Hide;

а если нужен Транспарент(текст скозь рисунок), это делается отдельно.

Автор: Raf_SE
Дата сообщения: 07.06.2008 20:28
Если не сложно, то было б неплохо если б ты написал код для "Транспарента" и изменения цвета тех шрифтов (к примеру на белый)
Автор: serg_aka_lain
Дата сообщения: 07.06.2008 21:12
Raf_SE

Цитата:
Если не сложно

Нет, пример ...
[more]



[Setup]
AppName=Transparent
AppVerName=Transparent 1.5
CreateAppDir=False
UninstallAble=False
WizardSmallImageFile=картинка.bmp ~ 497 x 58



[_Code]

var
PageNameLabel, PageDescriptionLabel: TLabel;


procedure InitializeWizard();
begin
PageNameLabel := TLabel.Create(WizardForm);
with PageNameLabel do
begin
Left := ScaleX(10);
Top := ScaleY(10);
Width := ScaleX(300);
Height := ScaleY(14);
AutoSize := False;
WordWrap := True;
Font.Color := clWhite;
Font.Style := [fsBold];
ShowAccelChar := False;
Transparent := True;
Parent := WizardForm.MainPanel;
end;

PageDescriptionLabel := TLabel.Create(WizardForm);
with PageDescriptionLabel do
begin
Left := ScaleX(15);
Top := ScaleY(25);
Width := ScaleX(475);
Height := ScaleY(30);
AutoSize := False;
WordWrap := True;
Font.Color := clWhite;
ShowAccelChar := False;
Transparent := True;
Parent := WizardForm.MainPanel;
end;

with WizardForm do
begin
PageNameLabel.Hide;
PageDescriptionLabel.Hide;
with MainPanel do
begin
with WizardSmallBitmapImage do
begin
Left := ScaleX(0);
Top := ScaleY(0);
Width := Mainpanel.Width;
Height := MainPanel.Height;
end;
end;
end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
PageNameLabel.Caption := WizardForm.PageNameLabel.Caption;
PageDescriptionLabel.Caption := WizardForm.PageDescriptionLabel.Caption;
end;

[/more]


Автор: Raf_SE
Дата сообщения: 07.06.2008 22:19
serg_aka_lain
Спасибо! Афигительно красиво выглядит!!!
Автор: serg_aka_lain
Дата сообщения: 08.06.2008 16:10

Цитата:
Афигительно красиво выглядит!!!


При желании, много каких рюшек можно навесить., К примеру на каждую страницу
на MainPanel картинку можно подгружать (видел такое в инсталляторе Crysis, там у каждой из страниц помоему своя картинка),
иконки на странице SelectDirPage , SelectProgramGroup тож сменить можно на свои.
(нужно только желание и время).
Автор: Raf_SE
Дата сообщения: 08.06.2008 16:46

Цитата:
много каких рюшек можно навесить

Меня полностью удовлетворяет одна картинка. ИМХО лучше вставить одну, самую красивую, чем кучу разных, средней паршывости.


Цитата:
нужно только желание и время

Эээ... кстати, а скрипт на слайдшоу, с наборами слайдов под все разрешения монитора, мне стоит ожидать или нет?
Автор: serg_aka_lain
Дата сообщения: 08.06.2008 17:25
Raf_SE

Цитата:
мне стоит ожидать


Да, работающий скрипт есть., дополирую , вечером попозже выложу в личку.
Автор: Sampron
Дата сообщения: 08.06.2008 17:56
Gekkon1976

Цитата:
Подскажите кто знает как можно обойтись без перезагрузки системы, при регистрации в реестре данных параметров.

Попробуй так:

[Code]
const
SHCNF_IDLIST = $0000;
SHCNE_ASSOCCHANGED = $08000000;

procedure SHChangeNotify(wEventId, uFlags, dwItem1, dwItem2: Integer);
external 'SHChangeNotify@shell32.dll stdcall';

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0)
end;
Автор: Raf_SE
Дата сообщения: 08.06.2008 18:21
serg_aka_lain
Ты просто бог! Кстати, нехочь написать свое руководство, типо как Kindly? Думаю твои знания многим бы пригодились.


Цитата:
работающий скрипт есть

Если можно, то дай 3 варианта. Первый скрипт только на слайдшоу, второй - слайдшоу + код для улучшенного деинсталлятора ([more=Встроенный]
[Code]
procedure InitializeWizard();
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then
begin
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
end
else
begin
ExtractTemporaryFile(ExpandConstant('splash.wav'));
sndPlaySound(ExpandConstant('{tmp}\splash.wav'), $0001 or $0008);

WizardForm.Position:= poScreenCenter;
Width:= GetSystemMetrics(0);
Height:= GetSystemMetrics(1);
MainForm.BorderStyle:= bsNone;
MainForm.Left:= 0;
MainForm.Top:= 0;
MainForm.Width:= Width;
MainForm.Height:= Height;

ExtractTemporaryFile('1.bmp');
S:= ExpandConstant('{tmp}')+'\1.bmp';

BackImage:=TBitmapImage.Create(MainForm);
BackImage.Bitmap.LoadFromFile(S);
BackImage.Align:= alClient;
BackImage.Parent:= MainForm;
BackImage.Stretch:= True;
MainForm.Visible:= True;

ExtractTemporaryFile('1.bmp');
ExtractTemporaryFile('bbrd1.bmp');
ExtractTemporaryFile('bbrd2.bmp');
ExtractTemporaryFile('bbrd3.bmp');
ExtractTemporaryFile('bbrd4.bmp');
ExtractTemporaryFile('bbrd5.bmp');
ExtractTemporaryFile('bbrd6.bmp');
ExtractTemporaryFile('bbrd7.bmp');
ExtractTemporaryFile('bbrd8.bmp');
ExtractTemporaryFile('bbrd9.bmp');
ExtractTemporaryFile('bbrd10.bmp');
ExtractTemporaryFile('bbrd11.bmp');
ExtractTemporaryFile('bbrd12.bmp');
ExtractTemporaryFile('bbrd13.bmp');
ExtractTemporaryFile('bbrd14.bmp');
ExtractTemporaryFile('bbrd15.bmp');
ExtractTemporaryFile('bbrd16.bmp');
ExtractTemporaryFile('bbrd17.bmp');
ExtractTemporaryFile('bbrd18.bmp');
ExtractTemporaryFile('bbrd19.bmp');
ExtractTemporaryFile('bbrd20.bmp');
end;
end;

procedure CurPageChanged(CurPageID: Integer);
var Pfunc : LongWord;
begin
If CurPageID = wpInstalling then
begin
Form := CreateCustomForm();

Form.Width:= MainForm.Width;
Form.Height:= MainForm.Height;
Form.BorderStyle := bsNone;
Form.Color:=clBlack;
Form.Parent:=MainForm;
Form.Position:=poScreenCenter;

Form.Show();

pfunc:=WrapTimerProc(@OnTimer, 4)
TimerID:=SetTimer(0, 0, 500, pfunc)

S:= (ExpandConstant('{tmp}') + '\bbrd1.bmp');

SlideImage:= TBitmapImage.Create(Form);
with SlideImage do
begin
Align:= alClient;
Stretch:= True;
Bitmap.LoadFromFile(S);
Parent:= Form;
Tag:= 1;
end

with WizardForm do
begin
MainPanel.Hide;
Bevel1.Hide;
Width:= ScaleX(395);
Height:= ScaleY(142);
Left:= ScaleX(0);
Top:= ScaleY(0);
Left:= ScaleX(MainForm.Width-420);
Top:= ScaleY(MainForm.Height-170);
InnerNotebook.Left:= ScaleX(10);
InnerNotebook.Top:= ScaleY(10);
InnerNotebook.Width:= ScaleX(370);
StatusLabel.Left:= ScaleX(0);
StatusLabel.Top:= ScaleY(0);
StatusLabel.Width:= WizardForm.InnerNotebook.Width;
FileNameLabel.Left:= ScaleX(0);
FileNameLabel.Top:= ScaleY(20);
FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
ProgressGauge.Top:= ScaleY(40);
ProgressGauge.Width:= WizardForm.InnerNotebook.Width;
CancelButton.BringToFront;
CancelButton.Left:= ScaleX(154);
CancelButton.Top:= ScaleY(80);
end
end

if CurPageID = wpFinished then
begin
Form.Free;
KillTimer(0, TimerID);
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Position:=poScreenCenter;
end

if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
(CurPageID = wpSelectComponents) then
WizardForm.BackButton.Visible := False;
end;
[/more] [more=Не встроенный (из мануала)][Code] section
==================

* Add the appropriate functions for your version of Inno Setup:

; For Inno Setup 4.x:

function SkipCurPage(CurPage: Integer): Boolean;
begin
if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
case CurPage of
wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
wpSelectDir, wpSelectProgramGroup, wpInfoAfter:
Result := True;
end;
end;

; For Inno Setup 5.x:

function ShouldSkipPage(CurPage: Integer): Boolean;
begin
if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
case CurPage of
wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
wpSelectDir, wpSelectProgramGroup, wpInfoAfter:
Result := True;
end;
end;

* If you want to skip the welcome wizard page when modify, add these const and
procedures:

; For Inno Setup 4.x and 5.x:

const
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;

procedure InitializeWizard();
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then
begin
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
(CurPageID = wpSelectComponents) then
WizardForm.BackButton.Visible := False;
end;[/more]), а третий такой же как я второй, только со встроенным проигрыванием WAV файла (типо как сдесь: [more=встроенный]
[Code]
function ShouldSkipPage(CurPage: Integer): Boolean;
begin
if Pos('/SP-', UpperCase(GetCmdTail)) > 0 then
case CurPage of
wpLicense, wpPassword, wpInfoBefore, wpUserInfo,
wpSelectDir, wpSelectProgramGroup, wpInfoAfter:
Result := True;
end;
end;

const
WM_LBUTTONDOWN = 513;
WM_LBUTTONUP = 514;


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

var Form : TSetupForm;
BackImage, SlideImage: TBitmapImage;
TimerID: LongWord;
S : String;
Width, Height:Integer;


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

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

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

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


function PercentProgress(): Integer;
begin
with WizardForm.ProgressGauge do
begin
Result:=(Position-Min)/((Max - Min)/100)
end
end;


procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);

var Percent: Integer;

begin
Percent:= PercentProgress;
with SlideImage do
begin
if ((percent>0) and (percent<4) and (Tag<>1)) then begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd1.bmp')
Tag:=1
end
else
if ((percent>5) and (percent<8) and (Tag<>2)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd2.bmp')
Tag:=2
end
else
if ((percent>9) and (percent<13) and (Tag<>3)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd3.bmp')
Tag:=3
end
else
if ((percent>14) and (percent<18) and (Tag<>4)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd4.bmp')
Tag:=4
end
else
if ((percent>19) and (percent<23) and (Tag<>5)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd5.bmp')
Tag:=5
end
else
if ((percent>24) and (percent<28) and (Tag<>6)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd6.bmp')
Tag:=6
end
else
if ((percent>32) and (percent<36) and (Tag<>7)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd7.bmp')
Tag:=7
end
else
if ((percent>37) and (percent<41) and (Tag<>8)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd8.bmp')
Tag:=8
end
else
if ((percent>42) and (percent<46) and (Tag<>9)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd9.bmp')
Tag:=9
end
else
if ((percent>47) and (percent<51) and (Tag<>10)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd10.bmp')
Tag:=10
end
else
if ((percent>52) and (percent<56) and (Tag<>11)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd11.bmp')
Tag:=11
end
else
if ((percent>57) and (percent<61) and (Tag<>12)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd12.bmp')
Tag:=12
end
else
if ((percent>62) and (percent<66) and (Tag<>13)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd13.bmp')
Tag:=13
end
else
if ((percent>67) and (percent<71) and (Tag<>14)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd14.bmp')
Tag:=14
end
else
if ((percent>72) and (percent<76) and (Tag<>15)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd15.bmp')
Tag:=15
end
else
if ((percent>77) and (percent<81) and (Tag<>16)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd16.bmp')
Tag:=16
end
else
if ((percent>82) and (percent<86) and (Tag<>17)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd17.bmp')
Tag:=17
end
else
if ((percent>87) and (percent<91) and (Tag<>18)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd18.bmp')
Tag:=18
end
else
if ((percent>92) and (percent<96) and (Tag<>19)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd19.bmp')
Tag:=19
end
else
if ((percent>97) and (percent<100) and (Tag<>20)) then
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}') + '\bbrd20.bmp')
Tag:=20
end
end
end;


function sndPlaySound(lpszSoundName: string; uFlags: cardinal):integer;
external 'sndPlaySoundA@winmm.dll stdcall';

procedure InitializeWizard();
begin
if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) then
begin
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONDOWN,0,0);
PostMessage(WizardForm.NextButton.Handle,WM_LBUTTONUP,0,0);
end
else
begin
ExtractTemporaryFile(ExpandConstant('splash.wav'));
sndPlaySound(ExpandConstant('{tmp}\splash.wav'), $0001 or $0008);

WizardForm.Position:= poScreenCenter;
Width:= GetSystemMetrics(0);
Height:= GetSystemMetrics(1);
MainForm.BorderStyle:= bsNone;
MainForm.Left:= 0;
MainForm.Top:= 0;
MainForm.Width:= Width;
MainForm.Height:= Height;

ExtractTemporaryFile('1.bmp');
S:= ExpandConstant('{tmp}')+'\1.bmp';

BackImage:=TBitmapImage.Create(MainForm);
BackImage.Bitmap.LoadFromFile(S);
BackImage.Align:= alClient;
BackImage.Parent:= MainForm;
BackImage.Stretch:= True;
MainForm.Visible:= True;

ExtractTemporaryFile('1.bmp');
ExtractTemporaryFile('bbrd1.bmp');
ExtractTemporaryFile('bbrd2.bmp');
ExtractTemporaryFile('bbrd3.bmp');
ExtractTemporaryFile('bbrd4.bmp');
ExtractTemporaryFile('bbrd5.bmp');
ExtractTemporaryFile('bbrd6.bmp');
ExtractTemporaryFile('bbrd7.bmp');
ExtractTemporaryFile('bbrd8.bmp');
ExtractTemporaryFile('bbrd9.bmp');
ExtractTemporaryFile('bbrd10.bmp');
ExtractTemporaryFile('bbrd11.bmp');
ExtractTemporaryFile('bbrd12.bmp');
ExtractTemporaryFile('bbrd13.bmp');
ExtractTemporaryFile('bbrd14.bmp');
ExtractTemporaryFile('bbrd15.bmp');
ExtractTemporaryFile('bbrd16.bmp');
ExtractTemporaryFile('bbrd17.bmp');
ExtractTemporaryFile('bbrd18.bmp');
ExtractTemporaryFile('bbrd19.bmp');
ExtractTemporaryFile('bbrd20.bmp');
end;
end;

procedure CurPageChanged(CurPageID: Integer);
var Pfunc : LongWord;
begin
If CurPageID = wpInstalling then
begin
Form := CreateCustomForm();

Form.Width:= MainForm.Width;
Form.Height:= MainForm.Height;
Form.BorderStyle := bsNone;
Form.Color:=clBlack;
Form.Parent:=MainForm;
Form.Position:=poScreenCenter;

Form.Show();

pfunc:=WrapTimerProc(@OnTimer, 4)
TimerID:=SetTimer(0, 0, 500, pfunc)

S:= (ExpandConstant('{tmp}') + '\bbrd1.bmp');

SlideImage:= TBitmapImage.Create(Form);
with SlideImage do
begin
Align:= alClient;
Stretch:= True;
Bitmap.LoadFromFile(S);
Parent:= Form;
Tag:= 1;
end

with WizardForm do
begin
MainPanel.Hide;
Bevel1.Hide;
Width:= ScaleX(395);
Height:= ScaleY(142);
Left:= ScaleX(0);
Top:= ScaleY(0);
Left:= ScaleX(MainForm.Width-420);
Top:= ScaleY(MainForm.Height-170);
InnerNotebook.Left:= ScaleX(10);
InnerNotebook.Top:= ScaleY(10);
InnerNotebook.Width:= ScaleX(370);
StatusLabel.Left:= ScaleX(0);
StatusLabel.Top:= ScaleY(0);
StatusLabel.Width:= WizardForm.InnerNotebook.Width;
FileNameLabel.Left:= ScaleX(0);
FileNameLabel.Top:= ScaleY(20);
FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
ProgressGauge.Top:= ScaleY(40);
ProgressGauge.Width:= WizardForm.InnerNotebook.Width;
CancelButton.BringToFront;
CancelButton.Left:= ScaleX(154);
CancelButton.Top:= ScaleY(80);
end
end

if CurPageID = wpFinished then
begin
Form.Free;
KillTimer(0, TimerID);
WizardForm.Width:=502;
WizardForm.Height:=392;
WizardForm.Position:=poScreenCenter;
end

if (Pos('/SP-', UpperCase(GetCmdTail)) > 0) and
(CurPageID = wpSelectComponents) then
WizardForm.BackButton.Visible := False;
end;


procedure DeinitializeSetup();
begin
KillTimer(0, TimerID);
end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
Res: Integer;
begin
case CurUninstallStep of
usPostUninstall:
begin
if DirExists(ExpandConstant('{app}')) then
if ExpandConstant('{language}') = 'ua' then
case MsgBox('Папка "' + ExpandConstant('{app}') + '" не порожня.'#13#13 +
'"Так" – повне видалення всіх файлів у папці, включаючи саму папку.' #13#13 +
'"Ні" – відкрити папку в провіднику, щоб вручну видалити файли.'#13#13 +
'"Скасувати" – нічого не робити, видалити папку пізніше самостійно.', mbInformation, MB_YESNOCANCEL) of

IDYES:
if not DelTree(ExpandConstant('{app}'), True, True, True) then
MsgBox('Папка не видалена.' #13#13 'Папка або один з файлів у ній задіяні іншою програмою.', mbError, MB_OK);

IDNO:
if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Помилка відкриття.' #13#13 'Папка не знайдена.', mbError, MB_OK);

IDCANCEL: Form.Close;
end
else
if ExpandConstant('{language}') = 'ru' then
case MsgBox('Папка "' + ExpandConstant('{app}') + '" не пуста.'#13#13 +
'"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
'"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
'"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of

IDYES:
if not DelTree(ExpandConstant('{app}'), True, True, True) then
MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);

IDNO:
if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);

IDCANCEL: Form.Close;
end
else
case MsgBox('Directory "' + ExpandConstant('{app}') + '" is not empty.'#13#13 +
'"Yes" to delete all of the files in the directory, including the directory itself.' #13#13 +
'"No" to open the directory with explorer to delete the files manually.'#13#13 +
'"Cancel" to do nothing and delete the directory later manually. ', mbInformation, MB_YESNOCANCEL) of

IDYES:
if not DelTree(ExpandConstant('{app}'), True, True, True) then
MsgBox('Directory is not deleted.' #13#13 'Directory or one of the files are used by the other application.', mbError, MB_OK);

IDNO:
if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
MsgBox('Error opening the directory.' #13#13 'Directory is not found.', mbError, MB_OK);

IDCANCEL: Form.Close;
end
end
end
end;

function NextButtonClick(CurPage: Integer): Boolean;
begin
Result := True;
if CurPage = wpSelectDir then
if DirExists( ExpandConstant('{app}') ) then
begin
MsgBox(ExpandConstant('{cm:InstallationIsNotEnabled}'), mbError, mb_Ok);
Result := False;
end
end;
[/more] [more=не встроенный]
[Code]
function sndPlaySound(lpszSoundName: string; uFlags: cardinal):integer;
external 'sndPlaySoundA@winmm.dll stdcall';

procedure InitializeWizard();
begin
ExtractTemporaryFile(ExpandConstant('sound.wav'));
sndPlaySound(ExpandConstant('{tmp}\sound.wav'), $0001 or $0008)
end;
[/more]).
Автор: serg_aka_lain
Дата сообщения: 08.06.2008 18:40
Raf_SE


Цитата:
Если можно, то дай 3 варианта.

... Ты посмотри сначал код в личке.


Цитата:
Ты просто бог! Кстати, нехочь написать свое руководство

Нет , какие там знания, просто желание и интерес., А знаний на самом деле не очень много (я всёж не программер).

з.ы. Слайдшоу всёж на основе кода, где определяются популярные разрешения,
и мелкие разрешения я выкинул (сложно ошибки править в таком скрипте.).
Автор: antifire
Дата сообщения: 09.06.2008 10:39
Genri

Последний вариант кода довольно сложен для меня (я просто не дорос до такого уровня).
Проверил - работает так, как было задуманно в начале установки, но что бы это осуществить у меня не хватило опыта... В чем суть?
Автор: AlexDJ666
Дата сообщения: 09.06.2008 12:14
Genri, и снова огромное спасибо

И снова у меня есть вопросы

1. В блоке Memo:= TRichEditViewer.Create(Page); все как и полагается, у меня отображается содержимое rtf-файла, добавляю параметр ScrollBars := ssVertical; и появляется прокрутка на длинных файлах, но вот только она неактивная - то есть не реагирует на попытки ее прокрутить С чем это может быть связано?

2. Этот вопрос я уже задавал, немного перефразирую Как в блок скриншотов, BitmapImage := TBitmapImage.Create(Page); "навесить" свойство OnClick? Чтобы появлялось при клике рядом небольшое окошко (TMemo, TPanel, BitmapImage - не суть).
Автор: braunberg
Дата сообщения: 09.06.2008 13:50
AlexDJ666

Цитата:
2. Этот вопрос я уже задавал
Ну, значит тебе на него уже ответили (страница 80 пост 1597)
Автор: Snake193
Дата сообщения: 09.06.2008 15:58
Может ли инно узнавать Exit Codes запущенной программы.
Нужен инсталлятор, у которого при нажатии на кнопку "Далее" на странице приветствия запускалась программа (с ewWaitUntilTerminated). В программе при нажатии кнопки "OK" (возвращается один код выхода), она закрывается и инсталлятор переходит к следующей странице; а при нажатии кноки "Выход" (программа закрывается и возвращается другой код выхода) - инсталлятор закрывается (срабатывает функция Abort).
ПОМОГИТЕ, очень надо!
Автор: serg_aka_lain
Дата сообщения: 09.06.2008 17:08
Snake193

Конечно можно и это.
Нечто похожее на игровые инсталляторы от EA , после приветсвия запускается отдельный модуль в котором нужно ввести серийный номер, если номер введен переходит дальше, если в том модуле нажать отмена то всё закрывается.
Если принцип такой, то думаю можно.
Автор: Snake193
Дата сообщения: 09.06.2008 18:16
serg_aka_lain:

Верно! Как раз знакомый попросил перепаковать ему C&C The First Decade. Для того чтобы запустить эту программу с нужным языком, требуется запустить ее с параметром: -langID:<код языка> (например "D:\*_code.exe" -langID:1033), а как использовать коды выхода - я не могу осилить.
Автор: serg_aka_lain
Дата сообщения: 09.06.2008 18:22
Snake193

нужно запустьть с параметром и всё?
Автор: Snake193
Дата сообщения: 09.06.2008 18:38
Нужно, чтобы при нажатии в программе кнопки "Отмена" инсталлятор тоже закрывался (срабатывала функция Abort, если не ошибаюсь).
Автор: serg_aka_lain
Дата сообщения: 09.06.2008 18:57
Snake193

Вот по примеру работы модулей для ввода серийников:
Если там нажать Отмена, то соответственно серийник не будет записан в реестр,
а если процедура ввода серийника пройдена то он запишется в реестр.
Смысл проверять эту самую запись в реестре, если есть продолжаем дальше, если нет
закрываемся.

Эта программа тож создает кокие нибудь записи в реестр?, можно так проверить.

Страницы: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667

Предыдущая тема: Поиск в WinDjView


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