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.Если я не ошибаюсь
т.е если введены эти значения то переход на новую страницу или установку а надо чтоб при любом ключе был переход на страницу, но при этом если все 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]
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:= 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\***') не работает?