PDA

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


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

Dodakaedr
28-03-2014, 18:18
vint56, спс

Serega
28-03-2014, 19:31
в таком варианте работает несовсем корректно. Страницы меняются, но не меняются шапки, т е на странице с выбором папки заголовок про выбор компонентов и наоборот. »
Тупой копи-паст я не приветствую, где же хоть немного подумать?!!! Ваш вопрос был:
можно ли в инно поменять порядок отображения стандартных страниц? »
Я именно это и показал... извините, что решил дать вам шанс лишний раз подумать...
Поверьте, только после того, как вы начнёте переделывать код под свои нужды, только тогда вы начнёте разбираться.

Dodakaedr
29-03-2014, 00:14
Как добавить чекбокс в деинсталятор с функцией не удалять файл?

Mr.Evgen
29-03-2014, 16:22
Здравствуйте. Как можно сделать инсталятор как на скриншоте? Может есть готовый скрипт для inno setup? Главное надо, чтобы пользователь мог выбрать между обычной и портативной версией.
http://i.imgur.com/IusvIPp.jpg (http://i.imgur.com/nOwgOXi.jpg)

Serega
29-03-2014, 19:51
Как добавить чекбокс в деинсталятор »


[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma2/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[CustomMessages]
ru.CheckBoxDel=Удалить все настройки

[Dirs]
Name: {userappdata}\MyTestDir

[UninstallDelete]
Name: {userappdata}\MyTestDir; Type: filesandordirs; Check: DelUserSettings

[Code]
procedure Delay(Milliseconds: Integer); forward;

var
NextClick: Boolean;
DelOptions: Boolean;

function DelUserSettings: Boolean;
begin
Result := DelOptions;
end;

procedure NextBtnClick(Sender: TObject);
begin
NextClick := True;
end;

procedure chkDelClick(Sender: TObject);
begin
DelOptions := TCheckBox(Sender).Checked;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
msg: string;
NextBtn: TButton;
chkDel: TCheckBox;
begin
if CurUninstallStep = usUninstall then
try
with UninstallProgressForm do
begin
ProgressBar.Hide;
msg := StatusLabel.Caption;
end;

NextClick := False;
NextBtn := TButton.Create(UninstallProgressForm);
with NextBtn do
begin
Parent := UninstallProgressForm;
SetBounds(UninstallProgressForm.CancelButton.Left, UninstallProgressForm.CancelButton.Top,
UninstallProgressForm.CancelButton.Width, UninstallProgressForm.CancelButton.Height);
Caption := SetupMessage(msgButtonNext);
OnClick := @NextBtnClick;
end;

chkDel := TCheckBox.Create(UninstallProgressForm);
with chkDel do
begin
Parent := UninstallProgressForm.InstallingPage;
SetBounds(UninstallProgressForm.StatusLabel.Left + ScaleX(20), UninstallProgressForm.StatusLabel.Top + ScaleY(50), ScaleX(250), ScaleY(14));
Caption := CustomMessage('CheckBoxDel');
Checked := False;
OnClick := @chkDelClick;
end;

while not NextClick do
Delay(500);
finally
chkDel.Hide;
NextBtn.Free;
with UninstallProgressForm do
begin
ProgressBar.Show;
StatusLabel.Caption := msg;
end;
end;
end;

const
PM_REMOVE = 1;
QS_ALLINPUT = $000000FF;
WAIT_TIMEOUT = $00000102;

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';
function MsgWaitForMultipleObjects(nCount: DWORD; var pHandles: THandle; fWaitAll: BOOL; dwMilliseconds, dwWakeMask: DWORD): DWORD;
external 'MsgWaitForMultipleObjects@user32.dll stdcall';
function CreateEvent(lpEventAttributes: Longint; bManualReset, bInitialState: BOOL; lpName: PChar): THandle; external 'CreateEventA@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';

procedure Application_ProcessMessages;
var
Msg: TMsg;
begin
while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

procedure Delay(Milliseconds: Integer);
var
dwTick: DWORD;
hEvent: THandle;
begin
hEvent := CreateEvent(0, False, False, '');
try
dwTick := GetTickCount + DWORD(Milliseconds);
while (Milliseconds > 0) and (MsgWaitForMultipleObjects(1, hEvent, False, Milliseconds, QS_ALLINPUT) <> WAIT_TIMEOUT) do
begin
Application_ProcessMessages;
Milliseconds := dwTick - GetTickCount;
end;
finally
CloseHandle(hEvent);
end;
end;

Dodakaedr
29-03-2014, 19:56
Serega, спасибо, но нету что-то по проще. Мне нужно чтобы не удалился только один файл если отмечен чекбокс. Inno Ultra считается расширенной?

Debugger
29-03-2014, 21:13
Никак не могу понять в чем дело... Имеется такой вот код:
function CheckPSE9: Boolean;
begin
Result := RegKeyExists(HKLM32, 'SOFTWARE\Adobe\Photoshop Elements\9.0\PluginPath')
end;

function CheckPSE10: Boolean;
begin
Result := RegKeyExists(HKLM32, 'SOFTWARE\Adobe\Photoshop Elements\10.0\PluginPath')
end;

function CheckPSE11: Boolean;
begin
Result := RegKeyExists(HKLM32, 'SOFTWARE\Adobe\Photoshop Elements\11.0\PluginPath')
end;

Source: c:\Alien Skin\work32\Plug-ins\Alien Skin\Blow Up 3\*; DestDir: {reg:HKLM32\SOFTWARE\Adobe\Photoshop Elements\9.0,PluginPath}\Alien Skin\Blow Up 3; Components: BlowUp3\BlowUp3PSE9; Check: "IsWin64"; Flags: recursesubdirs createallsubdirs

Source: c:\Alien Skin\work32\Plug-ins\Alien Skin\Blow Up 3\*; DestDir: {reg:HKLM32\SOFTWARE\Adobe\Photoshop Elements\10.0,PluginPath}\Alien Skin\Blow Up 3; Components: BlowUp3\BlowUp3PSE10; Check: "IsWin64"; Flags: recursesubdirs createallsubdirs

Source: c:\Alien Skin\work32\Plug-ins\Alien Skin\Blow Up 3\*; DestDir: {reg:HKLM32\SOFTWARE\Adobe\Photoshop Elements\11.0,PluginPath}\Alien Skin\Blow Up 3; Components: BlowUp3\BlowUp3PSE11; Check: "IsWin64"; Flags: recursesubdirs createallsubdirs

То есть идет проверка наличия программы, и если она есть, установка плагина в папку которая берется из реестра. Но установка проходит нормально только для Photoshop Elements 11. В случае девятого и десятого инсталлятор не может найти ключ в реестре (проверялось при помощи Process Monitor), хотя он есть, и соответственно ставит плагин на системный диск. Причем в секции кода ключ находится нормально. В чем может быть дело? Всю голову уже сломал... Единственное что приходит в голову это то, что когда я писал скрипт, то только для одиннадцатой версии строчку писал руками, а для остальных копипастил ее и потом исправлял, но не может же быть проблема из-за этого.

Serega
30-03-2014, 17:11
нету что-то по проще. Мне нужно чтобы не удалился только один файл если отмечен чекбокс »
Проще только с сообщением


[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma2/ultra
InternalCompressLevel=ultra
SolidCompression=yes

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

[CustomMessages]
ru.Del=Удалить файл Справки

[Files]
Source: {#CompilerPath}\ISetup.chm; DestDir: {userappdata}; Flags: ignoreversion uninsneveruninstall

[Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if (CurUninstallStep = usUninstall) and
(MsgBox(CustomMessage('Del'), mbInformation, MB_YESNO or MB_DEFBUTTON2) = IDYES) then
DeleteFile(ExpandConstant('{userappdata}\ISetup.chm'));
end;



Inno Ultra считается расширенной? »
В составе Inno Ultra есть расширенная версия.

Dodakaedr
30-03-2014, 17:14
Serega, спс!

Serega
30-03-2014, 18:13
В PM мне написали, что указанный в шапке пример Отображение размера устанавливаемого файла (http://forum.oszone.net/post-1882481-1175.html) работает не корректно, а именно функция BytesToReadable не работает с размерами выше мегабайта. Проверил, действительно, в новых версиях Inno, работает не правильно.
Само сообщение уже отредактировать не могу, т.к. тема в архиве, поэтому приведу исправленный вариант в этом сообщении:


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

[CustomMessages]
ru.Bt=Бт
ru.Kb=Кб
ru.Mb=Мб
ru.Gb=Гб
ru.Tb=Тб
ru.Pb=Пб
ru.Eb=Эб

[Code]
var
ProgressLabel, SizeLabel: TLabel;

function BytesToReadable(Bytes: string; Signs: Integer): string;
{ Перевод числа в значение Бт/Кб/Мб/Гб/Тб/Пб/Эб (Signs - количество знаков после запятой)}
var
ABytes: Extended;
i: Integer;
begin
i := 0;
try
ABytes := StrToFloat(Bytes);
except
end;
while Int(ABytes) >= 1024 do
begin
ABytes := ABytes/1024;
i := i + 1;
end;
case i of
0: Result := FloatToStr(Int(ABytes)) + Padl(ExpandConstant('{cm:Bt}'), 1); // Байт
1: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Kb}'), [ABytes]); // Килобайт
2: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Mb}'), [ABytes]); // Мегабайт
3: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Gb}'), [ABytes]); // Гигабайт
4: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Tb}'), [ABytes]); // Терабайт
// больше Терабайта конечно не пригодится, покрайней мере в ближайшее время, но всё же...
5: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Pb}'), [ABytes]); // Петабайт
6: Result := Format('%.' + IntToStr(Signs) + 'n ' + ExpandConstant('{cm:Eb}'), [ABytes]); // Эксабайт
end;
StringChange(Result, ',', '.');
end;

function Size64(Hi, Lo: Integer): Extended;
begin
Result := Lo;
if Lo < 0 then
Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
for Hi := Hi - 1 downto 0 do
Result := Result + $7FFFFFFF + $7FFFFFFF + 2;
end;

function GetFileSize(const FileName: string): Extended;
var
FindRec: TFindRec;
begin
Result := 0;
if FindFirst(FileName, FindRec) then
try
if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
Result := Size64(FindRec.SizeHigh, FindRec.SizeLow);
finally
FindClose(FindRec);
end;
end;

procedure Progress;
begin
with WizardForm.ProgressGauge do
ProgressLabel.Caption := IntToStr(Position*100/(Max - Min)) + '%';
SizeLabel.Caption := BytesToReadable(FloatToStr(GetFileSize(ExpandConstant(CurrentFileName))), 1);
end;

procedure InitializeWizard();
begin
ProgressLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressLabel.Top := Top + Height + ScaleY(8);
ProgressLabel.Left := Left + Width/2 - ScaleX(8);
ProgressLabel.AutoSize := True;
ProgressLabel.Parent := WizardForm.InstallingPage;
end;

SizeLabel := TLabel.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
SizeLabel.Top := Top + Height + ScaleY(8);
SizeLabel.Left := Left;
SizeLabel.AutoSize := True;
SizeLabel.Parent := WizardForm.InstallingPage;
end;
end;

Dinvin4ester
30-03-2014, 18:53
Ребята ну помогите мне пожалуйста.

Raz3r
30-03-2014, 19:28
А кто поможет мне? 2 чекбокса в uninstaller'е сделать не могу для удаления созданных программой файлов. Один для удаления папки с конфигурациями, другой для с папками файлов сервера, созданных этой же программой.
Пытался этим кодом че-то сделать, но ничего не получилось:

[UninstallDelete]
Type: files; Name: "{app}\config.ini"; Check: MakeLaunchIcon
Type: files; Name: "{app}\server.ini"; Check: MakeLaunchIcon2

[Code]
var
LaunchIcon, LaunchIcon2: TCheckBox;

function MakeLaunchIcon: Boolean;
begin
Result:=LaunchIcon.Checked;
end;

function MakeLaunchIcon2: Boolean;
begin
Result:=LaunchIcon2.Checked;
end;

Procedure InitializeWizard();
begin
LaunchIcon := TCheckBox.Create(WizardForm);
with LaunchIcon do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Удалить файлы конфигураций?';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top + 37;
Width := ScaleX(300);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;
begin
LaunchIcon2 := TCheckBox.Create(WizardForm);
with LaunchIcon2 do
begin
Parent := WizardForm.SelectDirPage;
Caption := 'Удалить файлы сервера?';
Left := ScaleX(0);
Top := WizardForm.DirEdit.Top + 57;
Width := ScaleX(300);
Height := ScaleY(15);
TabOrder := 0;
Checked := True;
end;
end;
end;

И ещё отдельный вопрос есть, как записать кавычки в ValueData в секции [Registry]?
Например: Root: HKLM; Subkey: "SOFTWARE\Classes\ts3file\shell\open\command"; ValueType: string; ValueName: "@"; ValueData: "{app}\client.exe "%1""; Flags: uninsdeletekey

Dodakaedr
30-03-2014, 19:32
как записать кавычки в ValueData в секции [Registry]? »
Root: HKLM; Subkey: "SOFTWARE\Classes\ts3file\shell\open\command"; ValueType: string; ValueName: "@"; ValueData: "{app}\client.exe ""%1"""; Flags: uninsdeletekey

2 чекбокса в uninstaller'е »
Посмотри здесь
http://forum.oszone.net/post-2330306-145.html

Raz3r
30-03-2014, 20:14
Dodakaedr, спасибо попробую разобраться в этом кодище. Заодно можно узнать вот пишу я ValueName: "@", а мне нужна приплюснутая @, так как требуют параметры программы, есть ли разница или они одинаковые? Как вписать в Inno Setup другой вариант?

Dodakaedr
30-03-2014, 20:16
приплюснутая »
это какая?

Raz3r
30-03-2014, 20:21
Dodakaedr, в этом коде есть она, здесь не знаю как отобразить
http://forum.oszone.net/post-2330306-145.html

Dodakaedr
30-03-2014, 20:24
здесь не знаю как отобразить »
Разницы нету

Raz3r
30-03-2014, 20:25
Dodakaedr, а как её ввести то?

Dodakaedr
30-03-2014, 20:26
Raz3r, так и вводи @

так как требуют параметры программы »
А не пробовал копировать?

Raz3r
30-03-2014, 20:29
А не пробовал копировать?
Пробовал, отображается обычная @. Думал мож alt-код какой надо.




© OSzone.net 2001-2012