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

kotyarko@fb
12-05-2015, 08:44
Подскажите, как сделать проверку на наличие папки. »
Например, так:
Function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpSelectDir:
begin
if not DirExists(ExpandConstant('{app}\Prog')) then
begin
MsgBox('Выбрана не верная папка', mbError, MB_OK);
Result := False;
end;
end;
end;
end;

palsn2000, я точно не уверен, не пробовал. Но на прогрессбар разве лейбл станет?

Kashtan007
12-05-2015, 12:34
Привет всем.
Как сделать, чтобы деинсталятор удалял заранее указанные папки?
Например: У меня есть папка res_mods, в не папка mods и папка 0.9.7.
Мне нужно чтобы деинсталятор удалил папку mods и очистил папку 0.9.7

Nordek
12-05-2015, 14:08
Как сделать, чтобы деинсталятор удалял заранее указанные папки? »
Пример:
[UninstallDelete]
Name: {userappdata}\res_mods; Type: filesandordirs

Kashtan007
12-05-2015, 18:55
Nordek, файл удалять по такому же способу?

Dodakaedr
12-05-2015, 19:29
файл удалять по такому же способу? »

Это не обязательная секция. В ней указываются дополнительные файлы или папки, которые деинсталлятор должен удалить, кроме тех, которые были установлены/созданы с помощью параметров секций [Files] или [Dirs]. Главным образом эта секция используется для удаления .INI файлов, созданных вашим приложением. Деинсталлятор выполняет эти параметры в конце деинсталляции.

Пример секции :

[UninstallDelete]
Type: files; Name: "{win}\MYPROG.INI"

Список поддерживаемых параметров:
[U]Type (Обязательно)
Указывает тип удаляемого объекта. Может быть следующим:

files
Параметр Name указывает имя отдельного файла или маску.

filesandordirs
То же, что files за исключением, что также можно задать имя папки: в этом случае удаляются все ее файлы и подпапки.

dirifempty
При использовании этого типа параметр Name должен задавать папку, но не содержать масок. Папка будет удалена, только если она пустая.

Например:
Type: files

Name (Обязательно)
Имя удаляемого файла или папки.

Внимание! Не торопитесь использовать здесь маски для удаления всех файлов папки {app}. Строго рекомендуется не делать этого по двум причинам. Во-первых, пользователи обычно не любят, когда данные, введенные ими в директории приложения, удаляются без предупреждения (они могут удалить их просто потому, что хотят, например, переместить программу в папку на другом диске). Будет лучше оставить файлы, чтобы при желании пользователь потом сам удалил их. Во-вторых, если пользователь по ошибке установит приложение не в ту папку (например, в C:\WINDOWS) и потом удалит его оттуда, это может привести к плачевным последствиям. Так что НЕ ДЕЛАЙТЕ ЭТОГО!

Например:
Name: "{win}\MYPROG.INI"

palsn2000
12-05-2015, 19:46
palsn2000, я точно не уверен, не пробовал. Но на прогрессбар разве лейбл станет? »
Я имел ввиду не лэйбл для прогрессбара, А просто произвольный лэйбл, который можно расположить на прогрессбаре (прогрессбар на нижнем слое - лэйбл выще и просто накладывается).
Но в общем речь не об этом, а о том, что мои познания в программировании близки к нулю, и сам я не понимаю как (и вообще можно ли) проценты установки связать с дэйблом, а не сообщением.

У Вас там используется SetupMessage(msgStatusExtractFiles)

function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
if Msg = PBM_SETPOS then with WizardForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [SetupMessage(msgStatusExtractFiles), FormatFloat('0.#0 %', (ProgressGauge.Position*100)/ProgressGauge.Max)]) );

Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;


А я спрашиваю можно ли как нибудь вот это (ProgressGauge.Position*100)/ProgressGauge.Max) в процентах или даже без процентов связать с произвольным лэйблом или произвольным текстом, который можно бы было наложить на прогрессбар?

Может я не совсем правильно объясняю, чего хочу, вот для примера картинка: http://s014.radikal.ru/i327/1505/18/a95e03a0fd57.jpg (http://www.radikal.ru)

El Sanchez
12-05-2015, 20:45
palsn2000, например, так:

function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';

var
PercentLabel: TLabel;

///////////////////////////
procedure InitializeWizard;
begin
{ PercentLabel }
PercentLabel := TLabel.Create(WizardForm);
with PercentLabel do
begin
Parent := WizardForm.ProgressGauge;
Align := alClient;
Alignment := taCenter;
Layout := tlCenter;
Transparent := True;
end;
end;

/////////////////////////////////////////////////////////////////////////////////////////
function ProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
case Msg of
PBM_SETPOS:
begin
Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
with WizardForm.ProgressGauge do
PercentLabel.Caption := Format('%d %%', [MulDiv(Position, 100, Max)]);
end;
else
Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
end;
end;

Dodakaedr
12-05-2015, 22:41
например, так: »
полный рабочий пример можете привести?

Николай_Николаич@vk
12-05-2015, 23:12
Например, так:
Код:
Function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpSelectDir:
begin
if not DirExists(ExpandConstant('{app}\Prog')) then
begin
MsgBox('Выбрана не верная папка', mbError, MB_OK);
Result := False;
end;
end;
end;
end; »

Немного не то.

Нужно что то типо этого:

if not FileExists(AddBackslash(WizardForm.DirEdit.Text) + 'Prog.exe') then

только проверка не на файл, а папку.

El Sanchez
13-05-2015, 09:05
полный рабочий пример можете привести? »
Dodakaedr, пример:

[Setup]
AppName=test
AppVerName=test
DefaultDirName={tmp}
CreateAppDir=no
Uninstallable=no
CreateUninstallRegKey=no

[Files]
Source: compiler:Languages\*; DestDir: {app}

[Languages]
Name: ru; MessagesFile: compiler:Languages\russian.isl

[Code]
#define A = (Defined UNICODE) ? "W" : "A"
const
WM_USER = $0400;
PBM_SETPOS = (WM_USER + 2);
GWL_WNDPROC = (-4);
GWL_USERDATA = (-21);

function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLong{#A}@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam: Longint; lParam: Longint): Longint; external 'CallWindowProc{#A}@user32.dll stdcall';
function MulDiv(nNumber, nNumerator, nDenominator: Integer): Integer; external 'MulDiv@kernel32.dll stdcall';

var
InstPercentLabel: TLabel;

///////////////////////////////
procedure CreateInstallingPage;
begin
{ InstPercentLabel }
InstPercentLabel := TLabel.Create(WizardForm);
with InstPercentLabel do
begin
Parent := WizardForm.ProgressGauge;
Align := alClient;
Alignment := taCenter;
Layout := tlCenter;
Transparent := True;
end;
end;

///////////////////////////////////////////////////////////////////////////////////////
function ProgressGaugeWndProc(hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
begin
case Msg of
PBM_SETPOS:
begin
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
with WizardForm.ProgressGauge do
InstPercentLabel.Caption := Format('%d %%', [MulDiv(Position, 100, Max)]);
end;
else
Result := CallWindowProc(GetWindowLong(hWnd, GWL_USERDATA), hWnd, Msg, wParam, lParam);
end;
end;

///////////////////////////
procedure SubclassControls;
begin
{ ProgressGauge }
with WizardForm.ProgressGauge do
begin
if GetWindowLong(Handle, GWL_USERDATA) = 0 then
SetWindowLong(Handle, GWL_USERDATA, SetWindowLong(Handle, GWL_WNDPROC, CallbackAddr('ProgressGaugeWndProc')));
end;
end;

///////////////////////////
procedure InitializeWizard;
begin
CreateInstallingPage;
SubclassControls;
end;

/////////////////////////////
procedure UnSubclassControls;
begin
{ ProgressGauge }
with WizardForm.ProgressGauge do
begin
if GetWindowLong(Handle, GWL_USERDATA) > 0 then
SetWindowLong(Handle, GWL_WNDPROC, GetWindowLong(Handle, GWL_USERDATA));
end;
end;

////////////////////////////
procedure DeinitializeSetup;
begin
if ExpandConstant('{wizardhwnd}') = '0' then
Exit;
UnSubclassControls;
end;


Нужно что то типо этого:
Код:
if not FileExists(AddBackslash(WizardForm.DirEdit.Text) + 'Prog.exe') then
только проверка не на файл, а папку. »
Николай_Николаич@vk,

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpSelectDir:
if DirExists(ExpandConstant('{app}\MyProg')) then
MsgBox('bla-bla-bla', mbInformation, MB_OK);
end;
end;

Dodakaedr
13-05-2015, 16:30
El Sanchez, можно реализовать этот вопрос? http://forum.oszone.net/post-2502130-555.html

kotyarko@fb
13-05-2015, 17:01
Как в inno сгенерировать случайное число на 10 цифр? » Например, так:
Function InitializeSetup(): Boolean;
var
I: Integer;
S: String;
begin
S := '';
for I := 0 to 9 do
begin
S := S + IntToStr(Random(9));
end;
MsgBox(S, mbInformation, MB_OK);
Result := False;
end;

Николай_Николаич@vk
14-05-2015, 22:34
Код:
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpSelectDir:
if DirExists(ExpandConstant('{app}\MyProg')) then
MsgBox('bla-bla-bla', mbInformation, MB_OK);
end;
end; »

С этим вообще ничего не происходит, устанавливается всегда.

maraby
15-05-2015, 11:07
А есть еще один вопрос: как можно получить список инстанций MS SQL? Даже не знаю, как и что в гугле спрашивать...

Последний раз редактировалось maraby, 05-05-2015 в 15:21.

В общем, получилось :)
Использовала RegGetValueNames. Единственное, если RootKey указать как HKEY_LOCAL_MACHINE - то возвращает пустой список.
В общем надо указать HKLM64

Вопрос: а если инстанция SQL 32-разрядная?



procedure UzupelniNazweInstancjiSQL;
var
Names: TArrayOfString;
I: Integer;
S: String;

begin
if RegGetValueNames(HKLM64, 'SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL', Names)
then
begin
S := '';
SerwerInstancja.Items.Clear;
for I := 0 to GetArrayLength(Names)-1
do
begin
S := S + Names[I] + #13#10;
SerwerInstancja.Items.Add(S);
end;
end else
begin
// add any code to handle failure here
MsgBox(' :( ', mbInformation, MB_OK);
end;
end;

kotyarko@fb
15-05-2015, 15:01
а если инстанция SQL 32-разрядная? » Попробуйте так: procedure UzupelniNazweInstancjiSQL;
var
Names: TArrayOfString;
I, RegName: Integer;
S: String;

begin
if IsWin64 then
RegName := HKLM64
else
RegName := HKLM32;

if RegGetValueNames(RegName, 'SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL', Names)
then
begin
S := '';
SerwerInstancja.Items.Clear;
for I := 0 to GetArrayLength(Names)-1
do
begin
S := S + Names[i] + #13#10;
SerwerInstancja.Items.Add(S);
end;
end else
begin
// add any code to handle failure here
MsgBox(' :( ', mbInformation, MB_OK);
end;
end;

з.ы. вместо HKLM32, вроде, можете использовать просто HKLM.

maraby
15-05-2015, 15:50
kotyarko@fb
Спасибо :)
В принципе ведь нужен список всех инстанций?
поэтому сделала так (правда еще не тестила):


begin
if RegGetValueNames(HKLM64, 'SOFTWARE\Microsoft\Microsoft SQL Server\Instance Names\SQL', Names64)
or RegGetValueNames(HKLM32, 'SOFTWARE\Wow6432Node\Microsoft\Microsoft SQL Server\Instance Names\SQL', Names32)
then
begin
S := '';
SerwerInstancja.Items.Clear;

for I := 0 to GetArrayLength(Names64)-1
do
begin
SerwerInstancja.Items.Add(Names64[I]+ #13#10);
end;

for I := 0 to GetArrayLength(Names32)-1
do
begin
SerwerInstancja.Items.Add(Names32[I] + #13#10);
end;
end else
begin
// add any code to handle failure here
MsgBox(' :( ', mbInformation, MB_OK);
end;
end;

El Sanchez
16-05-2015, 15:34
С этим вообще ничего не происходит, устанавливается всегда. »
Если в папке MyProgram есть папка Prog - то все отлично, если же её нету, то предупреждение в окошке. »
Николай_Николаич@vk, ну, я и сделал предупреждение, сообщил и продолжил далее. Так?

function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpSelectDir:
begin
Result := not DirExists(ExpandConstant('{app}\MyProg'));
if not Result then
MsgBox('bla-bla-bla', mbInformation, MB_OK);
end;
end;
end;

Николай_Николаич@vk
16-05-2015, 18:17
ну, я и сделал предупреждение, сообщил и продолжил далее. Так?
Скрытый текст
Код:
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpSelectDir:
begin
Result := not DirExists(ExpandConstant('{app}\MyProg'));
if not Result then
MsgBox('bla-bla-bla', mbInformation, MB_OK);
end;
end;
end; »
Ну дело в том, что нет предупреждения, независимо от того, если ли папка Prog или нету.

Dodakaedr
17-05-2015, 00:10
Николай_Николаич@vk, попробуйте так [setup]
appname=app
appvername=1.0 app
defaultdirname={sd}\app
DirExistsWarning=no

[Code]
function NextButtonClick(CurPageID: Integer): Boolean;
begin
Result := True;
case CurPageID of
wpSelectDir:
begin
Result := DirExists(ExpandConstant('{app}\MyProg'));
if not Result then
MsgBox('bla-bla-bla', mbInformation, MB_OK);
end;
end;
end;

Николай_Николаич@vk
17-05-2015, 03:50
El Sanchez, Dodakaedr, Спасибо, разобрался.

Не подскажите как брать путь установки из реестра.
Например:
Если в реестре есть только ключ -
SOFTWARE\1
Dir - C:\1

То берем C:\1

А если в реестре есть

SOFTWARE\2
Dir - C:\2

То путь установки будет из 2-го.

если имеется два ключа, путь бы брался из второго - C:\2




© OSzone.net 2001-2012