PDA

Показать полную графическую версию : Скрипты 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

habib2302
09-10-2013, 12:31
Доброе время суток. Я использую скрипт для закрепеня ярлыков на панель быстрого запуска win 7. И имя ярлыка получается корявое
http://img27.imageshack.us/img27/7624/3ukn.png

Mat_y
10-10-2013, 11:44
Ребят, покажите, пожалуйста, где почитать как сделать чтобы выбранные компоненты подгружались в установщик из сети?

Mat_y
10-10-2013, 17:47
У меня еще один вопрос, а как прописать правило, чтобы при удалении программы в реестре ничего не трогалось.

El Sanchez
10-10-2013, 17:54
А как можно сделать, чтобы установщик запоминал какие компоненты пользователь выбрал при прошлой установке? Т.е. если установщик запущен еще раз, то галочки на выбранных компонентах оставались.... только так, чтобы фаил uninstall не создавался... кто-то говорил, что это можно сделать в ini »
Mat_y, Способ 1 - Пользоваться параметрами командной строки /SAVEINF и /LOADINF, тогда установщик сделает все за вас, но приходится мириться с обязательным указанием этих параметров. Способ 2 - Хранить имена (не индексы) выбранных компонентов в конфигурационном файле (ini, xml) собственной структуры, тогда установщику все побоку и всю логику разбора конфига делать самому. Выбирайте.
Ребят, покажите, пожалуйста, где почитать как сделать чтобы выбранные компоненты подгружались в установщик из сети? »
Mat_y, это извращение.
И имя ярлыка получается корявое »
habib2302, каково имя exe-файла, таково и имя ярлыка.

Mat_y
10-10-2013, 18:43
El Sanchez, извращение - не извращение, но если один из компонентов весит Гиг, нужен он 10% людей, а сам установщик вести 10 мегабайт, то это единственный разумный выход не раздувать размер файла.

Mat_y
10-10-2013, 20:14
А по поводу реестра есть варианты?

El Sanchez
10-10-2013, 22:36
но если один из компонентов весит Гиг, нужен он 10% людей »
Mat_y, не .NET Framework 4 часом? Инсталлятор - не качалка, требуемые для работы устанавливаемой им программы такие большие по размеру компоненты содержать/качать не обязан, обязан лишь определить наличие такого компонента в системе.
А по поводу реестра есть варианты? »
В теории перед удалением файлов на этапе usAppMutexCheck переименовать ветку регистрации деинсталлятора в реестре, на этапе usDone вернуть назад.

Mat_y
10-10-2013, 23:40
Mat_y, не .NET Framework 4 часом? »
Нет, не он. Знаю, что такая функция в Инно доступна, но вот почитать нигде не находил.

В теории перед удалением файлов на этапе usAppMutexCheck переименовать ветку регистрации деинсталлятора в реестре, на этапе usDone вернуть назад. »
Я верю, что должен быть способ проще.


И вопрос прям совсем к знатокам... в окне компонентов можно выбрать (навести мышку) и появится описание этого компонента... это я знаю как сделать... а вот можно ли выводить картинку, при наведении на компонент или еще какое действие?

Gnom_aka_Lexander
11-10-2013, 07:13
а вот можно ли выводить картинку, при наведении на компонент или еще какое действие? » Можно.и появится описание этого компонента... это я знаю как сделать »
Просто вместо надписи показывай картинку.Я верю, что должен быть способ проще. »
И так проще некуда в 4 строчки делается.

Mat_y
11-10-2013, 07:49
И так проще некуда в 4 строчки делается. »
Судя по Вышей подписи, просить показать "как" бессмысленно?
Просто вместо надписи показывай картинку. »
Боюсь уровень моих знаний скриптов не на том уровне.
Для инфо панели с текстом есть такой скрипт:


function enabledesc(ComponentsListHandle: HWND; DescLabelHandle: HWND; DescStrings: PChar): BOOL; external 'enabledesc@files:descctrl.dll stdcall';
function disabledesc(): BOOL; external 'disabledesc@files:descctrl.dll stdcall';

var
Info: TNewStaticText;
InfoCaption: TNewStaticText;
InfoPanel: TPanel;

procedure DeinitializeSetup();
begin
disabledesc();
end;

procedure InitializeWizard();
begin
WizardForm.TypesCombo.Visible:=False;
WizardForm.ComponentsList.Height := ScaleY(181) - WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Top := WizardForm.TypesCombo.Top;
WizardForm.ComponentsList.Width := ScaleX(417);

InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := ScaleY(190);
InfoPanel.Left := ScaleX(0);
InfoPanel.Width := ScaleX(417);
InfoPanel.Height := ScaleY(38);
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
InfoCaption.Left := ScaleX(7);
InfoCaption.Top := InfoPanel.Top - ScaleY(6);
InfoCaption.Font.Color := clActiveCaption;

Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(403);
Info.Top := ScaleY(12);
Info.Height := ScaleY(24);
Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
Info.WordWrap := true;

enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
ExpandConstant('{cm:ComponentsDescription1};')+
ExpandConstant('{cm:ComponentsDescription2};')+
ExpandConstant('{cm:ComponentsDescription3};')+
ExpandConstant('{cm:ComponentsDescription4};')+
ExpandConstant('{cm:ComponentsDescription5};')+
ExpandConstant('{cm:ComponentsDescription6};')
);
end;






Как его переделать под картинку?

Gnom_aka_Lexander
11-10-2013, 08:46
Как его переделать под картинку? »
Никак. Переделать можно, когда и вправду знаешь, как сделать. А использование сторонней библиотеки, которая делает за тебя не относится к ситуации это я знаю как сделать »
держи простейший пример.
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: a; Description: 1; Flags: exclusive disablenouninstallwarning;
Name: b; Description: 2; Flags: exclusive disablenouninstallwarning;
Name: c; Description: 3; Flags: exclusive disablenouninstallwarning;
Name: d; Description: 5; Flags: exclusive disablenouninstallwarning;

[Files]
Source: "compiler:WizModernImage.bmp"; Flags: dontcopy solidbreak
Source: "compiler:WizModernSmallImage.bmp"; Flags: dontcopy solidbreak
Source: "compiler:WizModernImage-IS.bmp"; Flags: dontcopy solidbreak
Source: "compiler:WizModernSmallImage-IS.bmp"; Flags: dontcopy solidbreak

[*Code]
var
InfoBMP: TBitmapImage;
I_BMP : Array [0..3] of TBitmap;

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('WizModernImage.bmp');
ExtractTemporaryFile('WizModernSmallImage.bmp');
ExtractTemporaryFile('WizModernImage-IS.bmp');
ExtractTemporaryFile('WizModernSmallImage-IS.bmp');
Result := True;
end;

procedure ComponentsListItemMouseMove(Sender: TObject; X: Integer; Y: Integer; Index: Integer; Area: TItemArea);
begin
InfoBMP.Bitmap.FreeImage;
if ((Index >-1) and (Index<4))then InfoBMP.Bitmap := I_BMP[Index];
end;

procedure InitializeWizard();
var
i : Integer;
begin
with WizardForm do
begin
TypesCombo.Width := ScaleX(217);
with ComponentsList do
begin
Width := ScaleX(217);
OnItemMouseMove := @ComponentsListItemMouseMove;
end;
end;

InfoBMP := TBitmapImage.Create(WizardForm);
with InfoBMP do
begin
Parent := WizardForm.SelectComponentsPage;
SetBounds(ScaleX(224), ScaleY(50), ScaleX(193), ScaleY(155));
Stretch := true;
end;
for i := 0 to 3 do
begin
I_BMP[i] := TBitmap.Create;
with I_BMP[i] do
begin
case i of
0 : LoadFromFile(ExpandConstant('{tmp}\WizModernImage.bmp'));
1 : LoadFromFile(ExpandConstant('{tmp}\WizModernSmallImage.bmp'));
2 : LoadFromFile(ExpandConstant('{tmp}\WizModernImage-IS.bmp'));
3 : LoadFromFile(ExpandConstant('{tmp}\WizModernSmallImage-IS.bmp'));
end;
end;
end;
end;

Mat_y
11-10-2013, 08:53
держи простейший пример. »
Ну спасибо, ну выручили... ну теперь осталось его адаптировать под свои нужды.

По поводу ключей реестра, и удалении программы попробую объяснить подробнее мою проблему.

Существует программа (не моя) и установщик находит к ней путь по AppId .
Далее, программа установки дополняет существующую программу файлами (при этом совершенно не трогая ни один фаил программы)... и создает файлы для удаления (Unninst).
Если воспользоваться Unninst.exe, то все дополненные файлы удаляются как надо, но и по AppId установщик эту программу перестает находить... есть ли способ этого избежать?

Mat_y
11-10-2013, 10:57
держи простейший пример. »

У меня пара вопросов возникла, которые я никак не могу решить...

1)
Строчка
Parent := WizardForm.SelectComponentsPage;
привязывает поле с картинкой к полю с компонентами.... я бы хотел это поле разместить на странице с выбором компонентов вверху, отдельно от поля со списком компонентов.
Пока я придумал только
Parent := WizardForm.MainPanel;
Но это не вариант, т.к. добавляет оэто поле на все траницы... что прописать, чтобы затронуть только страницу с выбором компонентов?

И еще небольшой вопросик...
2) Как сделать, чтобы поле с картинкой изначально не было пустым и имело фоновую картинку, которая бы заменялась при наведении на компонент... для текстового поля это делается вот так...
Info.Caption := 'Наведите на компонент, чтобы получить дополнительную информацию';
а для картинки... научите, пожалуйста.
Сразу спасибо.

El Sanchez
11-10-2013, 10:59
Существует программа (не моя) и установщик находит к ней путь по AppId .
Далее, программа установки дополняет существующую программу файлами (при этом совершенно не трогая ни один фаил программы)... и создает файлы для удаления (Unninst).
Если воспользоваться Unninst.exe, то все дополненные файлы удаляются как надо, но и по AppId установщик эту программу перестает находить... есть ли способ этого избежать? »
Mat_y, я так понимаю патч какой-то делаете или что-то вроде того. Тут можно двумя путями пойти. Первый - это патч создает деинсталлятор и не регистрирует себя в ветке реестра AppId программы, тогда при удалении и файлы удалятся те, что надо, и реестровые записи сохранятся. Для этого всего лишь нужно в секции Setup директиву CreateUninstallRegKey установить в no. В апплете Установка и удаление программ патч, разумеется, не будет фигурировать. Второй - если очень хочется и через апплет удаление делать, то патч должен использовать свою ветку регистрации, не затрагивая программную.

Mat_y
11-10-2013, 11:37
CreateUninstallRegKey установить в no »
Если я поставлю CreateUninstallRegKey = no, то тогда же не будет запоминаться список установленных уже компонентов или будет? (Я имею ввиду при повторном запуске установщика)

El Sanchez
11-10-2013, 12:04
Если я поставлю CreateUninstallRegKey = no, то тогда же не будет запоминаться список установленных уже компонентов или будет? »
Mat_y, компонентов патча? Нет, не будет. Выбирайте второй метод, это обычная практика.

Mat_y
11-10-2013, 12:36
Выбирайте второй метод »
Я понимаю, что пользуюсь добротой, но не могли бы Вы помочь с созданием своей ветки регистрации, а то у меня не никак не получается.... может быть дело в том, что я использую AppId?

El Sanchez
11-10-2013, 12:45
может быть дело в том, что я использую AppId? »
Mat_y, используйте отличный от AppId программы идентификатор для патча. Если AppId у программы это GUID ({...}-вида), то для патча сгенерите другой. Если AppId у программы, например, MyProgram, то для патча пишете, например, MyProgramPatch.

Mat_y
11-10-2013, 13:35
привязывает поле с картинкой к полю с компонентами.... я бы хотел это поле разместить на странице с выбором компонентов вверху, отдельно от поля со списком компонентов.
Пока я придумал только
Код:
Parent := WizardForm.MainPanel;
Но это не вариант, т.к. добавляет оэто поле на все траницы... что прописать, чтобы затронуть только страницу с выбором компонентов? »
Проблему решил, прописав правило:
if CurPageID=wpSelectComponents then

begin
InitializeWizard5();
end;
Может кому пригодится.


Mat_y, используйте отличный от AppId программы идентификатор для патча. Если AppId у программы это GUID ({...}-вида), то для патча сгенерите другой. »
Я совсем ламер в этих делах, Вы мне можете написать пример?

Ну и остался вопрос, можно как-то сделать, чтобы изначально поле под картинку для компонента не было пустым?

El Sanchez
11-10-2013, 21:14
Я совсем ламер в этих делах, Вы мне можете написать пример? »
Пример в справке (http://jrsoftware.org/ishelp/topic_setup_appid.htm).
Ну и остался вопрос, можно как-то сделать, чтобы изначально поле под картинку для компонента не было пустым? »
На примере предыдущего кода:

...
procedure ComponentsListOnMouseLeave(Sender: TObject);
begin
InfoBMP.Bitmap := I_BMP[0]; // 0-ая картинка по умолчанию
end;

procedure InitializeWizard();
var
i : Integer;
begin
...
OnItemMouseMove := @ComponentsListItemMouseMove;
OnMouseLeave := @ComponentsListOnMouseLeave;
...
InfoBMP.Bitmap := I_BMP[0]; // 0-ая картинка по умолчанию
end;




© OSzone.net 2001-2012