Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
var
  BitmapImage1: TBitmapImage;
procedure RedesignWizardForm;
begin
  with WizardForm do
  begin
    AutoScroll := False;
    ClientHeight := ScaleY(425);
    ClientWidth := ScaleX(634);
  end;
  with WizardForm.CancelButton do
  begin
    Left := ScaleX(0);
    Top := ScaleY(7);
    BringToFront;
  end;
  with WizardForm.OuterNotebook do
  begin
    Width := ScaleX(634);
    Height := ScaleY(425);
    Align := alClient;
  end;
  with WizardForm.InnerNotebook do
  begin
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(634);
    Height := ScaleY(425);
    Align := alClient;
  end;
  { BitmapImage1 }
  BitmapImage1 := TBitmapImage.Create(WizardForm);
  with BitmapImage1 do
  begin
    Parent := WizardForm.InstallingPage;
    Left := ScaleX(8);
    Top := ScaleY(64);
    Width := ScaleX(617);
    Height := ScaleY(353);
    Bitmap.LoadFromFile('твой файл');
  end;
  with WizardForm.FilenameLabel do
  begin
    Left := ScaleX(104);
    Top := ScaleY(32);
    Width := ScaleX(529);
  end;
  with WizardForm.StatusLabel do
  begin
    Left := ScaleX(104);
    Top := ScaleY(16);
    Width := ScaleX(529);
  end;
  with WizardForm.ProgressGauge do
  begin
    Left := ScaleX(8);
    Top := ScaleY(50);
    Width := ScaleX(617);
    Height := ScaleY(13);
  end;
  with WizardForm.MainPanel do
  begin
    Width := ScaleX(0);
  end;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpInstalling then
  RedesignWizardForm;
end;[/SOURCE]
[/SPOILER]Если я не ошибаюсь, это немного переделанный скрипт ProgressBar+TimeLeft+SlideShow.iss, который идет в комплекте с ботвой...Подскажите пожалуйста как сделать чтобы при установке было как на скрине.
ОшибаешьсяЕсли я не ошибаюсь
 Это оригинальный инстталл HFS Carbon.
 Это оригинальный инстталл HFS Carbon.т.е если введены эти значения то переход на новую страницу или установку а надо чтоб при любом ключе был переход на страницу, но при этом если все 5 полей не заполнены то кнопка была не активна, помогите кто может. Ввод серийника состоит из букв и цифр вот такой пример серийника 56LC-V6RA-KNP7-RJYH-FARH
var
NewPage: TWizardPage;
TopText: TLabel;
Edit1,Edit2,Edit3,Edit4,Edit5: TEdit;
MyArray: array of Char;
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';
procedure SerialEdit1OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
 if Length(Edit1.Text) = 4 then WizardForm.ActiveControl := Edit2
 
end;
procedure SerialEdit2OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Length(Edit2.Text) = 0 then WizardForm.ActiveControl := Edit1
 if Length(Edit2.Text) = 4 then WizardForm.ActiveControl := Edit3
end;
procedure SerialEdit3OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Length(Edit3.Text) = 0 then WizardForm.ActiveControl := Edit2
 if Length(Edit3.Text) = 4 then WizardForm.ActiveControl := Edit4
end;
procedure SerialEdit4OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Length(Edit4.Text) = 0 then WizardForm.ActiveControl := Edit3
 if Length(Edit4.Text) = 4 then WizardForm.ActiveControl := Edit5
end;
procedure SerialEdit5OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Length(Edit5.Text) = 0 then WizardForm.ActiveControl := Edit4
  WizardForm.Nextbutton.Enabled:= Length(Edit5.Text) = 4
end;
procedure SerialPage;
begin
NewPage:=CreateCustomPage(wpWelcome, 'Ââîä êîäà', 'áëà áëà áëà è ò.ä. ')
TopText:=TLabel.Create(NewPage)
TopText.SetBounds(ScaleX(0),ScaleY(0), ScaleX(417), ScaleY(26));
TopText.AutoSize:=False
TopText.WordWrap:=True
TopText.Caption:='Ââåäèòå êîä, îòïå÷àòàííûé íà ïîñëåäíåé ñòðàíèöå îáëîæêè Ðóêîâîäñòâà ïîëüçîâàòåëÿ èëè íà óïàêîâêå äèñêà.'
TopText.Parent:=NewPage.Surface
Edit1:=TEdit.Create(NewPage)
Edit1.SetBounds(ScaleX(0),ScaleY(60), ScaleX(60), ScaleY(21));
Edit1.AutoSize:=False
Edit1.MaxLength:=4
Edit1.Font.Size:=12
Edit1.Font.Style:=[fsBold]
Edit1.Font.Name:='Arial'
Edit1.Parent:=NewPage.Surface
Edit1.OnKeyUp := @SerialEdit1OnKeyUp
Edit2:=TEdit.Create(NewPage)
Edit2.SetBounds(ScaleX(70),ScaleY(60), ScaleX(60), ScaleY(21));
Edit2.AutoSize:=False
Edit2.MaxLength:=4
Edit2.Font.Size:=12
Edit2.Font.Style:=[fsBold]
Edit2.Font.Name:='Arial'
Edit2.Parent:=NewPage.Surface
Edit2.OnKeyUp := @SerialEdit2OnKeyUp
Edit3:=TEdit.Create(NewPage)
Edit3.SetBounds(ScaleX(140),ScaleY(60), ScaleX(60), ScaleY(21));
Edit3.AutoSize:=False
Edit3.MaxLength:=4
Edit3.Font.Size:=12
Edit3.Font.Style:=[fsBold]
Edit3.Font.Name:='Arial'
Edit3.Parent:=NewPage.Surface
Edit3.OnKeyUp := @SerialEdit3OnKeyUp
Edit4:=TEdit.Create(NewPage)
Edit4.SetBounds(ScaleX(210),ScaleY(60), ScaleX(60), ScaleY(21));
Edit4.AutoSize:=False
Edit4.MaxLength:=4
Edit4.Font.Size:=12
Edit4.Font.Style:=[fsBold]
Edit4.Font.Name:='Arial'
Edit4.Parent:=NewPage.Surface
Edit4.OnKeyUp := @SerialEdit4OnKeyUp
Edit5:=TEdit.Create(NewPage)
Edit5.SetBounds(ScaleX(280),ScaleY(60), ScaleX(60), ScaleY(21));
Edit5.AutoSize:=False
Edit5.MaxLength:=4
Edit5.Font.Size:=12
Edit5.Font.Style:=[fsBold]
Edit5.Font.Name:='Arial'
Edit5.Parent:=NewPage.Surface
Edit5.OnKeyUp := @SerialEdit5OnKeyUp
end;
procedure InitializeWizard();
begin
SerialPage
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = NewPage.ID then
WizardForm.NextButton.Enabled:=false;
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
hWnd: Integer;
begin
Result:=True
if CurPageID = NewPage.ID then
begin
Result:=Edit1.Text = '56LC'
Result:=Edit2.Text = 'V6RA'
Result:=Edit3.Text = 'KNP7'
Result:=Edit4.Text = 'RJYH'
Result:=Edit5.Text = 'FARH'
if not Result then
begin
hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
MessageBox(hwnd, 'не верный серийный номер', 'ошибка', MB_ICONINFORMATION)
Result:=False
end
end
end;procedure SerialCheck(Sender: TObject);
begin
  WizardForm.NextButton.Enabled:= ((Length(Edit1.Text+Edit2.Text+Edit3.Text+Edit4.Text+Edit5.Text)=20);
end;
......
//когда создаются эти эдиты добавь строки
Edit1.OnChange:= @SerialCheck;
...
Edit2.OnChange:= @SerialCheck;
...
Edit3.OnChange:= @SerialCheck;
...
Edit4.OnChange:= @SerialCheck;
...
Edit5.OnChange:= @SerialCheck;
[/source]const
  MaxPartLen = 4;
var
  SerialPage: TWizardPage;
  SerialEdit:Array[0..4]of TNewEdit;
procedure SerialPartOnChange(Sender: TObject);
var
  i,ln: integer;
begin
  ln:=0;
  for i:=0 to 4 do
  begin
    SerialEdit[i].AutoSelect:=False;
    if i<4 then
      if Length(SerialEdit[i].Text)=4 then
        SerialEdit[i+1].SetFocus;
    ln:=ln+Length(SerialEdit[i].Text);
    end;
  WizardForm.NextButton.Enabled := ln=MaxPartLen*5;
end;
procedure CreatePages();
var
i: integer;
begin
  SerialPage := CreateCustomPage(wpWelcome, 'License Information', 'Please enter Serial number, then click Next.');
  for i:=0 to 4 do
  begin
    SerialEdit[i] := TNewEdit.Create(SerialPage);
    with SerialEdit[i] do
    begin
      Left := (50+i*65);
      Top := SerialPage.SurfaceHeight / 2 ;
      Width := ScaleX(48);
      CharCase := ecUpperCase;
      MaxLength := MaxPartLen;
      Parent := SerialPage.Surface;
      OnChange:= @SerialPartOnChange;
    end;
  end;
end;
procedure InitializeWizard();
begin
  CreatePages();
end;
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = SerialPage.ID then
    SerialPartOnChange(nil);
end;[/SOURCE][/SPOILER] 
	 ll Pack\InnoCallback.dll; Flags: dontcopy
ll Pack\InnoCallback.dll; Flags: dontcopytype
  TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
 var
  PercentsTimer: LongWord;
  PercentsLabel: TLabel;
function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';
Function NumToStr(Float: Extended): String;
Begin
  Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
 while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
End;
Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
 with WizardForm.ProgressGauge do
begin
  PercentsLabel:= TLabel.Create(WizardForm);
  PercentsLabel.Top := ScaleX(70);
  PercentsLabel.Left:= ScaleY(85);
  PercentsLabel.Width:= ScaleX(250);
  PercentsLabel.Height:= ScaleY(300);
  PercentsLabel.AutoSize:= false;
  PercentsLabel.Transparent:= true;
  PercentsLabel.WordWrap:= true;
  PercentsLabel.Parent := WizardForm.InstallingPage;
  PercentsLabel.Caption:= 'Общий прогресс установки игры: ' + NumToStr((Position*100)/Max) + ' %';
End;
end;
procedure DeinitializeSetup();
begin
KillTimer(0, PercentsTimer);
end;
procedure InitializeWizard();
begin
  PercentsLabel:= TLabel.Create(WizardForm);
 with PercentsLabel do
begin
  Left:= WizardForm.ProgressGauge.Left;
  Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
  Width:= WizardForm.StatusLabel.Width;
  Height:= WizardForm.StatusLabel.Height;
  AutoSize:= False;
  Transparent := True;
  Parent:= WizardForm.InstallingPage;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
 if CurStep = ssInstall then
begin
  PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
end;
end;[/SPOILER][Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
[Files]
Source: D:\Программы\Inno Setup 5.2.2\Новая папка (4)\DLL\InnoCallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs
[code ]
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);
var
PercentsTimer: LongWord;
PercentsLabel: TLabel;
function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';
Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;
Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption:= 'Общий прогресс установки игры: ' + NumToStr((Position*100)/Max) + ' %';
end;
End;
procedure DeinitializeSetup();
begin
KillTimer(0, PercentsTimer);
end;
procedure InitializeWizard();
begin
PercentsLabel:= TLabel.Create(WizardForm);
with PercentsLabel do
begin
Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
Width:= WizardForm.InstallingPage.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Alignment := taCenter;
Parent:= WizardForm.InstallingPage;
end;
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
end;
end;В процедуре InitializeWizard создается твой лейбл и там же указываются его координатыТеперь возник другой вопрос, где и что нужно прописать чтобы менять местоположение без процедуры PercentsProc ?
Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
Width:= WizardForm.InstallingPage.Width;
Height:= WizardForm.StatusLabel.Height; 
	[COLOR="Red"]Так не получается...[/COLOR]
[Icons]
Name: {commondesktop}\Wheelman; Filename: {app}\Binaries\Wheelman.exe -language=RUS; WorkingDir: {app}; IconFilename: {app}\icon.ico; Check: CheckError('{localappdata}')+'\***')При создании уделении сохранении игры,наткнулся на проблему...Как в Windows 7 сократить такой путь C:\Users\AlexandR\AppData\Local\ ,так как от Windows XP ('{userappdata}')+'\Local\***') не работает?
