PDA

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


Страниц : 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

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';

dapa
14-04-2016, 02:29
Здравствуйте,подскажите пожалуйста, возможно ли изменить размер окна StartupPrompt, а также появляющегося перед
удалением, в котором написано "Вы действительно хотите удалить xxxxxxx и все компоненты программы?"

sergey3695
14-04-2016, 08:14
doctor_allcome, а когда вставляли [_code] стерли?
Цитата dapa:
окна StartupPrompt »
а что это за окно?

doctor_allcome
14-04-2016, 09:40
sergey3695, Спасибо большое. Вот я "Валера"! Все работает отлично.

dapa
14-04-2016, 15:05
а что это за окно? »
Не корректно я наверное спросил... это то, что появляется перед запуском инсталла, когда в [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
16-04-2016, 00:34
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, при компиляции, жалуется на символы { }. Можно это исправить ?

Nordek
22-04-2016, 11:07
при компиляции, жалуется на символы { }. Можно это исправить ? »Вторую фигурную скобку добавьте, пример:
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")]"

Можно исправить это ?

Phorcis
22-04-2016, 15:43
Имеется примерный код. Вывод описания компонента в лейбл. При выставлении компоненту флага 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