Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 3]
пишет 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; в комментирование, т.е. переведите его на следующую строку.
В этой строке вы загнали end; в комментирование, т.е. переведите его на следующую строку »
когда жму 'вставить тег [_CODE]' и вставляю текст, он весь скрипт пишет на одной строке, поэтому и так получилось
Спасибо тебе
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;
после окончания процесса 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 ? »
Подробней объясните, что именно вы хотите сделать?
Выдаёт ошибку setup.exe, это ваш инсталлятор или тот, который вы запускаете? »
мой инсталятор Инно. Без запуска setup.exe все нормально
Подробней объясните, что именно вы хотите сделать? »
чтобы во время выполнения setup.exe мастер установки был скрыт
чтобы во время выполнения setup.exe мастер установки был скрыт »
А так:
WizardForm.Hide;
Exec(ExpandConstant('{tmp}\setup.exe'), '', '', SW_HIDE, ewWaitUntilTerminated, n);
WizardForm.Show;
Без запуска setup.exe все нормально »
Тогда эта ошибка инсталлятора, который вы запускаете, может ему не нравиться, что вы запускаете его скрыто, попробуйте запустить его с параметром SW_SHOWNORMAL.
Хотя я больше чем уверен, что без этого инсталлятора вы не пробовали запускать и эта ошибка у вас в скрипте.
Запустите инсталляцию прямо из редактора и в момент ошибки, в самом скрипте у вас будет выделена строка, на которой произошла ошибка.
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;
Доброго вечера
Задачка
По завершении установки необходимо появление диалогового окна, с выбором ник нейма
Ник в последствии должен быть прописан в определенной части файла *.ini
Помогите если не трудно.
пробовал, ошибок нету »
Чудес не бывает
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;
Описание всех функций, можете найти в Справке.
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, ошибок нет
можно я потом выложу весь скрипт, если будет время посмотришь ?
vahe-91, вы сами приводите скриншот, какая там ошибка и на какой строке?
я запускал установщик с редактора без запуска setup.exe, нету ошибок. »
Я прекрасно вас понимаю, но чудес не бывает...
Попробуйте сейчас, просто закоментировать только эту строку больше ничего не меняя и запустить через редактор.
Gnom_aka_Lexander
09-01-2011, 21:15
e2e44, Во вложении мой пример по твоему вопросу, если непонятно чтото - подскажу (сам полгода решал подобный вопрос :) ). Только ник вводится на второй странице, а на последней вводится куча данных о пользователе, если ник был введен, но это не принципиально, создаются *.ini все равно после установки.
как сделать свой заголовок во всплывающем MsgBox ?
типа как "информация"http://s002.youpic.su/pictures/1294423200/21be96b211c6de8b7fa4733b1913444e.png
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, Спасибо, появилась сразу мысль, как мой пример оптимизировать :)
свой заголовок во всплывающем 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)
находил похожие примеры, но они почему то не работали
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.