PDA

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


Страниц : 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 127 128 129 130 131 132 133

Lancer2404
12-12-2009, 19:46
Serega если можно,примерный код выложите если не сложно.
И у меня такой вопрос.Имею код для создание бекапа.Но бекапит только то что в корне.А че дописать чтобы и в подпапках бекапил.


[Tasks]
Name: arc; Description: "Сделать резервную копию файлов"



[Code]
var
Page: TInputDirWizardPage;
ArcDir: String;

procedure CreateBackup();
var
SrcFile, DestFile: string;
begin
if IsTaskSelected('arc') then
begin

ForceDirectories(ArcDir);
SrcFile:= AddBackslash(ExpandConstant('{app}')) + ExtractFileName(CurrentFileName);
DestFile:= AddBackslash(ArcDir) + ExtractFileName(CurrentFileName);
FileCopy(SrcFile, DestFile, False);
end;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
If (CurPageID = Page.ID) then
ArcDir := Page.Values[0];
Result:= True;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
If (PageID = Page.ID) and
(Not IsTaskSelected('arc')) then
Result:= True
else Result:= False;
end;

procedure InitializeWizard();
begin
Page:= CreateInputDirPage(wpSelectTasks, 'Выберите папку бэкапа.',
'Куда вы засуните файлы бэкапа.Оттуда вы сможете восстановить свои файлы',
'Для продолжения нажмите далее.' + #10#13#10#13 +
'Если хотите выбрать другую папку щелкните Обзор.',
False, 'Backup');
Page.Add('');
Page.Values[0] := ExpandConstant('{sd}\GTAIV\Backup');

end;

Serega
12-12-2009, 20:48
Имею код для создание бекапа.Но бекапит только то что в корне.А че дописать чтобы и в подпапках бекапил. »
Чтоб не изобретать велосипед, в Справка, руководство, примеры есть Коллекция скриптов, в архиве есть скрипт SHFileOperation.iss, где реализована работа с директориями и файлами.
Просто добавляете в самое начало вашего скрипта #include "путь до скрипта\SHFileOperation.iss" и затем используете функцию из этого скрипта.

#include "здесь укажите путь до скрипта..\SHFileOperation.iss"

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

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

[Tasks]
Name: arc; Description: "Сделать резервную копию файлов"

[Code]
var
Page: TInputDirWizardPage;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result:= (PageID = Page.ID) and not IsTaskSelected('arc');
end;

procedure InitializeWizard();
begin
Page:= CreateInputDirPage(wpSelectTasks, 'Выберите папку бэкапа.',
'Куда вы засуните файлы бэкапа.Оттуда вы сможете восстановить свои файлы',
'Для продолжения нажмите далее.' + #10#13#10#13 +
'Если хотите выбрать другую папку щелкните Обзор.',
False, 'Backup');
Page.Add('');
Page.Values[0]:= ExpandConstant('{sd}\GTAIV\Backup');
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPreInstall) and IsTaskSelected('arc') then
CopyDir(ExpandConstant('{app}'), Page.Values[0]);
end;

mosre
12-12-2009, 20:59
Добрый вечер..
Каким цветом нужно подменять кликабельное лого, для чёрного фона..
Во всех примерных скриптах создания сего идёт "фуксия", а какой нужен именно для чёрного..

YURSHAT
12-12-2009, 21:06
Каким цветом нужно подменять кликабельное лого, для чёрного фона..
Во всех примерных скриптах создания сего идёт "фуксия", а какой нужен именно для чёрного.. »
Да цвет там не важен. Просто рисуете логотип на черном фоне и он сливается с черным цветом инсталла.

mosre
12-12-2009, 21:14
Лого на чёрном фоне.. Просто картинка отображается как надо..
Такого чуда неполучается добиться используя вот этот код..

var
LogoImage:TBitmapImage;
LogoLabel: TLabel;

procedure LogoOnClick(Sender: TObject);
var ReturnCode: Integer;
begin
ShellExec('open', 'http://......', '', '', SW_SHOWNORMAL, ewNoWait, ReturnCode)
end;

procedure InitializeWizard();
var
LogoPanel : TPanel;
begin
ExtractTemporaryFile('1.bmp');
LogoPanel := TPanel.Create(WizardForm);
with LogoPanel do
begin
Parent := WizardForm;
Left := ScaleX(5);
Top := ScaleY(320);
Width := ScaleX(165);
Height := ScaleY(35);
BevelOuter := bvNone;
end;

LogoImage := TBitmapImage.Create(WizardForm);
with LogoImage do
begin
Parent := LogoPanel;
Left := ScaleX(0);
Top := ScaleY(0);
AutoSize:=true;
ReplaceColor:=clFuchsia;
ReplaceWithColor:=clBtnFace;
Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
end;

LogoLabel := TLabel.Create(WizardForm);
with LogoLabel do
begin
Parent := LogoPanel;
Width := LogoPanel.Width;
Height := LogoPanel.Height;
Transparent:=True;
Cursor := crHand;
OnClick:=@LogoOnClick;
end;
end;
Получается только вот что..
http://s39.radikal.ru/i084/0912/c9/98e3119a88a5.png

YURSHAT
12-12-2009, 21:32
Такого чуда неполучается добиться используя вот этот код.. »
В коде все правильно. Покажите весь скрипт

Lancer2404
12-12-2009, 21:32
Цитата Lancer2404:
Имею код для создание бекапа.Но бекапит только то что в корне.А че дописать чтобы и в подпапках бекапил. »
Чтоб не изобретать велосипед, в Справка, руководство, примеры есть Коллекция скриптов, в архиве есть скрипт SHFileOperation.iss, где реализована работа с директориями и файлами.
Просто добавляете в самое начало вашего скрипта #include "путь до скрипта\SHFileOperation.iss" и затем используете функцию из этого скрипта.
Пример
Код:
#include "здесь укажите путь до скрипта..\SHFileOperation.iss"
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes
[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
[Tasks]
Name: arc; Description: "Сделать резервную копию файлов"
[Code]
var
Page: TInputDirWizardPage;
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result:= (PageID = Page.ID) and not IsTaskSelected('arc');
end;
procedure InitializeWizard();
begin
Page:= CreateInputDirPage(wpSelectTasks, 'Выберите папку бэкапа.',
'Куда вы засуните файлы бэкапа.Оттуда вы сможете восстановить свои файлы',
'Для продолжения нажмите далее.' + #10#13#10#13 +
'Если хотите выбрать другую папку щелкните Обзор.',
False, 'Backup');
Page.Add('');
Page.Values[0]:= ExpandConstant('{sd}\GTAIV\Backup');
end;
procedure CurStepChanged(CurStep: TSetupStep);
begin
if (CurStep = ssPreInstall) and IsTaskSelected('arc') then
CopyDir(ExpandConstant('{app}'), Page.Values[0]);
end;
------- »


А к файлам надо добавлять BEforeinstall:Createbackup.Или что?А то так не действует

Serega
12-12-2009, 22:56
А к файлам надо добавлять BEforeinstall:Createbackup.Или что? »
Данный скрипт копирует, перед началом установки всю папку {app}, вместе со всеми файлами и подпапками:

if (CurStep = ssPreInstall) and IsTaskSelected('arc') then
CopyDir(ExpandConstant('{app}'), Page.Values[0]);

если нужно просто копировать файлы, допустим по маске, то замените CopyDir(ExpandConstant('{app}'), Page.Values[0]);, на
CopyFiles(ExpandConstant('{app}'), Page.Values[0], '*.dll'); - в данном случае будут скопированы все файлы имеющие расширение *.dll

Lancer2404
12-12-2009, 23:11
А если мне надо сделать только копии заменяемых файлов?

Serega
13-12-2009, 00:16
А если мне надо сделать только копии заменяемых файлов? »
Вы честное слово, как в одном очень известном фильме... А у вас нет точно такого же, но с сиреневыми пуговицами...
Какой вопрос поставили, такой ответ и получили.
Как вы решили автоматически определить заменяемые файлы? Нужен какой-то список файлов в вашем инсталляторе, затем он сверяется с наличием с именами файлов в каталоге и если имена совпадают, то копирует их. Или все имена прописывать в ручную, т.е. if FileExists(FileName) then копируем...

YURSHAT
13-12-2009, 00:58
Serega, еще раз спасибо! Вы как всегда на высоте!
А у вас нет точно такого же, но с сиреневыми пуговицами... » :laugh:

МИШАНЧИК
13-12-2009, 06:20
Serega, подскажите пожалуйста!
Есть:
[Components]
Name: a; Description: Nero™ Reloaded 9.4.2.6; Types: full
Name: a\a; Description: Nero Burning ROM+Nero Express; Types: Full custom; Flags: fixed; ExtraDiskSpaceRequired: 573571408
Name: a\b; Description: Microsoft Visual C++ 2005 SP1; Types: Full custom; Flags: fixed; ExtraDiskSpaceRequired: 3146066
Name: a\c; Description: Nero Vision; Types: full custom; ExtraDiskSpaceRequired: 445644728
Name: a\d; Description: Nero WaveEditor; Types: full custom; ExtraDiskSpaceRequired: 157286001
Name: a\e; Description: Nero CoverDesigner; Types: full custom; ExtraDiskSpaceRequired: 99614249
Name: a\e\a; Description: LightScribe; Types: full custom; ExtraDiskSpaceRequired: 31457413; Flags: dontinheritcheck
Name: a\f; Description: Утилиты; Types: full custom
Name: a\f\a; Description: Nero BurnRights; Types: full custom; ExtraDiskSpaceRequired: 7340104
Name: a\f\b; Description: Nero DiscSpeed; Types: full custom; ExtraDiskSpaceRequired: 7340104
Name: a\f\c; Description: Nero DriveSpeed; Types: full custom; ExtraDiskSpaceRequired: 7340104
Name: a\f\d; Description: Nero InfoTool; Types: full custom; ExtraDiskSpaceRequired: 9437112

Можно ли как-то сделать:
1. Когда снимаешь галку с Name: a\e\a, она автоматом не снималась с Name: a\e?
2. Когда ставишь на Name: a\e, она автоматом не ставилась на Name: a\e\a?

Serega
13-12-2009, 06:46
Можно ли как-то сделать »
Добавьте к компоненту a\e, флаг checkablealone, т.е.:

Name: a\e; Description: Nero CoverDesigner; Types: full custom; ExtraDiskSpaceRequired: 99614249; Flags: checkablealone

МИШАНЧИК
13-12-2009, 08:19
Serega, добавил, ничего не изменилось.
Если я снимаю галку с a\e\a, то она автоматом снимается и с a\e и поставить отдельно на a\e нельзя, получается нужно ставить на a\e\a и тогда она автоматом ставиться на a\e. А так было и до флаг checkablealone ».
Может как-то ещё?

Serega
13-12-2009, 18:33
Если я снимаю галку с a\e\a, то она автоматом снимается и с a\e и поставить отдельно на a\e нельзя »
Неправда, именно это работает...
получается нужно ставить на a\e\a и тогда она автоматом ставиться на a\e. А так было и до »
Всегда при выборе дочернего компонента, автоматом выбирается родительский, т.к. смысл установки дочернего теряется...

Lancer2404
13-12-2009, 20:07
Цитата Lancer2404:
А если мне надо сделать только копии заменяемых файлов? »
Вы честное слово, как в одном очень известном фильме... А у вас нет точно такого же, но с сиреневыми пуговицами...
Какой вопрос поставили, такой ответ и получили.
Как вы решили автоматически определить заменяемые файлы? Нужен какой-то список файлов в вашем инсталляторе, затем он сверяется с наличием с именами файлов в каталоге и если имена совпадают, то копирует их. Или все имена прописывать в ручную, т.е. if FileExists(FileName) then копируем...
------- »


Но в этом коде меня все устраивает.Вот эти сточки как раз и отвечают за бекап файлов которые копируются.

ForceDirectories(ArcDir);
SrcFile:= AddBackslash(ExpandConstant('{app}\data')) + ExtractFileName(CurrentFileName);

DestFile:= AddBackslash(ArcDir) + ExtractFileName(CurrentFileName);
FileCopy(SrcFile, DestFile, False);


Но в данный момент он делает бекап только файлоа которые копируются в папку data.Как добавить путь для других папок
Пробовал
SrcFile:= AddBackslash(ExpandConstant('{app}\data')) + ExtractFileName(CurrentFileName)+
AddBackslash(ExpandConstant('{app}\data\theme')) + ExtractFileName(CurrentFileName);

непомогло

Winstan
13-12-2009, 20:14
Serega,
Подскажи как можно переписать по новый пб на стр. удаления?
Полностью ее переделал осталось пб сделать и все.
И еще вопрос можно ли добавить еще 2 стр. которые буду отвечать за запрос о удаление и за сообщение о том что удалены фалы?

ADremLIN
13-12-2009, 23:32
Программа состоит из набора компонентов. Требуется удалять или добавлять выбранные компоненты уже после инсталляции.

То есть я пытаюсь прикрутить UninsHs для Modify/Repair/Remove, но он нифига, как оказалось не делает, кроме добавления своего окна...

Попытка отменить выбор раннее установленных компонентов вызывает это сообщение:

http://www.fileden.com/files/2009/9/18/2578776/QRedMiner/UninsHs-00.jpg

Такое же окно получаю и при повторном запуске инсталлятора :(

Здесь, в закрытом обсуждении, нашел вот это (практически мой случай):
http://forum.oszone.net/showpost.php?p=1169563
http://forum.oszone.net/showpost.php?p=1169728

Вопрос есть ли движение в этом направлении? Если все по-прежнему "глухо", то хотя бы намекните как:
написать руками функцию которая будет смотреть чекнута ли компонента и удалять все ее файлы
а то у меня уже голова кругом идет...

Спасибо.

Serega
13-12-2009, 23:59
Как добавить путь для других папок »
Если вас не устраивает предложенный вариант с CopyDir, то посмотрите в Коллекции скриптов, ссылка есть в шапке темы, там есть несколько скриптов с поиском и копированием файлов...

Требуется удалять или добавлять выбранные компоненты уже после инсталляции. »
В любом случае все файлы и папки придётся прописывать руками, т.е. после установки, на финишной странице производите проверку выбранных компонентов и в соответствии с выбором производите манипуляции с файлами...
Попытка отменить выбор раннее установленных компонентов вызывает это сообщение »
Чтоб избежать этого сообщения, добавьте к каждому компоненту флаг disablenouninstallwarning

ADremLIN
14-12-2009, 00:23
В любом случае все файлы и папки придётся прописывать руками, т.е. после установки, на финишной странице производите проверку выбранных компонентов и в соответствии с выбором производите манипуляции с файлами...


Понятно. Все придется делать руками... :(

Спасибо за советы. Буду попробовать.




© OSzone.net 2001-2012