Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 8]
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
Как сделать, чтобы деинсталятор удалял заранее указанные папки? »
Пример:
[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; »
С этим вообще ничего не происходит, устанавливается всегда.
А есть еще один вопрос: как можно получить список инстанций 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.
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
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.