Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]
sergey3695
13-04-2016, 21:27
doctor_allcome,
procedure CancelButtonClickFinishedPage(Sender: TObject);
begin
// display the "Exit Setup ?" message box and if the user selects "Yes",
// then exit the process; it is currently the only way how to exit setup
// process manually
if ExitSetupMsgBox then
begin
DelTree(ExpandConstant('{tmp}'),true,true,true);
ExitProcess(0);
end;
end;
но правильнее так
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.
[_code]
function NextButtonClick(CurPage: Integer): Boolean;
begin
Result := False;
// display the "Exit Setup ?" message box and if the user selects "Yes",
// then exit the process; it is currently the only way how to exit setup
// process manually
if CurPage = wpFinished then
begin
if ExitSetupMsgBox then
Result := True
end else
Result := True;
end;
procedure CancelButtonClickFinishedPage(Sender: TObject);
begin
// if the fake Finish button was clicked...
MsgBox('И вот тут Можно запустить программу!', mbInformation, MB_OK);
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpFinished then
begin
WizardForm.CancelButton.Caption := 'Run';
WizardForm.CancelButton.Visible := True;
// bind your own OnClick event for the Cancel button; the original one
// is already disconnected at this stage
WizardForm.CancelButton.OnClick := @CancelButtonClickFinishedPage;
end;
end;
doctor_allcome
14-04-2016, 01:34
sergey3695, спасибо за ответ!
DelTree(ExpandConstant('{tmp}'),true,true,true); пробовал вставлять, почему-то удаляется только часть файлов из папки TEMP, а вот библиотеки (dll) и сама папка is-xxxx остаются.
Из второго примера, я так понял, вы предложили кнопки поменять местами. NextButtonClick отрабатывает корректный выход, а в CancelButtonClickFinishedPage уже можно запускать программу (через ShellExec). После компиляции в FinishPage только одна кнопка Finish, а кнопка 'RUN' не отображается, хотя должно быть WizardForm.CancelButton.Caption := 'Run';
Здравствуйте,подскажите пожалуйста, возможно ли изменить размер окна StartupPrompt, а также появляющегося перед
удалением, в котором написано "Вы действительно хотите удалить xxxxxxx и все компоненты программы?"
sergey3695
14-04-2016, 08:14
doctor_allcome, а когда вставляли [_code] стерли?
Цитата dapa:
окна StartupPrompt »
а что это за окно?
doctor_allcome
14-04-2016, 09:40
sergey3695, Спасибо большое. Вот я "Валера"! Все работает отлично.
а что это за окно? »
Не корректно я наверное спросил... это то, что появляется перед запуском инсталла, когда в [Setup] DisableStartupPrompt=no
sergey3695
14-04-2016, 16:02
dapa, нет нельзя. это стандартные сообщения.
doctor_allcome
15-04-2016, 23:25
Уважаемый sergey3695, позвольте еще один вопрос? Если в процедуре CancelButtonClickFinishedPage вместо MsgBox вставить ShellExec то программа в ShellExec выполнится, но окно инстяллятора остается открытым. Как закрыть окно инсталлятора, после запуска файла?
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.
[_code]
function NextButtonClick(CurPage: Integer): Boolean;
begin
Result := False;
// display the "Exit Setup ?" message box and if the user selects "Yes",
// then exit the process; it is currently the only way how to exit setup
// process manually
if CurPage = wpFinished then
begin
if ExitSetupMsgBox then
Result := True
end else
Result := True;
end;
procedure CancelButtonClickFinishedPage(Sender: TObject);
begin
// if the fake Finish button was clicked...
MsgBox('И вот тут Можно запустить программу!', mbInformation, MB_OK);
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpFinished then
begin
WizardForm.CancelButton.Caption := 'Run';
WizardForm.CancelButton.Visible := True;
// bind your own OnClick event for the Cancel button; the original one
// is already disconnected at this stage
WizardForm.CancelButton.OnClick := @CancelButtonClickFinishedPage;
end;
end;
dapa, нет нельзя. это стандартные сообщения. »
Понятно, благодарю за ответ.
sergey3695
16-04-2016, 12:06
doctor_allcome,
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
OutputDir=.
[code]
/////===== Начало - ExecAndWait =====\\\\\
var
lastproc: cardinal;
const
NORMAL_PRIORITY_CLASS = $00000020;
REALTIME_PRIORITY_CLASS = $00000100;
type
_TStartupInfo = record
cb: DWORD;
lpReserved, lpDesktop: Longint;
lpTitle: PAnsiChar;
dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags: DWORD;
wShowWindow, cbReserved2: Word;
lpReserved2: Byte;
hStdInput, hStdOutput, hStdError: Longint;
end;
_TProcessInformation = record
hProcess, hThread: Longint;
dwProcessId, dwThreadId: DWORD;
end;
_TMsg = record
hWnd: HWND;
msg, wParam: Word;
lParam: LongWord;
Time: TFileTime;
pt: TPoint;
end;
function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
procedure GetStartupInfo(var lpStartupInfo: _TStartupInfo); external 'GetStartupInfoA@kernel32.dll stdcall';
function CreateProcess(lpApplicationName: PAnsiChar; lpCommandLine: PAnsiChar; lpProcessAttributes, lpThreadAttributes: DWORD; bInheritHandles: BOOL; dwCreationFlags: DWORD; lpEnvironment: PAnsiChar; lpCurrentDirectory: PAnsiChar; const lpStartupInfo: _TStartupInfo; var lpProcessInformation: _TProcessInformation): BOOL; external 'CreateProcessA@kernel32.dll stdcall';
function WaitForSingleObject(hHandle: Longint; dwMilliseconds: DWORD): DWORD; external 'WaitForSingleObject@kernel32.dll stdcall';
function TerminateProcess(hProcess: Longint; uExitCode: UINT): BOOL; external 'TerminateProcess@kernel32.dll stdcall';
function PeekMessage(var lpMsg: _TMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: _TMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: _TMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';
procedure Application_ProcessMessages;
var
Msg: _TMsg;
begin
while PeekMessage(Msg, 0, 0, 0, 1) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;
function ExecAndWait(filename, params: pansichar; showcmd: integer; Wait: boolean; Priority: Smallint): Boolean;
var
SI : _TStartupInfo;
PI : _TProcessInformation;
CMD: string;
prt: DWORD;
begin
Result:=false;
CMD:='"' + filename + '" ' + params;
GetStartupInfo(SI);
SI.wShowWindow := showcmd;
SI.dwFlags := 1;
if Priority = 0 then prt:= NORMAL_PRIORITY_CLASS else
prt:= REALTIME_PRIORITY_CLASS;
Result:=CreateProcess('', PansiChar(CMD), 0, 0, false, prt,'', pansichar(ExtractFilePath(filename)), SI, PI);
lastproc:=PI.dwProcessId;
if wait then
while WaitforSingleObject(PI.hProcess, 50) = $00000102 do
Application_ProcessMessages;
CloseHandle(PI.hProcess);
end;
/////===== Конец - ExecAndWait =====\\\\\
var
OldEvent_NextButtonClick: TNotifyEvent;
procedure NextButtonClick2(Sender: TObject);
begin
ExecAndWait(ExpandConstant('{sys}\calc.exe'), '', SW_SHOW, false, 0);
OldEvent_NextButtonClick(Sender);
end;
procedure CancelButtonClickFinishedPage(Sender: TObject);
begin
if ExitSetupMsgBox then
OldEvent_NextButtonClick(Sender);
end;
procedure InitializeWizard;
begin
OldEvent_NextButtonClick := WizardForm.NextButton.OnClick;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpFinished then
begin
WizardForm.CancelButton.Caption := SetupMessage(msgButtonFinish);
WizardForm.CancelButton.Visible := True;
WizardForm.CancelButton.OnClick := @CancelButtonClickFinishedPage;
//
WizardForm.NextButton.Caption := 'Run';
WizardForm.NextButton.OnClick := @NextButtonClick2;
end;
end;
doctor_allcome
16-04-2016, 21:00
sergey3695, еще раз Спасибо! Все работает. Сам бы я до такого вряд ли дошел.
habib2302
19-04-2016, 11:52
Доброе время суток. Можно ли как-то организовать определение занятых процессом файлов перед установкой и перед деинсталяцией программы и потом завершить процесс?
sergey3695
20-04-2016, 21:36
завершить процесс »
если это будет делаться принудительно, то не думаю что будет хорошо для пользователя. а что за файлы?
Serjione
22-04-2016, 10:49
Добрый день. В резделе RЕGISTRY, при компиляции, жалуется на символы { }. Можно это исправить ?
при компиляции, жалуется на символы { }. Можно это исправить ? »Вторую фигурную скобку добавьте, пример:
Root: HKLM; SubKey: SOFTWARE\test\{{12345}
Serjione
22-04-2016, 12:17
Nordek, после второй скобки }, тоже надо еще одну скобку ставить ?
kotyarko@fb
22-04-2016, 13:11
после второй скобки }, тоже надо еще одну скобку ставить ? » Нет, только после первой (http://www.jrsoftware.org/ishelp/topic_consts.htm).
Serjione
22-04-2016, 15:27
Благодарю за помошь.
Другой момент. Жалуется на ковычки в скобкаx
ValueData: "[open("%1")]"
Можно исправить это ?
Имеется примерный код. Вывод описания компонента в лейбл. При выставлении компоненту флага fixed ему в описании прибавляется текст "Временно недоступно", который нигде не прописан. Как этот текст убрать? Во всем этом я профан, пытался прогуглить - не нашел
[Components]
Name: "name"; Description: "Фывфыв:"; Types: full; Flags: fixed
[Код]
Var
BoxForDescription: TListBox
DescriptionLabel : TLabel
Procedure Descriptions(Sender: TObject; Index: Integer; var DescriptionLabel: TLabel);
var
Description: String;
begin
case TNewCheckListBox(Sender).Tag of
WizardForm.ComponentsList.Tag:
case WizardForm.ComponentsList.ItemCaption[Index] of
'Фывфыв:': Description := 'описание.';
end;
end;
DescriptionLabel.Caption := Description;
end;
Procedure CreateObjects();
begin
BoxForDescription := TListBox.Create(WizardForm);
with BoxForDescription do
begin
Parent := WizardForm;
SetBounds(ScaleX(BoxForImage.Left), ScaleY(BoxForImage.Top + BoxForImage.Height + 2), ScaleX(BoxForImage.Width - 2), ScaleY(93));
DescriptionLabel := TLabel.Create(BoxForDescription);
with DescriptionLabel do
begin
Parent := BoxForDescription;
SetBounds(ScaleX(3), ScaleY(1), ScaleX(BoxForDescription.Width - 7), ScaleY(BoxForDescription.Height - 2));
AutoSize := False;
WordWrap := True;
Caption := 'Наведите на компонент в списке, чтобы увидеть его описание';
Font.Color := clWhite;
Font.Size := 9;
end;
end;
kotyarko@fb
22-04-2016, 16:56
Жалуется на ковычки в скобкаx
Можно исправить это ?» Да, можно. Тут схожий принцип (и в справке он также описан).
Нужно просто продублировать каждую кавычку:
ValueData: "[open(""%1"")]"
Имеется примерный код. Вывод описания компонента в лейбл. При выставлении компоненту флага fixed ему в описании прибавляется текст "Временно недоступно", который нигде не прописан. Как этот текст убрать? » Прописан, просто скрипт с ним лежит чуть глубже (https://bitbucket.org/Kotyarko_O/kmp/src/514cd4896be86c84d7dc13fa1481c53299e414a7/Resourses/CreateImgsDescs.iss?at=master&fileviewer=file-view-default#CreateImgsDescs.iss-13).
ListBox тут был совсем не в тему, поэтому в новых обновлениях вместо DescriptionLabel будет DescriptionMemo. А ListBox будет убран, как и надо было с самого начала делать =) Ну это я так, к слову.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC