Войти

Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 3]


Страниц : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [22] 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188

Serega
08-01-2011, 16:40
пишет invalid number of parameters »
Правильно, вы посмотрите в Справке описание этой функции, ну или хотя бы сделали по аналогии, у вас же выше написана эта же функция...
Должно быть так:

Exec(ExpandConstant('{tmp}\setup.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, n);

И совет, привыкайте сразу к форматированию кода, вам самому читать будет легче.
if not {#isFalse(SetupSetting("Uninstallable"))} then Status.count:= -1; // не считать файл unins000.exe end; »
В этой строке вы загнали end; в комментирование, т.е. переведите его на следующую строку.

vahe-91
08-01-2011, 17:08
В этой строке вы загнали end; в комментирование, т.е. переведите его на следующую строку »
когда жму 'вставить тег [_CODE]' и вставляю текст, он весь скрипт пишет на одной строке, поэтому и так получилось

Спасибо тебе

vahe-91
08-01-2011, 19:36
Serega,

решил сделать так, но после окончания процесса setup.exe выдает ошибку runtime error (at 127:28) acces violation at address0044694c. read of address 00000000

И еще в коде можно поставить setup.exe флаг hidewizard ?


procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then begin
StartInstall:= GetTickCount {время начала извлечения файлов}
WndHookID:= SetWindowsHookEx(WH_CALLWNDPROC, WrapCWPSTRUCTProc(@OnWndHook, 3), 0, GetCurrentThreadID); {установка SendMessage хука}
TimerID:= SetTimer(0, 0, 500 {полсекунды}, WrapTimerProc(@MyTimerProc, 4)); {установка таймера}
if not {#isFalse(SetupSetting("Uninstallable"))} then Status.count:= -1; // не считать файл unins000.exe
end;
if CurStep = ssPostInstall then
begin
StartInstall:= GetTickCount {время начала распаковки}
UnPackError:= UnPack('{#Archives}')
if UnPackError <> 0 then begin // Error occured, uninstall it then
if not {#isFalse(SetupSetting("Uninstallable"))} then // деинсталляция разрешёна
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n); // откат установки из-за ошибки unarc.dll
WizardForm.caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
SetTaskBarTitle(SetupMessage(msgErrorTitle))
end else begin
SetTaskBarTitle(SetupMessage(msgSetupAppTitle));
Exec(ExpandConstant('{tmp}\setup.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, n) end;
end;
end;

Serega
09-01-2011, 01:00
после окончания процесса setup.exe выдает ошибку runtime error (at 127:28) acces violation »
Выдаёт ошибку setup.exe, это ваш инсталлятор или тот, который вы запускаете?
Без запуска стороннего setup.exe ошибка есть?
Ошибка acces violation говорит о том, что идёт обращение к объекту, которого нет, т.е. он ещё не создан или уже разрушен. Чтоб было понятней:


procedure InitializeWizard();
var
lbl: TLabel;
begin
// создаём контрол
lbl := TLabel.Create(WizardForm);
with lbl do
begin
Parent := WizardForm;
AutoSize := True;
Left := ScaleX(20);
Top := ScaleY(330);
end;
lbl.Free; // разрушаем контрол
// при попытке обращения к контролу после разрушения,
lbl.Caption := 'Пример...'; // получаем acces violation в этой строке
end;


можно поставить setup.exe флаг hidewizard ? »
Подробней объясните, что именно вы хотите сделать?

vahe-91
09-01-2011, 12:07
Выдаёт ошибку setup.exe, это ваш инсталлятор или тот, который вы запускаете? »
мой инсталятор Инно. Без запуска setup.exe все нормально

Подробней объясните, что именно вы хотите сделать? »

чтобы во время выполнения setup.exe мастер установки был скрыт

nik1967
09-01-2011, 13:39
чтобы во время выполнения setup.exe мастер установки был скрыт »
А так:
WizardForm.Hide;
Exec(ExpandConstant('{tmp}\setup.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, n);
WizardForm.Show;

Serega
09-01-2011, 14:47
Без запуска setup.exe все нормально »
Тогда эта ошибка инсталлятора, который вы запускаете, может ему не нравиться, что вы запускаете его скрыто, попробуйте запустить его с параметром SW_SHOWNORMAL.
Хотя я больше чем уверен, что без этого инсталлятора вы не пробовали запускать и эта ошибка у вас в скрипте.
Запустите инсталляцию прямо из редактора и в момент ошибки, в самом скрипте у вас будет выделена строка, на которой произошла ошибка.

vahe-91
09-01-2011, 17:54
nik1967,
во время выполнения setup.exe мастер скрывается, но по окончания получаю прежную ошибку и мастер не восстанавливается

Тогда эта ошибка инсталлятора, который вы запускаете, может ему не нравиться, что вы запускаете его скрыто, попробуйте запустить его с параметром SW_SHOWNORMAL »
не помогает

Хотя я больше чем уверен, что без этого инсталлятора вы не пробовали запускать и эта ошибка у вас в скрипте »
пробовал, ошибок нету

Запустите инсталляцию прямо из редактора и в момент ошибки, в самом скрипте у вас будет выделена строка, на которой произошла ошибка »

вот что получается

http://i13.fastpic.ru/thumb/2011/0109/a7/f330c2dea322c3af1cbf6d1b03272ca7.jpeg (http://fastpic.ru/view/13/2011/0109/f330c2dea322c3af1cbf6d1b03272ca7.jpg.html)

line 344 out of range


if (Status.stage = cm('ArcTitle')) and (GetArrayLength(Arcs) > 0) then begin
ExtractFile.Caption:= FmtMessage(cm('ArcInfo'), [IntToStr(ArcInd+1), IntToStr(GetArrayLength(Arcs)), // это строка 344
ByteOrTB(Arcs[ArcInd].Size, true), Format('%.0n', [Status.mb/(Arcs[ArcInd].Size/oneMB)*100]), ByteOrTB(Status.allsize, true)])
ProgressBar.Position:= round(ProgressBar.Max * Status.mb/trunc(Arcs[ArcInd].Size/oneMB))
end;

e2e44
09-01-2011, 18:33
Доброго вечера
Задачка
По завершении установки необходимо появление диалогового окна, с выбором ник нейма
Ник в последствии должен быть прописан в определенной части файла *.ini
Помогите если не трудно.

Serega
09-01-2011, 19:39
пробовал, ошибок нету »
Чудес не бывает
line 344 out of range »
Ошибка out of range, означает выход за пределы, эта ошибка связана с выходом за пределы массива или множества.
Следовательно внимательно посмотрите, что вы ещё меняете при добавлении запуска другого инсталлятора.
Так же попробуйте, закоментируйте запуск стороннего инсталлятора в скрипте и запустите также через редактор.

необходимо появление диалогового окна, с выбором ник нейма »


[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes

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

[UninstallDelete]
; при деинсталляции не забываем удалить config.ini
Type: files; Name: {app}\config.ini

[Code]
var
Form: TSetupForm;

procedure ButtonClick(Sender: TObject);
begin
Form.Close;
end;

function GetNikName: string;
var
edt: TEdit;
begin
try
Form := CreateCustomForm;
with Form do
begin
ClientWidth := ScaleX(200);
ClientHeight := ScaleY(100);
Center;
Caption := 'Ввод данных...';
end;
with TLabel.Create(Form) do
begin
Parent := Form;
AutoSize := True;
Left := ScaleX(12);
Top := ScaleY(12);
Font.Size := 9;
Caption := 'Введите свой Логин:';
end;
edt := TEdit.Create(Form);
with edt do
begin
Parent := Form;
SetBounds(ScaleX(10), ScaleY(35), Form.ClientWidth - ScaleX(20), ScaleY(17));
end;
with TButton.Create(Form) do
begin
Parent := Form;
SetBounds((Form.Width - Width) div 2, ScaleY(65), ScaleX(75), ScaleY(23));
Caption := 'OK';
OnClick := @ButtonClick;
end;
Form.ShowModal;
finally
Result := edt.Text;
Form.Free;
Form := nil;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssDone then
SetIniString('Section', 'Key', GetNikName, ExpandConstant('{app}\config.ini'))
end;


Описание всех функций, можете найти в Справке.

vahe-91
09-01-2011, 19:52
Serega,
я запускал установщик с редактора без запуска setup.exe, нету ошибок. В скрипт добавляю только эту строку

Exec(ExpandConstant('{tmp}\setup.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, n)
(получается как в посту 423 (http://forum.oszone.net/post-1583941-423.html) )

если запустить setup.exe во время CurStep=ssDone, ошибок нет

можно я потом выложу весь скрипт, если будет время посмотришь ?

Serega
09-01-2011, 20:02
vahe-91, вы сами приводите скриншот, какая там ошибка и на какой строке?
я запускал установщик с редактора без запуска setup.exe, нету ошибок. »
Я прекрасно вас понимаю, но чудес не бывает...
Попробуйте сейчас, просто закоментировать только эту строку больше ничего не меняя и запустить через редактор.

Gnom_aka_Lexander
09-01-2011, 21:15
e2e44, Во вложении мой пример по твоему вопросу, если непонятно чтото - подскажу (сам полгода решал подобный вопрос :) ). Только ник вводится на второй странице, а на последней вводится куча данных о пользователе, если ник был введен, но это не принципиально, создаются *.ini все равно после установки.

Imitri7
09-01-2011, 22:18
как сделать свой заголовок во всплывающем MsgBox ?
типа как "информация"http://s002.youpic.su/pictures/1294423200/21be96b211c6de8b7fa4733b1913444e.png

e2e44
09-01-2011, 22:18
Serega, Лександер
спасибо большое за оказанную помощь

если не трудно подскажите алгоритм проверки установлено приложение или нет если установлено авто запуск эксешника

Sotonisto )))) L4d собираю первый

Sotonisto
09-01-2011, 22:20
Все решили помочь e2e44'у :)
Пример создания диалогового окна и создания *.ini файла (еще с Скрипты Inno Setup. Помощь и советы [часть 2])
http://img41.imageshack.us/img41/9715/pkst.th.jpg (http://img41.imageshack.us/i/pkst.jpg/)
[_Code]
var
Page: TInputQueryWizardPage;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then
SaveStringToFile(ExpandConstant('{app}\rev.ini'),

'[Emulator]' + #13#10
'CacheEnabled=False' + #13#10
'Language=Russian' + #13#10
'Logging=False' + #13#10
'SteamDll=bin\steam\Steam.dll' + #13#10
'SteamClient=True' + #13#10
'SteamUser=RG PKS USER' + #13#10
'' + #13#10
'[steamclient]' + #13#10
'PlayerName=' + '"' + Page.Values[0] + '"' + #13#10
'Logging=False' + #13#10
'ClientDll=bin\steam\steamclient.dll' + #13#10, False);
end;

Procedure InitializeWizard();
begin
Page := CreateInputQueryPage(wpWelcome, 'Настройка компонентов', 'Введите ник, под которым Вы будете играть в Left 4 Dead 2 (только англ. буквы, пробелы разрешены)', 'Введите желаемый ник');
Page.Add('', False);
end;
Если кому-то необходимо - вот сам скрипт (http://upload.com.ua/get/902254580/l4d2_upd_iss.rar).

Gnom_aka_Lexander
09-01-2011, 22:27
Sotonisto, Спасибо, появилась сразу мысль, как мой пример оптимизировать :)

Serega
10-01-2011, 09:45
свой заголовок во всплывающем MsgBox ? »
Есть несколько вариантов, самый простой, это использовать системный MessageBox:


[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes

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

[Code]
function MessageBox(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: LongWord): Integer; external 'MessageBoxA@user32.dll stdcall';

procedure ButtonClick(Sender: TObject);
begin
MessageBox(WizardForm.Handle, 'Текст сообщения', 'Заголовок', MB_ICONINFORMATION);
end;

procedure InitializeWizard();
begin
with TButton.Create(WizardForm) do
begin
Parent := WizardForm;
SetBounds(ScaleX(30), WizardForm.NextButton.Top, WizardForm.NextButton.Width, WizardForm.NextButton.Height);
Caption := 'Сообщение';
OnClick := @ButtonClick;
end;
end;


Более сложный, это создавать отдельную форму и уже на ней создавать все контролы, пример создания формы можете взглянуть в этом сообщении (http://www.forum.oszone.ru/post-1584641.html#post1584641)

Imitri7
10-01-2011, 10:21
находил похожие примеры, но они почему то не работали
Serega, спс

2all и еще подскажите плыз как решит проблему http://s002.youpic.su/pictures/1294509600/27585cf9d8aebcaa341cf43aab864bbc.png http://s002.youpic.su/pictures/1294509600/617107db054a22bb7b9dbc0b5cde4790.png
если не заметно в чем разница, то тут косяк с кнопками с английским языком - они друг на друга налазят


const
ButtonWidth = 80; //Указываем размер кнопок
ButtonHeight = 23;

bidBack = 0;
bidNext = 1;
bidCancel = 2;
bidDirBrowse = 3;
bidGroupBrowse = 4;

var
ButtonPanel: array [0..4] of TPanel;
ButtonImage: array [0..4] of TBitmapImage;
ButtonLabel: array [0..4] of TLabel;

procedure ButtonLabelClick(Sender: TObject);
var
Button: TButton;
begin
ButtonImage[TLabel(Sender).Tag].Left:=0
case TLabel(Sender).Tag of
bidBack: Button:=WizardForm.BackButton
bidNext: Button:=WizardForm.NextButton
bidCancel: Button:=WizardForm.CancelButton
bidDirBrowse: Button:=WizardForm.DirBrowseButton
bidGroupBrowse: Button:=WizardForm.GroupBrowseButton
else
Exit
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
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure LoadButtonImage(AButton: TButton; AButtonIndex: integer);
var
Image: TBitmapImage;
Panel: TPanel;
Labl: TLabel;

begin
Panel:=TPanel.Create(WizardForm)
Panel.Left:=AButton.Left
Panel.Top:=AButton.Top
Panel.Width:=AButton.Width
Panel.Height:=AButton.Height
Panel.Tag:=AButtonIndex
Panel.Parent:=AButton.Parent
ButtonPanel[AButtonIndex]:=Panel

Image:=TBitmapImage.Create(WizardForm) //Рисунок который ложится на кнопку
Image.Width:=160 //Обязательно прописать оригинальный размер рисунка
Image.Height:=23
Image.Enabled:=False
Image.Bitmap.LoadFromFile(ExpandConstant('{tmp}\button.bmp'))
Image.Parent:=Panel
ButtonImage[AButtonIndex]:=Image

with TLabel.Create(WizardForm) do begin
Tag:=AButtonIndex
Parent:=Panel
Width:=Panel.Width
Height:=Panel.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end

Labl:=TLabel.Create(WizardForm) //Текст кнопок
Labl.Left:=23 //Указываем положение текста
Labl.Top:=5
Labl.Autosize:=True
Labl.Alignment:=taCenter
Labl.Tag:=AButtonIndex
Labl.Transparent:=True
Labl.Font.Color:=clFont //Цвет текста
Labl.Caption:=AButton.Caption
Labl.OnClick:=@ButtonLabelClick
Labl.OnDblClick:=@ButtonLabelClick
Labl.OnMouseDown:=@ButtonLabelMouseDown
Labl.OnMouseUp:=@ButtonLabelMouseUp
Labl.Parent:=Panel
ButtonLabel[AButtonIndex]:=Labl
end;

procedure UpdateButton(AButton: TButton;AButtonIndex: integer);
begin
ButtonLabel[AButtonIndex].Caption:=AButton.Caption
ButtonPanel[AButtonIndex].Visible:=AButton.Visible
ButtonLabel[AButtonIndex].Enabled:=Abutton.Enabled
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
ButtonLabel[bidNext].Enabled:=True
ButtonPanel[bidNext].Enabled := True
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
ButtonLabel[bidNext].Enabled:=False
ButtonPanel[bidNext].Enabled := False
end;

procedure CurPageChanged0(CurPageID: Integer);
begin
UpdateButton(WizardForm.BackButton,bidBack)
UpdateButton(WizardForm.NextButton,bidNext)
UpdateButton(WizardForm.CancelButton,bidCancel)
ButtonLabel[bidBack].Left := (ButtonPanel[bidBack].Width / 2 - ButtonLabel[bidBack].Width / 2);
ButtonLabel[bidNext].Left := (ButtonPanel[bidNext].Width / 2 - ButtonLabel[bidNext].Width / 2);
ButtonLabel[bidCancel].Left := (ButtonPanel[bidCancel].Width / 2 - ButtonLabel[bidCancel].Width / 2);
ButtonLabel[bidDirBrowse].Left := (ButtonPanel[bidDirBrowse].Width / 2 - ButtonLabel[bidDirBrowse].Width / 2);
ButtonLabel[bidGroupBrowse].Left := (ButtonPanel[bidGroupBrowse].Width / 2 - ButtonLabel[bidGroupBrowse].Width / 2);
end;

procedure InitializeWizard0();
begin
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:=337
WizardForm.DirBrowseButton.Width:=ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight

WizardForm.GroupBrowseButton.Left:=337
WizardForm.GroupBrowseButton.Width:=ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick

WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button.bmp')
LoadButtonImage(WizardForm.BackButton,bidBack)
LoadButtonImage(WizardForm.NextButton,bidNext)
LoadButtonImage(WizardForm.CancelButton,bidCancel)
LoadButtonImage(WizardForm.DirBrowseButton,bidDirBrowse)
LoadButtonImage(WizardForm.GroupBrowseButton,bidGroupBrowse)
end;


+ как наложит текстуру с помошью этого скрипта на

var
SystemButton: TNewButton;

procedure InitializeWizard();
begin
SystemButton := TNewButton.Create(WizardForm);
with SystemButton do begin
Parent := WizardForm;
Caption := '?';
Left:= 190
Top:=WizardForm.BackButton.Top
Width:=WizardForm.DirBrowseButton.Height
Height:=WizardForm.DirBrowseButton.Height
OnClick:=@SystemButtonOnClick
ShowHint := True;
Hint:= 'Показать/Cкрыть "Системные требования"'
end;
end;

Gnom_aka_Lexander
10-01-2011, 14:06
Imitri7, нужно скрипт смотреть, там чтото связаное с авторазмером кнопок или текста.
Попробуй добавить туда, где накладываеш текстуры, строчку
AutoSize := True;
и поиграться со значениями True и False




© OSzone.net 2001-2012