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

Статус
В этой теме нельзя размещать новые ответы.

Katarn

Новичок
Подскажите пожалуйста как сделать чтобы при установке было как на скрине.
 

LexBell

Борода
Супер модератор
Katarn, 5 минут в формдизайнере расширенной версии:
[SOURCE=iss][Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

Код:
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]
 

demon777

Новичок
Всем привет. Ребята помогите найти скрипт проверки ввода данных
Сейчас она выглядит так
function NextButtonClick(CurPageID: Integer): Boolean;
var
hWnd: Integer;
begin
Result:=True
if CurPageID = NewPage.ID then
begin
Result:=Edit1.Text = '1111'
Result:=Edit2.Text = '2222'
Result:=Edit3.Text = '3333'
Result:=Edit4.Text = '4444'
Result:=Edit5.Text = '5555'
if not Result then
begin
hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
MessageBox(hwnd, 'Неверный серийный номер.', 'Ошибка!', MB_ICONINFORMATION)
Result:=False
end
т.е если введены эти значения то переход на новую страницу или установку а надо чтоб при любом ключе был переход на страницу, но при этом если все 5 полей не заполнены то кнопка была не активна, помогите кто может. Ввод серийника состоит из букв и цифр вот такой пример серийника 56LC-V6RA-KNP7-RJYH-FARH
 

Winst@n

Участник
Проверенный
т.е если введены эти значения то переход на новую страницу или установку а надо чтоб при любом ключе был переход на страницу, но при этом если все 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;
Хотя я нифига не понял что вы хотите сделать. И в следующий раз нужно весь пример кидать. А то сидел искал где же я это видел.
 

demon777

Новичок
Winst@n
Ты сделал тоже самое :) только поставил ключ который я написал а мне надо чтоб проверка делалась на любые введенные данные, а не только на определенный ключ;)
 

Winst@n

Участник
Проверенный
demon777,
С чего же у вас кнопка далее не активна пока не введутся все значения в эдиты.
Я выше написал что не понял что вы хотите сделать, изъяснитесь нормально.
 

Shegorat

Lord of Madness
Администратор
demon777
Примерный код, точнее кусок кода
[source=iss]
Код:
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]
 

demon777

Новичок
Shegorat, сделал все как ты написал но такая трабла, если не чего не ввел установка начинается, в чем может быть проблема? Если можешь зайди пожалуйста в ICQ
 

LexBell

Борода
Супер модератор
Вот полностью рабочий пример. Генри вчера на руборде дал тебе аналогичный.
[SOURCE="inno"][Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program

Код:
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]
 

R2d3s

Олень
Подскажите плиз как сделать картинку при нажатию на *О программе* как в krinkels team
 

Katarn

Новичок
Столкнулся с проблемой сам как ни пытался исправить не смог, прошу помощи! Смотреть скрин:
Скрипт прилагается.

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

[Files]
Source: compiler:Dll Pack\InnoCallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs

Код:
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]
 

YURSHAT

Тех. админ
Администратор
Katarn, держиЗЫ. Ошибка была в процедуре PercentsProc. Не нужно там координаты прописывать...
 

Katarn

Новичок
YURSHAT,
Теперь возник другой вопрос, где и что нужно прописать чтобы менять местоположение без процедуры PercentsProc ?
 

YURSHAT

Тех. админ
Администратор
Теперь возник другой вопрос, где и что нужно прописать чтобы менять местоположение без процедуры PercentsProc ?
В процедуре InitializeWizard создается твой лейбл и там же указываются его координаты
Код:
Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
Width:= WizardForm.InstallingPage.Width;
Height:= WizardForm.StatusLabel.Height;
 

AlexandR

Новичок
Возник такой вопрос,как прописать в скрипте чтобы создался ярлык с параметром,как на примере игры Wheelman?

Код:
[COLOR="Red"]Так не получается...[/COLOR]
[Icons]
Name: {commondesktop}\Wheelman; Filename: {app}\Binaries\Wheelman.exe -language=RUS; WorkingDir: {app}; IconFilename: {app}\icon.ico; Check: CheckError
 

ReFLeXx

Новичок
AlexandR,
Код:
[Icons]
Name: {commondesktop}\Wheelman; Filename: {app}\Binaries\Wheelman.exe; WorkingDir: {app}; Parameters:"-language=RUS"; IconFilename: {app}\icon.ico; Check: CheckError
 

AlexandR

Новичок
При создании уделении сохранении игры,наткнулся на проблему...Как в Windows 7 сократить такой путь C:\Users\AlexandR\AppData\Local\ ,так как от Windows XP ('{userappdata}')+'\Local\***') не работает?
 

TERRAN

Новичок
Проверенный
При создании уделении сохранении игры,наткнулся на проблему...Как в Windows 7 сократить такой путь C:\Users\AlexandR\AppData\Local\ ,так как от Windows XP ('{userappdata}')+'\Local\***') не работает?
('{localappdata}')+'\***')
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху