Войти

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


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

Serega
05-04-2013, 18:12
Всем привет!
Взяв за основу функцию El Sanchez-а "Определение рабочей папки процесса" http://forum.oszone.net/post-1945281-380.html и упростив её до получения имени нашего процесса »
У El Sanchez, функция определяет путь к любому процессу, а вы пытаетесь определить путь к своему, поэтому ParamStr вам поможет, одним словом проще будет так:


procedure SelfDelete;
var
ResultCode: Integer;
begin
Exec('cmd.exe', '/c del ' + AddQuotes(ParamStr(0)), '', SW_HIDE, ewNoWait, ResultCode);
end;


tmp-файл деинсталлятора удалится при следующей перезагрузке. »
Так то да, но я просто знаю машины, которые перезагружаются раз в месяц, вот там то SelfDelete желателен, но на самом деле это не критично...

neorom
05-04-2013, 18:22
Как переделать простой скрипт, что при движении процесс бара одноврименно ишли плавно проценти ((с 0.0% до 100.0%) а не ривком 0% потом 100%, и в скрипте можна било менять координати розмишчения процентов в окне инсталяции) .
Скрипт из шапки [Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Files]
Source: files\*; DestDir: {app}; AfterInstall: ExtLog(); Flags: recursesubdirs

[Code]
var
ProgressLabel: TLabel;

procedure ExtLog();
begin
with WizardForm.ProgressGauge do begin
ProgressLabel.Caption:=IntToStr((Position-Min)/((Max - Min)/100)) + '%'
if (Position-Min)/((Max - Min)/100) > 50 then ProgressLabel.Font.Color:= clWhite
end
end;

procedure InitializeWizard;
begin
ProgressLabel:=TLabel.Create(WizardForm)
ProgressLabel.Top:= 4
ProgressLabel.Left:= 200
ProgressLabel.Caption:= '0%'
ProgressLabel.AutoSize:= True
ProgressLabel.Font.Color:= clBlue
ProgressLabel.Font.Style:= [fsBold]
ProgressLabel.Transparent:= True
ProgressLabel.Parent:= WizardForm.ProgressGauge
end;

saurn
05-04-2013, 22:05
neorom

Конкретно в данном примере:


[Setup]
AppName=AppName
AppVerName=AppVerName
DefaultDirName={pf}\My Program

[Files]
Source: files\*; DestDir: {app}; AfterInstall: ExtLog(); Flags: recursesubdirs

[code]
var
ProgressLabel: TLabel;

procedure ExtLog();
begin
with WizardForm.ProgressGauge do begin
ProgressLabel.Caption:=IntToStr((Position-Min)/((Max - Min)/100)) + '%'
if (Position-Min)/((Max - Min)/100) > 50 then ProgressLabel.Font.Color:= clWhite
end
end;

procedure InitializeWizard;
begin
ProgressLabel:=TLabel.Create(WizardForm)
ProgressLabel.Top:= 4
ProgressLabel.Left:= 200
ProgressLabel.Caption:= '0%'
ProgressLabel.AutoSize:= True
ProgressLabel.Font.Color:= clBlue
ProgressLabel.Font.Style:= [fsBold]
ProgressLabel.Transparent:= True
ProgressLabel.Parent:= WizardForm.ProgressGauge
end;



Более - менее плавное отображение процентов будет возможном только, если инсталятор содержит файлы небольшого размера, так как здесь проценты обновляются после того, как файл уже скопирован на диск(о чем ясно говорит процедура AfterInstall, то есть После установки). Иными словами, если у вас в инсталяторе, к примеру, пара файлов весом по несколько гигабайт, то проценты будут делать большие скачки. Лучше использовать другие способы отображения процентов, на форуме много различных примеров, пользуйтесь поиском. Например вот Пост (http://forum.oszone.net/post-1932100-239.html) .Так же, пару страниц назад уважаемый Johny777 выкладывал прекрасный пример отображения процентов установки и удаления.

Насчет изменения координат контрола, за это отвечают параметры Left(положение по горизонтали), Top(положение по вертикали). За размеры контрола отвечают Width(ширина), Height(высота) Можете так же создать свой лейбл и делать с ним, что угодно.
Координаты указываются так:

Left := ScaleX(24); //Положение по горизонтали от левого края клиента
Top := ScaleY(64); //Положение по вертикали от верхнего края клиента
Width := ScaleX(450); //Ширина
Height := ScaleY(235); //Высота


А лучше в одну строчку:


SetBounds(ScaleX(24), ScaleY(64), ScaleX(450), ScaleY(235)); //procedure SetBounds(ALeft, ATop, AWidth, AHeight: Integer);

LagunaFAN
06-04-2013, 12:01
Товарищи! Нужна ваша помощь! :( Хочу вот этот скрипт (http://rghost.ru/45076108) отучить от ISDone и не получается :( Пытался удалить все функции, но после компиляции, при запуске, пишет, что при Extract Temporary File не найден ISDone.dll . Поэтому прошу помощи. Самому не хватает знаний :(

insombia
06-04-2013, 13:01
LagunaFAN походу скрипт заточен под исдон

Gnom_aka_Lexander
06-04-2013, 13:28
insombia, нет скриптов заточеных под исдон. там тупо выпилить все функции, для которых он нужен и все.

В аттаче 2 файла, которые нужно заменить. и соответственно в модулях удалить модуль исдона.

LagunaFAN
06-04-2013, 13:39
Gnom_aka_Lexander, огромное спасибо за помощь! :Beer:

neorom
07-04-2013, 10:02
Johny777 выкладывал прекрасный пример отображения процентов установки и удаления. »
А может кто то удалить все лишнее из того скрипта от Johny777 и оставить только проценти при установки, бо у меня не получаэться.

saurn
07-04-2013, 11:21
neorom

Убрать или закомментировать всё, что ниже строчки //////////////////////////////Uninstall/////////////////////////////

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirname={pf}\MyApp

[Files]
Source: {fonts}\*; DestDir: {app}; Flags: external

[code]
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif

const
WM_USER = $0400;
PBM_SETPOS = WM_USER+2;
GWL_WNDPROC = -4;


type
LPARAM = Integer;
WPARAM = Integer;
LRESULT = Integer;
TFNWndProc = Integer;


function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLong{#A}@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: TFNWndProc; hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; external 'CallWindowProc{#A}@user32.dll stdcall';
function SetWindowText(hWnd: HWND; lpString: String): BOOL; external 'SetWindowText{#A}@user32.dll stdcall';

var
OldProgressBarProc: Longint;

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;

procedure InitializeWizard();
begin
OldProgressBarProc := SetWindowLong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, CallbackAddr('ProgressBarProc'));
end;

procedure DeinitializeSetup();
begin
SetWindowlong(WizardForm.ProgressGauge.Handle, GWL_WNDPROC, OldProgressBarProc);
end;

/////////////////////////////// Uninstall //////////////////////////////////


//function UninstallProgressBarProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
//begin
// if Msg = PBM_SETPOS then with UninstallProgressForm do SetWindowText( StatusLabel.Handle, Format('%s'#32'%s', [FmtMessage(SetupMessage(msgStatusUninstalling), ['{#SetupSetting("AppName")}']), FormatFloat('0.#0 %', (ProgressBar.Position*100)/ProgressBar.Max)]) );
//
// Result := CallWindowProc(OldProgressBarProc, hWnd, Msg, wParam, lParam);
//end;
//
//procedure UninstallFormOnHide(Sender: TObject);
//begin
// SetWindowlong(TUninstallProgressForm(Sender).ProgressBar.Handle, GWL_WNDPROC, OldProgressBarProc);
//end;
//
//procedure InitializeUninstallProgressForm();
//begin
// OldProgressBarProc := SetWindowLong(UninstallProgressForm.ProgressBar.Handle, GWL_WNDPROC, CallbackAddr('UninstallProgressBarProc'));
// UninstallProgressForm.OnHide := @UninstallFormOnHide;
//end;



Не бойтесь изучать и пробовать самостоятельно, иначе ничему не научитесь.

neorom
07-04-2013, 14:39
А можно ли зделать чтоби процедура которая отвечаэт за проценти, брала информацию из отображения процес бара(двигаэтся процес бар и идут процети). Эсли да то дайте пример.

Gnom_aka_Lexander
07-04-2013, 14:41
neorom, Собственно, постом выше, откуда думаешь, информация вычисляется? Элементарная пропорция, 7 или 8-й класс средней школы. в качестве данных берется как раз отношение текущего состояния прогресса к его максимум в соотношении к 100 процентам.

LagunaFAN
07-04-2013, 15:22
Добрый день! Други, снова нужна помощь! Сам я не особо в скриптах разбираюсь. Хочу в рамках вот этого скрипта (http://rghost.ru/45112663) добавить чекбокс (допустим, на странице с приветствием), чтобы он выполнял 2 условия:

1, Если чекбокс отмечен, то на странице с выбором каталога для установки автоматически устанавливается каталог со стимом (данные берутся из реестра)
2. (По возможности) Если чекбокс отмечен, то некоторые файлы из секции Files, копируются в каталог, который указан в секции Files. Тут, я так понимаю, можно было бы задействовать параметр Check.

Не смею многого просить, но я был бы благодарен, если бы второе условие тоже соблюдалось :blush: Пытался сделать на основе того, что уже есть в скрипте, но ничего не получается :(

UPD: Всем спасибо за внимание! Помучился, но сделал! :rupor:

neorom
07-04-2013, 17:38
Не могу добавить до свого скрипта функцию отображения процентов установки, может эсть какой то простой скрипт для отображения процентов з использувании .dll чтоби било хоть чуть-чуть мне понятно.

insombia
07-04-2013, 19:19
neorom юзай исдон

Tima182
07-04-2013, 20:23
Привет. Помогите, как создать установку в указанную папку что бы вне зависимости от имя профиля в винде ставилась игра ".minecraft" в папку C:\Users\у каждого будет свое имя профиля\AppData\Roaming\.minecraft ?
Или в винде XP: C:\Documents and Settings\у каждого будет свое имя профиля\Application Data\.minecraft
Ну что бы имя твоего профиля винды ставилось само во время установки.
Что в скрипте надо дописать/изменить?
Есть готовая игра, нельзя изменить папку, но там путь сразу автоматически который надо.
Я игру моддил и сейчас надо установку без выбора папки установки создать.
Вот пример (http://rutracker.org/forum/viewtopic.php?t=4246250)
; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Minecraft"
#define MyAppVersion "1.4.7"
#define MyAppPublisher "Tima"
#define MyAppExeName "Minecraft.exe"

[Setup]
; NOTE: The value of AppId uniquely identifies this application.
; Do not use the same AppId value in installers for other applications.
; (To generate a new GUID, click Tools | Generate GUID inside the IDE.)
AppId={{DAAFDCA5-5F82-466E-9499-6875E9FFFE7F}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\.minecraft
DisableDirPage=yes
DefaultGroupName={#MyAppName}
OutputDir=C:\Users\Тима\Desktop
OutputBaseFilename=setup
Compression=lzma/ultra
SolidCompression=true
PrivilegesRequired=none

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: quicklaunchicon; Description: {cm:CreateQuickLaunchIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked; OnlyBelowVersion: 0,6.1

[Files]
Source: C:\Users\Тима\AppData\Roaming\.minecraft\Лаунчеры\Minecraft.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Users\Тима\AppData\Roaming\.minecraft\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: quicklaunchicon

[Run]
Filename: {app}\{#MyAppExeName}; Description: {cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}; Flags: nowait postinstall skipifsilent

Gnom_aka_Lexander
07-04-2013, 20:43
[Files]
Source: C:\Users\Тима\AppData\Roaming\.minecraft\Лаунчеры\Minecraft.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Users\Тима\AppData\Roaming\.minecraft\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs »
Во первых, первая строчка не имеет смысла, ибо все это будет скопировано по условиям во второй строке.
ну а путь установки... собственно константа {userappdata} ведет именно туда, куда нужно.

[Files]
Source: C:\Users\Тима\AppData\Roaming\.minecraft\*; DestDir: "{userappdata}\.minecraft"; Flags: ignoreversion recursesubdirs createallsubdirs
ну или
[Setup]
AppName=Minecraft
AppVersion=b 1.3_01
DefaultDirName={userappdata}\.minecraft\
и запретить редактировать путь установки - я так делал для FlyPlay.ru

Tima182
07-04-2013, 21:07
Спасибо огромное.
А все, разобрался.
А как замутить удаление всей папки куда поставилась игра?
Как сделать что бы галочка была всегда что ярлык на рабочий стол поместится?

Gnom_aka_Lexander
07-04-2013, 22:01
Tima182, если честно, весь мне несколько стыдно выкладывать, ибо писался он года 3 тому назад. И по этой причине вряд-ли он подходит для изучения. Хотя, если причесать чуток.. Мне-то не жалко :)
Скачать (http://rghost.ru/45124037)

Tima182
07-04-2013, 22:03
Спасибо. А как это использовать в установке игры?
В скрипт как вписать?

Gnom_aka_Lexander
07-04-2013, 22:05
Tima182, это уже готовый скрипт. просто берешь и пользуешься. там есть все, что нужно




© OSzone.net 2001-2012