Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 4]
rasim933
24-03-2012, 21:37
Ненет! 18 гио на ё1 диске. нет. Я хочу их разделить на 4 диска. В моём случае, авторан вот такой: http://i35.fastpic.ru/thumb/2012/0324/7b/b716b424f7bcc7350220ba8599bf6c7b.jpeg (http://fastpic.ru/view/35/2012/0324/b716b424f7bcc7350220ba8599bf6c7b.png.html). Я неуверен что подобное можно сделать в иннго.
Gnom_aka_Lexander
24-03-2012, 22:04
Я неуверен что подобное можно сделать в иннго. »
В инно можно все!
Ну, или почти все :) А чего нельзя, но очень хочется, то все равно можно.
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm := False;
Cancel := True;
end;
procedure NewButtonClick(Sender: TObject);
begin
case TNewButton(Sender).Tag of
0: MsgBox('Вы нажали кнопку 1',mbInformation,MB_OK);
1: MsgBox('Вы нажали кнопку 2',mbInformation,MB_OK);
2: MsgBox('Вы нажали кнопку 3',mbInformation,MB_OK);
3: MsgBox('Вы нажали кнопку 4',mbInformation,MB_OK);
4: MsgBox('Вы нажали кнопку 5',mbInformation,MB_OK);
5: MsgBox('Вы нажали кнопку 6',mbInformation,MB_OK);
6: MsgBox('Вы нажали кнопку 7',mbInformation,MB_OK);
7: WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
end;
end;
procedure InitializeWizard();
Var
i:Integer;
begin
with WizardForm do
begin
AutoScroll := False;
ClientHeight := ScaleY(260);
ClientWidth := ScaleX(190);
Bevel.Hide;
OuterNotebook.Hide;
NextButton.Hide;
for i:=0 to 7 do
begin
with TNewButton.Create(WizardForm) do
begin
Parent := WizardForm;
SetBounds(ScaleX(10),ScaleY(10+i*30),ScaleX(170),ScaleY(25));
case i of
0: Caption := 'Кнопка 1';
1: Caption := 'Кнопка 2';
2: Caption := 'Кнопка 3';
3: Caption := 'Кнопка 4';
4: Caption := 'Кнопка 5';
5: Caption := 'Кнопка 6';
6: Caption := 'Кнопка 7';
7: Caption := 'Выход';
end;
OnClick := @NewButtonClick;
Tag := i;
end;
end;
end;
end;
rasim933
24-03-2012, 22:18
А можно кнкретней? Я несмогу это всё перечитать....
Gnom_aka_Lexander
24-03-2012, 22:25
Там по минимуму - восемь кнопок и обработчик для каждой с примером выполнения команды. Команды вместо меседжбоксов свои вставляй и пользуйся. Ну и надписи на кнопках - надеюсь, понятно, где их поменять?
rasim933
24-03-2012, 22:36
К сожалению, я с эти вообще незнаком. Сейчас я попробрую полазить в литературе.
Нашёл вроде вот это. Это пойдёт доя кнопки?
[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=userdocs:Test.
[Languages]
Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl";
[Files]
;Изображение размером 320х23
Source: button2.bmp; DestDir: {tmp}; Flags: dontcopy
[Code]
const
ButtonWidth = 80;
ButtonHeight = 23;
var
WizardLabel: TLabel;
ButtonPanel: array of TPanel;
ButtonImage: array of TBitmapImage;
ButtonLabel: array of TLabel;
UsedButtons: array of TButton;
ButtonsCount: Integer;
procedure ButtonLabelClick(Sender: TObject);
var Button: TButton; n, i: Integer;
begin
i:= TLabel(Sender).Tag; ButtonImage[i].Left:= 0
for n:=0 to (ButtonsCount-1) do begin
if i = n then Button:= UsedButtons[n];
end;
Button.OnClick(Button)
end;
procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth*2
end;
procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;
procedure ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n, I: Integer;
begin
I:=TLabel(Sender).Tag;
//Сначала восстанавливаем картинку у всех кнопок, так надо иначе могут быть глюки
for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end;
//Теперь собственно ставим нужную картинку
if (ButtonLabel[I].Enabled)and(ButtonImage[I].Left <> -ButtonWidth*2) then begin ButtonImage[I].Left:= -ButtonWidth; end;
end;
procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n: Integer;
begin
//Т.к Sender'ом выступает WizardLabel то не получится испльзовать индекс кнопки
for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end;
end;
procedure LoadButtonImage(AButton: TButton);
var n: Integer;
begin
n:=ButtonsCount; SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1); SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1); UsedButtons[n]:= AButton;
ButtonPanel[n]:=TPanel.Create(WizardForm)
ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height)
ButtonPanel[n].Tag:= n
ButtonPanel[n].Enabled:= AButton.Enabled
ButtonPanel[n].Parent:=AButton.Parent
ButtonImage[n]:=TBitmapImage.Create(WizardForm)
ButtonImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(320), ScaleY(23))
ButtonImage[n].Enabled:=False
ButtonImage[n].Bitmap.LoadFromFile(ExpandConstant('{tmp}\Button2.bmp'))
ButtonImage[n].Parent:=ButtonPanel[n]
with TLabel.Create(WizardForm) do begin
Tag:=n
Parent:=ButtonPanel[n]
Width:=AButton.Width
Height:=AButton.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseMove:=@ButtonLabelMove
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end
ButtonLabel[n]:=TLabel.Create(WizardForm)
ButtonLabel[n].Autosize:=True
ButtonLabel[n].Alignment:=taCenter
ButtonLabel[n].Tag:=n
ButtonLabel[n].Enabled:= AButton.Enabled
ButtonLabel[n].Transparent:=True
ButtonLabel[n].Font.Color:=clWhite
ButtonLabel[n].Caption:=AButton.Caption
ButtonLabel[n].OnClick:=@ButtonLabelClick
ButtonLabel[n].OnDblClick:=@ButtonLabelClick
ButtonLabel[n].OnMouseMove:=@ButtonLabelMove
ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown
ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp
ButtonLabel[n].Parent:=ButtonPanel[n]
ButtonsCount:= ButtonsCount+1
end;
procedure UpdateButtons();
var n: Integer;
begin
for n:=0 to ButtonsCount-1 do begin
ButtonLabel[n].Caption:=UsedButtons[n].Caption
ButtonPanel[n].Visible:=UsedButtons[n].Visible
if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0;
ButtonLabel[n].Enabled:= UsedButtons[n].Enabled;
ButtonPanel[n].Enabled:= UsedButtons[n].Enabled;
//Ставим Left и Top лейбла соразмерно размеру лейбла
ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;
end;
procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку активной
WizardForm.NextButton.Enabled:= True;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons();
end;
procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку неактивной
WizardForm.NextButton.Enabled:= False;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons()
end;
procedure InitializeWizard();
begin
WizardLabel:= TLabel.Create(WizardForm)
WizardLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(WizardForm.Width), ScaleY(WizardForm.Height))
WizardLabel.Transparent:= True;
WizardLabel.AutoSize:=false;
WizardLabel.OnMouseMove:=@WizardLabelMove
WizardLabel.Parent:= WizardForm;
WizardForm.BackButton.Width:= ButtonWidth
WizardForm.BackButton.Height:= ButtonHeight
WizardForm.NextButton.Width:= ButtonWidth
WizardForm.NextButton.Height:= ButtonHeight
WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:= ButtonHeight
WizardForm.DirBrowseButton.Left:=ScaleX(337)
WizardForm.DirBrowseButton.Width:= ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight
WizardForm.GroupBrowseButton.Left:=ScaleX(337)
WizardForm.GroupBrowseButton.Width:= ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight
WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick
WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick
ExtractTemporaryFile('button2.bmp')
LoadButtonImage(WizardForm.BackButton)
LoadButtonImage(WizardForm.NextButton)
LoadButtonImage(WizardForm.CancelButton)
LoadButtonImage(WizardForm.DirBrowseButton)
LoadButtonImage(WizardForm.GroupBrowseButton)
end;
procedure CurPageChanged(CurPageID: Integer);
begin
UpdateButtons()
end;
Gnom_aka_Lexander
24-03-2012, 22:46
Это пойдёт доя кнопки? »
Это пример текстурирования кнопки битмапами. Если ты считаешь, что осилишь этот пример и тебе нужны именно текстурированные кнопки, то вполне пойдет. Если тебе нужно просто создать кнопки и обработать их клики, как у тебя на скрине, то моего примера больше, чем достаточно.
rasim933
24-03-2012, 23:08
Лучьше твой пример. Но, ведь я незнаю как именно по твоему примеру делать кнопки(((( Если можено, то пришли пожалста сюда коды кнопок.
Johny777
25-03-2012, 00:05
rasim933,
для начала убери пожалуйста свой код на пол страницы в твой код
и у меня вопрос
дисков 4?
а где авторан лежит?
если на каждом, то это малость странно. Ладно ты пишешь на блюрей, но хочешь чтоб каждая игра имела свой инсталлер.
если всё таки на всех дисках лежит одинаковый авторан, то проще всего вести поиск файла в {src}\game_1.exe и если он существует, то кнопка активна, а другие нет
в противном случае нужно копировать авторан на комп (ведь если нужная игра не на диске и нужно вставить другой, то активная копия авторана закроется) и вести поиск вроде {drive:{src}}
если у тебя setup.exe один, а bin фалы разбиты на диски, то при выборе компонента (игры) инно сам попросит вставить диск и причём здесь тогда авторан?
короче я не рублю
скажи как оно должно работать и возможно тогда будет легче тебе помочь
rasim933
25-03-2012, 00:19
Я хоч сделать 4 диска. Вот скрин всех файлов: http://i33.fastpic.ru/thumb/2012/0324/ff/53fd1c8311f578633e0cb30f775e46ff.jpeg (http://fastpic.ru/view/33/2012/0324/53fd1c8311f578633e0cb30f775e46ff.png.html). Сечас, все файлы по папкам распиханы. Пока дисков нет.
и убери пожалуйста свой код на пол страницы в твой код »Теперь буду знать как это делается)))))
Johny777
25-03-2012, 00:32
rasim933,
ты не ответил на мой вопос
как оно должно работать пусть на твоём текущем авторане?
куда и как запишешь?
что должно запускать что и откуда?
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
мой тебе совет. На каждый двухслойный диск свой авторан, сколько бы игр на нём не лежало
от 4 старых до 1 новой на диск
rasim933
25-03-2012, 01:01
1 *.exe файл авторана на первом диске, на остальных дисках, другие файлы. Соберу всё и запишу на 4 DVD5 диска. Сую первый диск, запускается авторан, жму на кнопу, требует диск 2. сую диск 2, жму на кнопку, установка начинается. авторан запускается с 1 диска.
Johny777
25-03-2012, 01:19
другие файлы »
а именно?
требует диск 2. сую диск 2, жму на кнопку »
Скажи сколько установщиков у тебя?
Если один, то запрос дика это работа инно и авторан тут никаким боком
вывод
если инсталяторов много, то авторан с кучей кнопок это сложно (для меня), тк игры на разных дисках.
Если установщик один, а в нём много игр, то опять же аторан нужен, но не такой, тк в конечном итоге выбор игры осуществляется в самом инсталлере а не через авторан
rasim933
25-03-2012, 01:47
Описать про другие файлы несмогу. Вот картинки -
1 картинка со всеми файлами - http://i28.fastpic.ru/thumb/2012/0325/35/f7e7d3b52a00ba26bf6d26fceb042235.jpeg (http://fastpic.ru/view/28/2012/0325/f7e7d3b52a00ba26bf6d26fceb042235.png.html),
2 картинка 1 папки - http://i33.fastpic.ru/thumb/2012/0325/9a/eeff37fb227c6cdbf8e9109c546ca19a.jpeg (http://fastpic.ru/view/33/2012/0325/eeff37fb227c6cdbf8e9109c546ca19a.png.html)
3 картинка 2 папки - http://i35.fastpic.ru/thumb/2012/0325/f8/09c7a8099de6c8135bf3245987750af8.jpeg (http://fastpic.ru/view/35/2012/0325/09c7a8099de6c8135bf3245987750af8.png.html).
У меня 10 игр, у каждой игры есть свой екзешник (*.exe).
При нажатии одной кнопки в антолгии, запускается экзешник (*.exe) одной игры.
У меня такая фигня - http://i29.fastpic.ru/thumb/2012/0325/0a/f55c41a2e6c6a7a92edb380f9786b40a.jpeg (http://fastpic.ru/view/29/2012/0325/f55c41a2e6c6a7a92edb380f9786b40a.png.html)
Johny777
25-03-2012, 01:59
rasim933,
ну теперь понятно
завтра попробую сделать
rasim933
25-03-2012, 02:00
УРРААААААРАРА!!!! Спасибо)))))) Наконец-то я смог нормально обьяснит ь)))) Буду ждать)))
Johny777
25-03-2012, 04:23
rasim933,
вот
http://rghost.ru/37205735
____________________________функционал:
я не знаю где и как ты раскидаешь игры, но это не важно.
на авторане 10 кнопок + кнопка "выход"
каждая их 10 запускает свой инсталлер из внешней папки
если какого-то инталлера нет, то кнопка отвечающая за его запуск не активна
____________________________внешне:
1. добавил скин
2. добавил фон
3. анимированный курсор на кнопках
PS: всё что тебе надо настроить это строки для каждой игры.
например:
#define Button_1 "Spider-Man (PC)"
#define Path_1 "{src}\1 Spider-Man - 1[PC]\setup.exe",
где "Spider-Man (PC)" - название кнопки и "{src}\1 Spider-Man - 1[PC]\setup.exe" - это путь к инсталлеру той самой игры относительно расположения авторана
Johny777, я тоже изначально понял так, что коллега rasim933 пересобрал каждую игру под InnoSetup и задача стоит в том, чтобы: а) сделать из кучи отдельных инсталляций InnoSetup одну единую (например, указав каждую игру отдельной задачей в инсталляции) и б) создать и прилепить к диску Autorun, который будет рисовать красивые картинки и запускать инсталляцию с заданными параметрами в зависимости от выбранных игр. Как оказалось, я ошибался в исходных данных.
rasim933
25-03-2012, 05:20
Ок. ЩЯс проверю.
Johny777, Гениально!!
Боже! Теперь прога требует ISSP. Ааааа. Теперь искать надо.
Gnom_aka_Lexander
25-03-2012, 09:28
Если можено, то пришли пожалста сюда коды кнопок. »
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);// Встроенная процедура
begin
Confirm := False; // убираем окно потверждения нажатия на кнопку отмены
Cancel := True; // Разрешаем выход
end;
procedure NewButtonClick(Sender: TObject); // Обработчик кнопок.
begin
case TNewButton(Sender).Tag of // Узнаем, какая кнопка нажата, по ее тегу
0: MsgBox('Вы нажали кнопку 1',mbInformation,MB_OK);
1: MsgBox('Вы нажали кнопку 2',mbInformation,MB_OK);
2: MsgBox('Вы нажали кнопку 3',mbInformation,MB_OK);
3: MsgBox('Вы нажали кнопку 4',mbInformation,MB_OK);
4: MsgBox('Вы нажали кнопку 5',mbInformation,MB_OK);
5: MsgBox('Вы нажали кнопку 6',mbInformation,MB_OK);
6: MsgBox('Вы нажали кнопку 7',mbInformation,MB_OK);
7: WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
end;
end;
procedure InitializeWizard();
Var
i:Integer; // локальная переменная, с ее помощью запустим цикл
begin
with WizardForm do // Делаем сразу общее обращение (минимальноя оптимизация, но торморза из мелочей собираются)
begin
AutoScroll := False;
ClientHeight := ScaleY(260); // размер в высоту
ClientWidth := ScaleX(190); // размер в ширину
OuterNotebook.Hide; //Скрываем основной слой, на котором лежат почти все элементы
Bevel.Hide; // Скрываем полоску внизу инсталла, чтоб не маячила
NextButton.Hide; // Скрываем кнопку далее, чтоб нельзя было добраться до нее табом
for i:=0 to 7 do // Запускаем цикл от 0 до 7, то-есть то, что внутри цикла, будет сделано 8 раз
begin
with TNewButton.Create(WizardForm) do // Собственно создаем кнопку
begin
Parent := WizardForm; // указываем где ей лежать, в данном случае - окно инсталлятора Inno
SetBounds(ScaleX(10),ScaleY(10+i*30),ScaleX(170),ScaleY(25)); // Задаем координаты и размеры 10+i*30 - тут простая математика 10 от верха будет первая кнопка, остальные лягут с интервалом в 30, в зависимости от того, чему равна локольная переменная I в данный момент
case i of // тут задаем текст кнопки, в зависимости от того, какая из них создается в данный момент
0: Caption := 'Кнопка 1';
1: Caption := 'Кнопка 2';
2: Caption := 'Кнопка 3';
3: Caption := 'Кнопка 4';
4: Caption := 'Кнопка 5';
5: Caption := 'Кнопка 6';
6: Caption := 'Кнопка 7';
7: Caption := 'Выход';
end;
OnClick := @NewButtonClick; // Адрес обработчика нажатия на кнопку.
Tag := i; // очень важно не забыть указать тег, поскольку создаем объект неименованый. Тег будет i.
end;
end;
end;
end; Вот, вроде достаточно подробно описал.
Johny777
25-03-2012, 11:36
Лександер,
спасибо!
возьму твой пример
мне как раз на одной из страниц много кнопок надо, а код у тебя короткий
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Теперь у меня вопрос
допустим у меня свой кастомный(!) чекбокс для установки директикса и появляется он если снаружи есть директ икс
под ним идёт такой же, но только для визуала
ниже идут чекбоксы с самоизвлекающимися рахивами, собержащими в себе обнновления и появление их опять же зависит от двух факторов: 1 отмечен нужный компонент, 2 есть ли снаружи архив.
все эти чекбоксы очень нестабильны в своём появлении и в конечном итоге если какого то нет, то на форме они будут создаваться через однин или через 2
вопрос
как сделать добавление (какие добавятся в зависимости от...) ровно в столбик с расстоянием скажем в 10 пикселем между друг другом по вертикали
вот как я сделал пока что только с одним чекбоксом
/// создание формы звдач /// часть 2 из 2 /// начало
begin
TForm := CreateCustomForm();
TForm.BorderIcons := [];
// TForm.ClientWidth := ScaleX(256);
// TForm.ClientHeight := ScaleY(256);
TForm.Caption := 'Tasks';
TForm.SetBounds(WizardForm.Left-TForm.Width-8 , WizardForm.Top, ScaleX(256), ScaleY(410));
TForm.Color := clWindow;
OKButton := TNewButton.Create(TForm);
OKButton.Parent := TForm;
OKButton.Width := ScaleX(75);
OKButton.Height := ScaleY(23);
OKButton.Left := TForm.ClientWidth - ScaleX(75 + 6 + 75 + 10);
OKButton.Top := TForm.ClientHeight - ScaleY(23 + 10);
OKButton.Caption := 'OK';
OKButton.OnClick := @FormClose;
TForm.ActiveControl := OKButton;
/// задачи на форме /// начало
If FileExists(ExpandConstant('{src}\outer\DirectX\DXSETUP.exe')) then
begin
DirectX_Checkbox := TCheckBox.Create(TForm);
with DirectX_Checkbox do
begin
Parent := TForm;
Caption := 'установить DirectX';
Left := ScaleX(8);
Top := ScaleY(8);
Width := ScaleX(300);
Height := ScaleY(15);
Checked := False;
end;
end;
/// конец
TForm.Repaint;
end;
/// конец
для этой формы есть кнопка
/// создание формы звдач /// часть 1 из 2 /// начало
var
TForm: TSetupForm;
OKButton, CancelButton: TNewButton;
DirectX_Checkbox : TCheckBox;
function Run_DirectX: Boolean;
begin
Result:=DirectX_Checkbox.Checked;
end;
procedure FormButtonClick(Sender: TObject);
begin
TForm.Show;
end;
procedure FormClose(Sender: TObject);
begin
TForm.Hide;
end;
/// конец
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.