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

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

deaddima

Новичок
Здравствуйте товарищи,у меня к вам вопрос(нубский)
Я хочу сделать сборку модов, в список модов входит озвучка.
Выглядит всё так
В неё входит 2 файла которые я предварительно заархивирую.
в игре есть папка {app}\res_app\audio и в ней куча файлов.Так вот эти файлы мне нужно скопировать и вставить в папку {app}\res_mods\audio
Скажите как это сделать?
 

Adil

Старожил
Бахытжан, вот так попробуй

Код
 

Katarn

Новичок
Какой код нужно ввести чтоб было ТАК:
Вот так попробуй:
[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg

Код:
var
  DirTreeView: TFolderTreeView;

procedure DirFolderChange(Sender: TObject);
Begin
  WizardForm.DirEdit.Text:=AddBackslash(DirTreeView.Directory) + 'MyProg'
end;

Procedure InitializeWizard;
begin
  DirTreeView:= TFolderTreeView.Create(WizardForm)
  DirTreeView.SetBounds(0,100,417,110)
  DirTreeView.OnChange:= @DirFolderChange
  DirTreeView.Parent:= WizardForm.SelectDirPage
//	DirTreeView.ChangeDirectory(ExpandConstant('{pf}'), True)
end;[/SPOILER]
 

LordSP

Новичок
Ребят, всем привет! У меня такой вопрос, я смотрел скрипт Need for Speed Undercover 2.4, там мне понравилась бегущая строка в заголовке Autorun.iss, подскажите пожалуйста, скрипт только бегущей строки, оттуда у меня не получилось выдернуть его.
 

Mailchik

Старожил
Проверенный
LordSP,
Код:
[Setup]
AppName=My Application
AppVerName=My Application
DefaultDirName={pf}\My Application

[B][[/B]Code]
var
  Timer1: TTimer;

procedure Timer1Timer(Sender: TObject);
var
 s: string;
 begin
  s := WizardForm.Caption;
  WizardForm.Caption := Copy(s, 2, Length(s) - 1) + Copy(s, 1, 1);
end;

procedure InitializeWizard();
begin
  WizardForm.Caption:= 'Бегущая строка - Krinkels.org.                                          ';
  Timer1:= TTimer.Create(WizardForm);
  with Timer1 do begin
    Interval:= 200;
    OnTimer:= @Timer1Timer;
  end;
end;
 

LordSP

Новичок
Mailchik, Спасибо, а не могли бы вы еще выдернуть бегущий текст, слева при нажатии на картинку, когда он начинает печататься?
 

Mailchik

Старожил
Проверенный
LordSP,
Код:
[Setup]
AppName=My Application
AppVerName=My Application
DefaultDirName={pf}\My Application

[B][[/B]Code]
var
  Label1, Label2: TLabel;
  s1, s2: string;
  Timer1: TTimer;
  i: Integer;

procedure Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled:= False;
  s1 := WizardForm.WelcomeLabel1.Caption;
  s2 := WizardForm.WelcomeLabel2.Caption;
  Label1.Caption:= '';
  for i:= 1 to Length(s1) do begin
    if Application.Terminated then Break;
    Label1.Caption:= Label1.Caption + s1[i];
    Application.ProcessMessages;
    Sleep(100);
  end;
  Label2.Caption:= '';
  for i:= 1 to Length(s2) do begin
    if Application.Terminated then Break;
    Label2.Caption:= Label2.Caption + s2[i];
    Application.ProcessMessages;
    Sleep(60);
  end;
end;

procedure CreateComponents;
 begin
 with WizardForm do begin
  WelcomeLabel1.Hide;
  WelcomeLabel2.Hide;
  Label1 := TLabel.Create(WizardForm);
  with Label1 do begin
    SetBounds(WelcomeLabel1.Left, WelcomeLabel1.Top, WelcomeLabel1.Width, WelcomeLabel1.Height);
    AutoSize:= WelcomeLabel1.AutoSize;
    WordWrap:= WelcomeLabel1.WordWrap;
    Font.Style:= WelcomeLabel1.Font.Style;
    Font.Size:= WelcomeLabel1.Font.Size;
    Font.Color:= WelcomeLabel1.Font.Color;
    Transparent:= True;
    Caption:= '';
    Parent:= WizardForm.WelcomePage;
  end;

  Label2 := TLabel.Create(WizardForm);
  with Label2 do begin
    SetBounds(WelcomeLabel2.Left, WelcomeLabel2.Top, WelcomeLabel2.Width, WelcomeLabel2.Height);
    AutoSize:= WelcomeLabel2.AutoSize;
    WordWrap:= WelcomeLabel2.WordWrap;
    Font.Style:= WelcomeLabel2.Font.Style;
    Font.Size:= WelcomeLabel2.Font.Size;
    Font.Color:= WelcomeLabel2.Font.Color;
    Transparent:= True;
    Caption:= '';
    Parent:= WizardForm.WelcomePage;
  end;

  Timer1:= TTimer.Create(WizardForm);
  with Timer1 do begin
    Interval:= 500;
    OnTimer:= @Timer1Timer;
  end;
 end;
end;

procedure InitializeWizard();
begin
  CreateComponents;
end;
 

LordSP

Новичок
Mailchik, Спасибо, вот еще у меня тут есть код, на страницу ввода серийного номера, но она некорректно работает,если вводить быстро буквы, они стираются, и хотелось бы чтобы они вводились заглавными буквами, и возвращение назад по Edit'ам было не только на BackSpace, но и на Del, и стрелочки?
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

Код:
var NewPage: TWizardPage; TopText: TLabel; Edit1,Edit2,Edit3,Edit4,Edit5: TEdit;

//const MB_ICONINFORMATION = $40;8 MB_ICONEXCLAMATION = $30; MB_ICONQUESTION = $20; MB_ICONSTOP = $10; MB_ICONNONE = $0;

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) = 5 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) = 5 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) = 5 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) = 5 then WizardForm.ActiveControl := Edit5
end;

procedure SerialEdit5OnKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if Length(Edit5.Text) = 0 then WizardForm.ActiveControl := Edit4
end;

procedure SerialPage;
begin
NewPage:=CreateCustomPage(wpWelcome, 'Ââîä êîäà', 'áëà áëà áëà è ò.ä. ')

TopText:=TLabel.Create(NewPage)
TopText.Left:=0
TopText.Top:=0
TopText.Width:=417
TopText.Height:=28
TopText.AutoSize:=False
TopText.WordWrap:=True
TopText.Caption:='Ââåäèòå êîä, îòïå÷àòàííûé íà ïîñëåäíåé ñòðàíèöå îáëîæêè Ðóêîâîäñòâà ïîëüçîâàòåëÿ èëè íà óïàêîâêå äèñêà.'
TopText.Parent:=NewPage.Surface

Edit1:=TEdit.Create(NewPage)
Edit1.Left:=0
Edit1.Top:=60
Edit1.Width:=60
Edit1.Height:=21
Edit1.AutoSize:=False
Edit1.MaxLength:=5
Edit1.Font.Size:=12
Edit1.Font.Style:=[fsBold]
Edit1.Font.Name:='Arial'
Edit1.Parent:=NewPage.Surface
Edit1.OnKeyUp := @SerialEdit1OnKeyUp

Edit2:=TEdit.Create(NewPage)
Edit2.Left:=70
Edit2.Top:=60
Edit2.Width:=60
Edit2.Height:=21
Edit2.AutoSize:=False
Edit2.MaxLength:=5
Edit2.Font.Size:=12
Edit2.Font.Style:=[fsBold]
Edit2.Font.Name:='Arial'
Edit2.Parent:=NewPage.Surface
Edit2.OnKeyUp := @SerialEdit2OnKeyUp

Edit3:=TEdit.Create(NewPage)
Edit3.Left:=140
Edit3.Top:=60
Edit3.Width:=60
Edit3.Height:=21
Edit3.AutoSize:=False
Edit3.MaxLength:=5
Edit3.Font.Size:=12
Edit3.Font.Style:=[fsBold]
Edit3.Font.Name:='Arial'
Edit3.Parent:=NewPage.Surface
Edit3.OnKeyUp := @SerialEdit3OnKeyUp

Edit4:=TEdit.Create(NewPage)
Edit4.Left:=210
Edit4.Top:=60
Edit4.Width:=60
Edit4.Height:=21
Edit4.AutoSize:=False
Edit4.MaxLength:=5
Edit4.Font.Size:=12
Edit4.Font.Style:=[fsBold]
Edit4.Font.Name:='Arial'
Edit4.Parent:=NewPage.Surface
Edit4.OnKeyUp := @SerialEdit4OnKeyUp

Edit5:=TEdit.Create(NewPage)
Edit5.Left:=280
Edit5.Top:=60
Edit5.Width:=60
Edit5.Height:=21
Edit5.AutoSize:=False
Edit5.MaxLength:=5
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;

function NextButtonClick(CurPageID: Integer): Boolean;
var
 hWnd: Integer;
begin
Result:=True
if CurPageID = NewPage.ID then
begin
Result:=Edit1.Text = '11111'
Result:=Edit2.Text = '22222'
Result:=Edit3.Text = '33333'
Result:=Edit4.Text = '44444'
Result:=Edit5.Text = '55555'
if not Result then
begin
hWnd := StrToInt(ExpandConstant('{wizardhwnd}'));
MessageBox(hwnd, 'Íåâåðíûé ñåðèéíûé íîìåð.', 'Îøèáêà!', MB_ICONINFORMATION)
Result:=False
end
end
end;[/SPOILER]
 

Mailchik

Старожил
Проверенный
чтобы они вводились заглавными буквами
для каждого Edit'а добавить CharCase := ecUpperCase; Например, Edit1.CharCase := ecUpperCase;
если вводить быстро буквы, они стираются
для каждого Edit'а добавить AutoSelect := False; Например, Edit1.AutoSelect := False;
и возвращение назад по Edit'ам было не только на BackSpace, но и на Del, и стрелочки
у вас устроено автоматическое фокусирование опираясь на "наполненность" Edit'ов.
 

Mailchik

Старожил
Проверенный
LordSP, в вашем скрипте прописано: если в Edit0 знаков, то фокус передается предыдущему Edit'у, если же в Edit5 знаков, то фокус передается следующему Edit'у.
 

LordSP

Новичок
Ребят а есть у кого скрипт только времени установки т.е прошло: ... осталось: ...
 
Последнее редактирование:

aLLeXUs

Участник
Всем привет, подскажите какой-нибудь простейший пример для реализации нестандартной формы(например как PDA - S.t.a.l.k.e.r, Diablo 3 Install...). Смотрел несколько примеров, но запутался. Буду очень благодарен за вашу помощь.
 
Последнее редактирование:

Mailchik

Старожил
Проверенный
Ребят а есть у кого скрипт только времени установки т.е прошло: ... осталось: ...
С ISDone или без?
Код:
[Setup]
AppName=My Application
AppVerName=My Application
DefaultDirName={pf}\My Application

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

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[CustomMessages]
rus.hour= часов
rus.min= мин
rus.sec= сек

[B][[/B]code]
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
StartInstall: Integer;
TimeLabel, TImeLabel2: TLabel;
TimerID: Longword;

function GetTickCount: DWord;
 external 'GetTickCount@kernel32';
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 cm(Message: String): String;
Begin
 Result:= ExpandConstant('{cm:'+ Message +'}')
End;

Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail then            {hh: mm:ss format}
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000 then    {more than hour}
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000 then    {1..60 minutes}
        Result:= IntToStr(Ticks/60000) +m+' '+ IntToStr(Ticks/1000 - Ticks/1000/60*60) +s
    else Result:= Format('%.1n', [Abs(Ticks/1000)]) +s    {less than one minute}
End;

procedure GetTime(HandleW, Msg, idEvent, TimeSys: LongWord);
var Remaining: Integer;
begin
with WizardForm.ProgressGauge do begin
  if position > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((max - position)/position));
    TimeLabel.Caption:= 'Осталось ' + TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false);
    if (Remaining = 0) then TimeLabel.Caption:= 'Завершение...';
    TimeLabel2.Caption:= 'Прошло ' + TicksToTime(GetTickCount - StartInstall, cm('hour'), cm('min'), cm('sec'), false);
  end;
end;

procedure InitializeWizard();
begin
TimeLabel:= TLabel.Create(WizardForm)
TimeLabel.SetBounds(ScaleX(0), ScaleY(80), ScaleX(457), ScaleY(20));
TimeLabel.AutoSize:= False
TimeLabel.Transparent:= True;
TimeLabel.Parent:= WizardForm.InstallingPage;
TimeLabel2:= TLabel.Create(WizardForm)
TimeLabel2.SetBounds(ScaleX(0), ScaleY(105), ScaleX(457), ScaleY(20));
TimeLabel2.AutoSize:= False
TimeLabel2.Transparent:= True;
TimeLabel2.Parent:= WizardForm.InstallingPage;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
If CurStep = ssInstall then
  begin
    StartInstall:= GetTickCount
    TimerID:= SetTimer(0,0, 500, WrapTimerProc(@GetTime, 4))
  end;
end;

procedure DeinitializeSetup();
begin
KillTimer(0, TimerID)
end;
Если с ISDone, то в ISDone_Example.iss всё есть. LabelTime1 и LabelTime2 отвечают за прошедшее и оставшееся время.
Всем привет, подскажите какой-нибудь простейший пример для реализации нестандартной формы(например как PDA - S.t.a.l.k.e.r, Diablo 3 Install...). Смотрел несколько примеров, но запутался. Буду очень благодарен за вашу помощь.
функция CreateFromFromImage из botva2.dll. Пример есть в архиве библиотеки b2p, скрипт CreateFromFromImage.iss, если я не ошибаюсь.
 

LordSP

Новичок
Mailchik, А как сделать на расширенной версии, через Form Designer привязать к своим Labe'ам, без процедуры
Код:
procedure InitializeWizard();
begin
TimeLabel:= TLabel.Create(WizardForm)
TimeLabel.SetBounds(ScaleX(0), ScaleY(80), ScaleX(457), ScaleY(20));
TimeLabel.AutoSize:= False
TimeLabel.Transparent:= True;
TimeLabel.Parent:= WizardForm.InstallingPage;
TimeLabel2:= TLabel.Create(WizardForm)
TimeLabel2.SetBounds(ScaleX(0), ScaleY(105), ScaleX(457), ScaleY(20));
TimeLabel2.AutoSize:= False
TimeLabel2.Transparent:= True;
TimeLabel2.Parent:= WizardForm.InstallingPage;
end;

т.е. если я ее в этом коде удаляю эту процедуру, выдает ошибку, зачем мне создавать уже созданные Labe'ы?

Кстати такая проблема у меня возникает и с показом процентов при установке, даже если оставить так:
Код:
procedure InitializeWizard();
begin
TimeLabel:= TLabel.Create(WizardForm)
end;
то все хорошо работает, стоит удалить, все, выдает ошибку, как привязать к своим Label'ам созданных в FormDesigner? без InitializeWizard
 
Последнее редактирование:

Mailchik

Старожил
Проверенный
LordSP, ну дак в процедуре GetTime вместо TimeLabel.Caption:= 'Осталось ' + TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false); и TimeLabel2.Caption:= 'Прошло ' + TicksToTime(GetTickCount - StartInstall, cm('hour'), cm('min'), cm('sec'), false); пропишите названия своих лэйблов. и стоило бы уже научиться понимать то, что говорит вам компилятор. если спрашивать каждую ошибку, так можно до бесконечности объяснять.
 

LordSP

Новичок
Mailchik, Я знаю, я так и делаю, вместо создаваемых Label'ов вставляю ссылки на свои, но я к чему, можно обойтись без процедуры InitializeWizard, со своими Label'ами?
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху