Показать полную графическую версию : Скрипты Inno Setup. Помощь и советы [часть 7]
Dodakaedr
28-03-2014, 18:18
vint56, спс
в таком варианте работает несовсем корректно. Страницы меняются, но не меняются шапки, т е на странице с выбором папки заголовок про выбор компонентов и наоборот. »
Тупой копи-паст я не приветствую, где же хоть немного подумать?!!! Ваш вопрос был:
можно ли в инно поменять порядок отображения стандартных страниц? »
Я именно это и показал... извините, что решил дать вам шанс лишний раз подумать...
Поверьте, только после того, как вы начнёте переделывать код под свои нужды, только тогда вы начнёте разбираться.
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)
Как добавить чекбокс в деинсталятор »
[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), хотя он есть, и соответственно ставит плагин на системный диск. Причем в секции кода ключ находится нормально. В чем может быть дело? Всю голову уже сломал... Единственное что приходит в голову это то, что когда я писал скрипт, то только для одиннадцатой версии строчку писал руками, а для остальных копипастил ее и потом исправлял, но не может же быть проблема из-за этого.
нету что-то по проще. Мне нужно чтобы не удалился только один файл если отмечен чекбокс »
Проще только с сообщением
[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, спс!
В 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
Ребята ну помогите мне пожалуйста.
А кто поможет мне? 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
Dodakaedr, спасибо попробую разобраться в этом кодище. Заодно можно узнать вот пишу я ValueName: "@", а мне нужна приплюснутая @, так как требуют параметры программы, есть ли разница или они одинаковые? Как вписать в Inno Setup другой вариант?
Dodakaedr
30-03-2014, 20:16
приплюснутая »
это какая?
Dodakaedr, в этом коде есть она, здесь не знаю как отобразить
http://forum.oszone.net/post-2330306-145.html
Dodakaedr
30-03-2014, 20:24
здесь не знаю как отобразить »
Разницы нету
Dodakaedr, а как её ввести то?
Dodakaedr
30-03-2014, 20:26
Raz3r, так и вводи @
так как требуют параметры программы »
А не пробовал копировать?
А не пробовал копировать?
Пробовал, отображается обычная @. Думал мож alt-код какой надо.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC