Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Автоматическая установка приложений (http://forum.oszone.net/forumdisplay.php?f=61)
-   -   Скрипты Inno Setup. Помощь и советы [часть 4] (http://forum.oszone.net/showthread.php?t=218969)

El Sanchez 29-08-2011 18:01 1741842

Скрипты Inno Setup. Помощь и советы [часть 4]
 
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
Inno Setup. Прочие вопросы.


Показать/скрыть: Справка, руководство, примеры:
Показать/скрыть: Ссылки на примеры скриптов:
Показать/скрыть: Дополнительные программы для Inno Setup:
  • ISTool - неплохой редактор скриптов Inno Setup.
    Последняя версия: 5.3.0.1 [29.09.2009] - Скачать | зеркало;

  • Inno Script Generator - генератор скриптов Inno Setup. Обладает некоторыми полезными функциями, которых нет ни у самого Inno Setup, ни у ISTool.
    Последняя версия: 1.0.3.1 [23.03.2008] - Скачать | зеркало на русифицированную программу;
    Примечание: Родной сайт www.hisoft2000.de более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы.
    Последняя версия: 2.0.8 [12.11.2006] - Скачать;
    Примечание: Родной сайт http://isfd.kaju74.de/index.php?isfd более недоступен, поэтому здесь расположены сторонние ссылки.

  • Inno Setup GameScript Generator - программа генерирует скрипты для Inno Setup . С помощью GameScript Generator и Inno Setup вы сможете быстро создать простенький инсталляционный пакет для любой игры. В инсталлятор можно встроить музыку, слайдшоу и фоновый рисунок. Для специалистов созданный скрипт, возможно, будет неплохой заготовкой для дальнейшей модернизации;

  • ISSkin - Программа для создания и добавления в инсталлятор скинов. Инструкция.
    Последняя версия: 3.0.0.0 [19.01.2010] - Скачать;

  • ISSJoiner - Программа для объединения нескольких скриптов InnoSetup в один.
    Последняя версия: 3.0 [23.07.2009]

  • Converter - Программа конвертирует reg-файлы в формат *.iss (формат скриптов Inno Setup).
    Последняя версия: 0.1.4 [13.03.2010] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:
Inno Setup [все вопросы] часть 1
Inno Setup [все вопросы] часть 2
Скрипты Inno Setup. Помощь и советы [часть 3]


Продолжение обсуждения
Скрипты Inno Setup. Помощь и советы [часть 5]

antuan 31-08-2011 11:33 1743106

Добрый день! Столкнулся вот с такой проблемой:

Использую установщик на Inno Setup для приложения. Оно содержит исполняемый файл и прочие папки. Для их установки использую стандартный Install - тег Files, атрибуты Source, DestDir. И стандартный UnInstall.

И он не удаляет подпапки в одной из папок. То есть папки с файлами удаляет, а в папках с файлами и вложенными папками удаляет только файлы, располагающиеся непосредственно в этой папке, а подпапки и файлы в них - не удаляет.

Пробовал указать эту папку (которая содержит неудаляющиеся подпапки) в UninstallDelete - эту папку стал удалять, но перестал удалять все остальные - те, что поставил инсталлятор. Указывать вообще все в InstallDelete не могу, так как устанавливаемые файлы ставятся в зависимости от Task-ов, поэтому на момент удаления в лоб не узнать, надо удалять файл или нет - очень подходил способ, когда удалялись те файлы, которые были установлены, но тогда возникает неудаление подпапок.

Может кто-нибудь знает, как можно настроить удаление в моем случае, спасибо.

P.S. Inno Setup 5.1.4 (ISPP 5.1.2.0)

Pinci69 02-09-2011 20:24 1744935

Kizekil

Есть ответы на твои вопросы,очисть свои входящие сообщения,не принимает твой ящик.Очистишь отпишись.Пришлю сразу.

Pinci69 03-09-2011 13:17 1745222

Для Kizekil
№Как поменять цвет шрифта?Код можно?"

Дэниэл Вайсс 04-09-2011 12:28 1745822

Приветствую, существует рипаг Duke Nukem Forever (2011) [Action (Shooter) / 3D / 1st Person] Multi 2 / Rus {RePack от R.G.ReCoding​}. В нём есть переработанная страница компонентов. Наведя курсор на любой из компонентов, в правом окне, появляется описание этого компонента. Мне очень нужен такой скрипт установки или код. Заранее благодарен.

Akella2007 08-10-2011 18:05 1768793

Подскажите, а как в Innosetup зарегистрировать в windows своё расширение файла?

Vrn 26-10-2011 14:05 1782118

Подскажите, есть ли возможность убрать картинку WizModernSmallImage.bmp из инсталятора? Только не предлагайте закрасить её через фотошоп в цвет #ffffff, чтобы она была незаметна. И ещё вопрос, при выборе директории установки показывает только жесткие и съёмные диски, как можно туда добавить рабочий стол, отображение всех папок рабочего стола, библиотеки, сеть, папку пользователя. В общем нужно сделать также как и в Smart Install Maker.

volk1234 26-10-2011 18:12 1782302

У темы новый куратор - El Sanchez
Благодарим Serega за его огромный вклад и помощь в области Inno Setup.

valyok666 26-10-2011 18:14 1782309

volk1234, спасибо ему)и вам(и всем админам в том числе) за отличный форум)

volk1234 26-10-2011 18:19 1782314

Поправлюсь, благодарить не в теме пожалуйста :)
Если хотите в РМ.
ЗЫ: На таких людях как Serega держатся все хорошие начинания. Форум держится на пользователях, активных участниках и только в меньшей части на модераторах и администраторах (мы лишь обслуживаем его).

Vrn 26-10-2011 23:10 1782522

Не в той теме задал вопрос, если есть возможность подскажите пожалуйста.

Цитата:

Есть ли возможность убрать картинку WizModernSmallImage.bmp из инсталятора? Только не предлагайте закрасить её через фотошоп в цвет #ffffff, чтобы она была незаметна. И ещё вопрос, при выборе директории установки показывает только жесткие и съёмные диски, как можно туда добавить рабочий стол, отображение всех папок рабочего стола, библиотеки, сеть, папку пользователя. В общем нужно сделать также как и в Smart Install Maker.

valyok666 26-10-2011 23:26 1782533

Vrn,
скрытие WizardSmallImage
читать дальше »

procedure InitializeWizard();
begin with WizardForm.WizardSmallBitmapImage do begin Hide;
end;
end;


Дерево дисков и папок
читать дальше »

[code]
var
TDV: TFolderTreeView;
TFV: TStartMenuFolderTreeView;

procedure TDVOnChange(Sender: TObject);
begin
WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'MyApp';
end;

procedure TFVOnChange(Sender: TObject);
begin
WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'MyApp';
end;

procedure InitializeWizard();
begin
TDV:= TFolderTreeView.Create(WizardForm);
TDV.Top:= WizardForm.DirEdit.Top+28;
TDV.Width:= 417;
TDV.Height:= 100;
TDV.OnChange:= @TDVOnChange;
TDV.Parent:= WizardForm.SelectDirPage;


TFV:= TStartMenuFolderTreeView.Create(WizardForm);
TFV.Top:= WizardForm.GroupEdit.Top+28;
TFV.Width:= 417;
TFV.Height:= 100;
TFV.SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{us erstartup}'),ExpandConstant('{commonstartup}'));
TFV.OnChange:= @TFVOnChange;
TFV.Parent:= WizardForm.SelectProgramGroupPage;
end;

Vrn 27-10-2011 00:11 1782571

valyok666, спасибо огромнейшее. С картинкой проблем не было, а вот с деревом ошибки начали вылетать. В общем я отписал в скайп.

Gugle 27-10-2011 10:17 1782733

Доброго времени суток!

Подскажите пожалуйста как сделать обновление программы, если она уже установлена?

Есть функция, что ни буть типа lastPos('by', str);, кторая возвращает позицию последнего вхождения соответствия в строку символа или писать ручками?
P.S.
Где то встречал тему, но никак не могу найти. Буду благодарен за подсказку.

El Sanchez 27-10-2011 15:38 1782971

Цитата:

Цитата Gugle
Подскажите пожалуйста как сделать обновление программы, если она уже установлена? »

Gugle, Upgrades

Цитата:

Цитата Gugle
возвращает позицию последнего вхождения соответствия в строку »

читать дальше »

Код:

function StrRStrI(pszSource, pszLast, pszSrch: PChar): PChar; external 'StrRStrIA@shlwapi.dll stdcall';

//
function LastPos(SubStr, S: String): Integer;
begin
    Result := Length(S) - Length(StrRStrI(S, '', SubStr)) + 1;
    if Result = Length(S) + 1 then Result := 0;
end;

procedure InitializeWizard();
var
    i: integer;
begin
    i := LastPos('hf', 'rttrhf657hf6544');
end;


Gugle 27-10-2011 15:45 1782975

El Sanchez, спасибо!

Решил установить :
Цитата:

Расширенная версия Inno Setup от Restools, собрана на основе версии 5.4.2.
В нем есть графический редактор страниц (wizardForm designer). В него можно добавить новое окно (Menu-->Desiner-->Inser a WizardPage). А как удалить это окно после добавления?

valyok666 27-10-2011 16:04 1782991

Gugle, замени на PansiChar

Sotonisto 28-10-2011 09:57 1783475

Есть вот такой скрипт (отписывался в предыдущей теме). Я хочу добавить 2 кнопки (свернуть и закрыть) без использования ботвы.
Вот порылся в примерах и нашел это:
читать дальше »
Код:

[_Code]
function ReleaseCapture(): Longint; external 'ReleaseCapture@user32.dll stdcall';

const
  WM_SYSCOMMAND = $0112;

var
  CaptionPanel:Tpanel;
  MinimizeBtn,CloseBtn:TButton;

procedure MinimizeBtnClick(Sender:TObject);
begin
  SendMessage(WizardForm.Handle,WM_SYSCOMMAND,61472,0);
end;

procedure CloseBtnClick(Sender:TObject);
begin
  WizardForm.Close;
end;

procedure LabelOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture
  SendMessage(WizardForm.Handle, WM_SYSCOMMAND, $F012, 0)
end;

procedure InitializeWizard;
var
  d:integer;
begin
CaptionPanel:=TPanel.Create(WizardForm);
  with CaptionPanel do begin
    Parent:=WizardForm;
    Height:=22;
    Width:=WizardForm.Width;
    Align:=alTop;
    ParentColor:=True;
    Color:=$000000;
    BevelInner:=bvNone;
    BevelOuter:=bvNone;
  end;

  with TLabel.Create(CaptionPanel) do begin
    Parent:=CaptionPanel;
    Transparent:=True;
    Autosize:=False;
    Top:=0;
    Left:=0;
    Width:=CaptionPanel.Width;
    Height:=CaptionPanel.Height;
    OnMouseDown:=@LabelOnMouseDown;
  end;

  CloseBtn:=TButton.Create(CaptionPanel);
  with CloseBtn do begin
    Parent:=CaptionPanel;
    Height:=20;
    Width:=20;
    Top:=(CaptionPanel.Height-Height) div 2;
    Left:=CaptionPanel.Width-Width-d;
    Font.Name:='Arial'
    Caption:='X';
    OnClick:=@CloseBtnClick;
  end;

  MinimizeBtn:=TButton.Create(CaptionPanel);
  with MinimizeBtn do begin
    Parent:=CaptionPanel;
    Height:=20;
    Width:=20;
    Top:=(CaptionPanel.Height-Height) div 2;
    Left:=CaptionPanel.Width-Width-CloseBtn.Width-d-2;
    Font.Name:='Arial'
    Caption:='_';
    OnClick:=@MinimizeBtnClick;
  end;
end;


Если его добавить в скрипт инстала получится это:

Возникли 2 вопроса:
1. Как сделать прозрачным черную полосу (например через Transparent и тд.)?
2. Как:
а) заменить кнопки на изображения (я думаю, вы уже поняли, что "_" и "Х" - это нижнее подчеркивание и икс)?
б) или наложить текстуры?

Edison007 28-10-2011 12:20 1783577

Цитата:

Цитата Sotonisto
1. Как сделать прозрачным черную полосу (например через Transparent и тд.)? »

Удали её и укажи кнопкам родителя не CaptionPanel, а WizardForm

Цитата:

Цитата Sotonisto
2. Как:
а) заменить кнопки на изображения (я думаю, вы уже поняли, что "_" и "Х" - это нижнее подчеркивание и икс)?
б) или наложить текстуры? »

A) Можно вместо кнопок использовать бмп изображение, и указать на него действие при нажатии.
B) лучше через ботву, но можно написать скрипт текстуирования кнопок через бмп, на примере скрипта от Shegorat

El Sanchez 28-10-2011 17:02 1783768

Цитата:

Цитата Sotonisto
Я хочу добавить 2 кнопки (свернуть и закрыть) без использования ботвы »

Sotonisto, можно вместо панелей и лабелов использовать компонент TNewSpeedButton, как раз тот случай, и использовать нормальные глифы вместо "_" и "Х". Пример сочинять сейчас некогда, посмотрите на реализацию в Example_TNewSpeedButton_1.iss и Example_TNewSpeedButton_2.iss в примерах от Restools.

ARS_23 28-10-2011 22:33 1783949

Цитата:

Цитата Дэниэл Вайсс
Наведя курсор на любой из компонентов, в правом окне, появляется описание этого компонента »

как-то так вроде

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

[CustomMessages]
english.ComponentsName1=My program™
russian.ComponentsName1=Моя программа™
english.ComponentsName1_1=English version
russian.ComponentsName1_1=Английская версия
english.ComponentsName1_2=Russian version
russian.ComponentsName1_2=Русская версия
english.ComponentsName2=Help
russian.ComponentsName2=Помощь
english.ComponentsName2_1=Documentation
russian.ComponentsName2_1=Документация
english.ComponentsName2_2=User manual
russian.ComponentsName2_2=Руководство пользователя
english.ComponentsInfoPanel1=Description
russian.ComponentsInfoPanel1=Описание
english.ComponentsInfoPanel2=Direct the cursor a mouse on component to read his description.
russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.
english.ComponentsDescription1=Necessarily is fixed
russian.ComponentsDescription1=Устанавливается обязательно
english.ComponentsDescription2=Install english version
russian.ComponentsDescription2=Установить английскую версию
english.ComponentsDescription3=Install russian version
russian.ComponentsDescription3=Установить русскую версию
english.ComponentsDescription4=Help
russian.ComponentsDescription4=Помощь
english.ComponentsDescription5=Read documentation
russian.ComponentsDescription5=Прочитать документацию
english.ComponentsDescription6=Read user manual
russian.ComponentsDescription6=Прочитать руководство пользователя

[Components]
Name: main; Description: {cm:ComponentsName1}; Types: full custom; Flags: fixed
Name: main\english; Description: {cm:ComponentsName1_1}; Flags: exclusive
Name: main\russian; Description: {cm:ComponentsName1_2}; Flags: exclusive
Name: help; Description: {cm:ComponentsName2}; Types: full custom
Name: help\documentation; Description: {cm:ComponentsName2_1}; Types: full custom
Name: help\manual; Description: {cm:ComponentsName2_2}; Types: full custom

[Files]
Source: "MyProg.exe"; DestDir: "{app}"; Components: main
Source: "MyProg.chm"; DestDir: "{app}"; Components: help
Source: "descctrl.dll"; Flags: dontcopy

[Messages]
ComponentsDiskSpaceMBLabel=

[code]
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;


и это есть в справке. иногда полезно туда заглядывать

Devils Night 29-10-2011 09:32 1784146

Цитата:

Цитата Дэниэл Вайсс
Наведя курсор на любой из компонентов, в правом окне, появляется описание этого компонента. »

Вот держи

Код:

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Components]
Name: "program"; Description: "Игра"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Помощь"; Types: full
Name: "Text"; Description: "Tехт"; Types: full
Name: "Text\en"; Description: "Aнглийский"; Flags: exclusive
Name: "Text\de"; Description: "Немецкий"; Flags: exclusive
Name: "Text\cn"; Description: "Китайский"; Flags: exclusive
Name: "Text\ru"; Description: "Русский"; Flags: exclusive
Name: "Voice"; Description: "Озвучка"; Types: full
Name: "Voice\en"; Description: "Английская"; Flags: checkablealone
Name: "Voice\de"; Description: "Немецкая"; Flags: checkablealone
Name: "Voice\ch"; Description: "Китайская"; Flags: checkablealone
Name: "Voice\ru"; Description: "Русская"; Flags: checkablealone
Name: "Voice\ru2"; Description: "Русская"; Flags: checkablealone
Name: "Voice\ru3"; Description: "Русская"; Flags: checkablealone

[Files]
Source: compiler:Dll Pack\descctrl.dll; Flags: dontcopy

 [ Code]
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 := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);

  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;
  InfoPanel.Left := ScaleX(216);
  InfoPanel.Width := ScaleX(200);
  InfoPanel.Height := WizardForm.ComponentsList.Height;
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;
  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := 'Информация:';
  InfoCaption.Left := ScaleX(224);
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);
  InfoCaption.Font.Color := clActiveCaption;
  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188);
  Info.Top := ScaleY(12);
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
  Info.Caption := 'Наведите на компонент, чтобы получить дополнительную информацию';
  Info.WordWrap := true;
  enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
      'Короткое описание игры;'+
      'Дополнительная документация, на разных языках;'+
      'Техт игры;'+
      'Официальный английский текст от EA Games;'+
      'Официальный немецкий текст от неизвестного производителя;'+
      'Пиратский китайский текст;'+
      'Официальный русский текст от софтклаб;'+
      'Озвучка игры;'+
      'Официальная английская озвучка от EA Games;'+
      'Официальная немецкая озвучка от неизвестного производителя;'+
      'Пиратская китайская озвучка;'+
      'Официальная русская озвучка от софтклаб;'+
      'Русская озвучка от 7Wolf;'+
      'Русская озвучка от фаргуса;'
      );
end;

оно самое, в правом окне.

Raf-9600 29-10-2011 13:38 1784259

Собстно есть код для конвертирования OGG, с полноценным прогресс-баром. А ктонить мог бы прикрутить к нему возможность, чтоб прогресс отображался не только в окне инсталлятора, но и на самой иконке инсталлятора, в панели задач (таскбаре)? Речь идет о Win7.

Собстно код:
читать дальше »
[C0de]
var
Files: Array of String;
S: String;
n: Integer;

Function StringToArray(Text, Cut: String): array of String; var i, k: Integer;
Begin
SetArrayLength(Result, 0); if Cut = '' then Cut:= #1310; //если шаблон пуст, считаем переводы строк
Repeat k:= Pos(Cut,Text);
if k = 1 then begin Delete(Text, 1, Length(Cut)); CONTINUE
end;
SetArrayLength(Result, GetArrayLength(Result) +1); i:= GetArrayLength(Result) -1;
if k = 0 then
Result[i]:=Text
else begin
Result[i]:= Copy(Text, 1, k -1); Delete(Text, 1, Length(Result[i]) + Length(Cut));
end;
Until Length(Text) * k = 0;
End;

procedure FindFiles(FromDir: String; Mask: String);
var FSR, DSR: TFindRec; FindResult: Boolean;
begin
FindResult:= FindFirst(AddBackslash(FromDir)+Mask, FSR)
while FindResult do begin
if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then begin
S:= S + AddBackslash(fromDir) + FSR.Name +'|';
end;
FindResult:= FindNext(FSR);
end;
FindResult:= FindFirst(AddBackslash(FromDir)+ '*.*', DSR)
while FindResult do begin
if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then begin
FindFiles(AddBackSlash(FromDir)+DSR.Name, Mask)
end;
FindResult:= FindNext(DSR);
end;
FindClose(FSR); FindClose(DSR)
end;

procedure RecodeOgg;
var ResultCode: integer; CurFile: String;
begin
FindFiles(ExpandConstant('{app}'), '*.ogg') //Находим все файлы по маске, в выбранной папке
Files:= StringToArray(S, '|') //Переводим в массив
WizardForm.ProgressGauge.Max:= GetArrayLength(Files)-1; //Получаем кол-во файлов
WizardForm.ProgressGauge.Position:=0
for n:=(GetArrayLength(Files)-1) downto 0 do begin
CurFile:= Files[n]
StringChange(CurFile, AddBackslash(ExpandConstant('{app}')), '')
Exec(ExpandConstant('{app}\oggdec.exe'), '-Q '+AddQuotes(CurFile), '', SW_Hide, EwWaitUntilTerminated, ResultCode) //Для каждого файла запускаем декодер
DeleteFile(Files[n]) //Удаляем ненужный файл
WizardForm.FilenameLabel.Caption:= Files[n]; //Двигаем прогрессбар
WizardForm.ProgressGauge.Position:= WizardForm.ProgressGauge.Position +1;
end;
DeleteFile(ExpandConstant('{app}\oggdec.exe'))
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssPostInstall then RecodeOgg;
end;

Raf-9600 29-10-2011 13:54 1784267

И ещё такой вопрос: есть ли у когонить код, реализующий возможность "вручную" передвигать прогресс-бар? Ну тоесть после распаковки файлов, у меня происходит 10 манипуляций с ними. Как сделать чтобы после каждой "манипуляции", полоска прогресс-бара увеличивалась?

P.S.
Нужен не второй прогресс-бар, а чтоб все происходило в стандартном, после распаковки файлов.

Gnom_aka_Lexander 29-10-2011 20:21 1784493

Цитата:

Цитата Raf-9600
"вручную" передвигать прогресс-бар? »

WizardForm.ProgressGauge.Position:=(тут увеличиваеш позицию после каждого действия).
Пример:
Действие
WizardForm.ProgressGauge.Position:=10;
Действие
WizardForm.ProgressGauge.Position:=20;
Действие
WizardForm.ProgressGauge.Position:=30;
............................
Последняя позиция должна равнятся максимальному значению прогрессбара:
WizardForm.ProgressGauge.Position:=WizardForm.ProgressGauge.Max;

Raf-9600 30-10-2011 01:19 1784705

Лександер, А как его "задействовать"?
Когда указываю так, то ничего не работает. Прогресс-бар тупо сбрасывается "на ноль", и все.

[Run]
Filename: "{app}\binkmix.exe"; StatusMsg: "MyProgress1"; AfterInstall: MyProgress1;
Filename: "{app}\binkmix.exe"; StatusMsg: "MyProgress2"; AfterInstall: MyProgress2;
Filename: "{app}\binkmix.exe"; StatusMsg: "MyProgress3"; AfterInstall: MyProgress3;
Filename: "{app}\binkmix.exe"; StatusMsg: "MyProgress4"; AfterInstall: MyProgress4;

[C0de]
procedure MyProgress1;
begin
WizardForm.ProgressGauge.Position:=10
end;

procedure MyProgress2;
begin
WizardForm.ProgressGauge.Position:=20
end;

procedure MyProgress3;
begin
WizardForm.ProgressGauge.Position:=30
end;

procedure MyProgress4;
begin
WizardForm.ProgressGauge.Position:=40
end;

Rikill 30-10-2011 01:53 1784719

Raf-9600, а ты точно тот прогресс бар указываешь? Всмысле у тебя не кастомный он?

LinkOFF 30-10-2011 13:44 1784894

Всем добрый день!У меня такая проблема:
Я задаю в скрипте isdone я задаю для распаковки precomp'a файл cas_01.cas а он распаковывает data1 без расширения
Вот скрипт, если че можете кто нибудь поправить http://rghost.ru/27751441

Devils0411 30-10-2011 14:49 1784966

Цитата:

Devils0411, код не распаковывается а дизассемблируется, лежит там же
Так проблема в том, что код неполный. При сборки обратно (При этом никакие изменения в iss файл не вносились) выдает кучу ошибок. Вот и хотелось бы увидеть полный код этого файла.
Да и кто-то писал на форуме, что при дизассемблировании установочного файла на основе Inno, часть кода теряется.

Tixo 30-10-2011 15:57 1785017

народ а кто поможет прикрутить эти компоненты, к этому скрипту http://rghost.ru/27770621

Код:

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

[CustomMessages]
english.ComponentsName1=My program™
russian.ComponentsName1=Моя программа™
english.ComponentsName1_1=English version
russian.ComponentsName1_1=Английская версия
english.ComponentsName1_2=Russian version
russian.ComponentsName1_2=Русская версия
english.ComponentsName2=Help
russian.ComponentsName2=Помощь
english.ComponentsName2_1=Documentation
russian.ComponentsName2_1=Документация
english.ComponentsName2_2=User manual
russian.ComponentsName2_2=Руководство пользователя
english.ComponentsInfoPanel1=Description
russian.ComponentsInfoPanel1=Описание
english.ComponentsInfoPanel2=Direct the cursor a mouse on component to read his description.
russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.
english.ComponentsDescription1=Necessarily is fixed
russian.ComponentsDescription1=Устанавливается обязательно
english.ComponentsDescription2=Install english version
russian.ComponentsDescription2=Установить английскую версию
english.ComponentsDescription3=Install russian version
russian.ComponentsDescription3=Установить русскую версию
english.ComponentsDescription4=Help
russian.ComponentsDescription4=Помощь
english.ComponentsDescription5=Read documentation
russian.ComponentsDescription5=Прочитать документацию
english.ComponentsDescription6=Read user manual
russian.ComponentsDescription6=Прочитать руководство пользователя

[Components]
Name: main; Description: {cm:ComponentsName1}; Types: full custom; Flags: fixed
Name: main\english; Description: {cm:ComponentsName1_1}; Flags: exclusive
Name: main\russian; Description: {cm:ComponentsName1_2}; Flags: exclusive
Name: help; Description: {cm:ComponentsName2}; Types: full custom
Name: help\documentation; Description: {cm:ComponentsName2_1}; Types: full custom
Name: help\manual; Description: {cm:ComponentsName2_2}; Types: full custom

[Files]
Source: "MyProg.exe"; DestDir: "{app}"; Components: main
Source: "MyProg.chm"; DestDir: "{app}"; Components: help
Source: "descctrl.dll"; Flags: dontcopy

[Messages]
ComponentsDiskSpaceMBLabel=


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;


LinkOFF 30-10-2011 16:03 1785020

И что нужно прописать в скрипте чтоб когда запускался setup.exe выводилось сообщение о том что такая программа уже есть и предлагалось удалить программу?

Rikill 30-10-2011 16:05 1785024

LinkOFF, думаем головой и лезем в справку от Krinkels.

LinkOFF 30-10-2011 16:07 1785027

Цитата:

Цитата Rikill
LinkOFF, думаем головой и лезем в справку от Krinkels. »

я уже перепробовал все, уже 2 часа сижу и у меня из файла data1.pcf распаковывается файл data1(без расширения), а должен cas_01.cas

insombia 30-10-2011 16:27 1785046

LinkOFF значит ты папку запаковал а не сам файл

LinkOFF 30-10-2011 16:30 1785052

Цитата:

Цитата insombia
LinkOFF значит ты папку запаковал а не сам файл »

не я чисто файл паковал

insombia, можешь скрипт посмотреть http://rghost.ru/27751441

insombia 30-10-2011 16:32 1785054

Цитата:

Цитата LinkOFF
не я чисто файл паковал »

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

valyok666 30-10-2011 16:36 1785058

LinkOFF,
читать дальше »
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\Data\data1.pcf'), ExpandConstant('{app}\cas_01.cas'), true

insombia 30-10-2011 16:42 1785062

valyok666 у него так и указано там просто у него указано даже cas_01.cas и так далее которое кажись указывать не нужно
читать дальше »
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data1.bin'), ExpandConstant('{app}\Data'), false, '', '', ExpandConstant('{app}'), PCFonFLY) then break;
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\Data\data1.pcf'), ExpandConstant('{app}\Data\cas_01.cas'), true ) then break;
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\Data\data2.pcf'), ExpandConstant('{app}\Data\cas_02.cas'), true ) then break;
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\Data\data3.pcf'), ExpandConstant('{app}\Data\cas_03.cas'), true ) then break;


LinkOFF попробуй указать так
читать дальше »
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\Data\data1.pcf'), ExpandConstant('{app}\Data), true ) then break;
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\Data\data2.pcf'), ExpandConstant('{app}\Data'), true ) then break;
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\Data\data3.pcf'), ExpandConstant('{app}\Data'), true ) then break;

LinkOFF 30-10-2011 16:45 1785066

я создавал precomp'ом 0.4.2 а в isdone 0.4. precomp 0.4 сможет распаковать архив сделанный 0.4.2?

valyok666 30-10-2011 16:45 1785067

insombia, так он хочет выходной файл без папки или с папкой?

LinkOFF 30-10-2011 16:47 1785069

Цитата:

Цитата valyok666
insombia, так он хочет выходной файл без папки или с папкой? »

без папки

а есть isdone с precomp'ом 0.4.2?

ARS_23 30-10-2011 16:51 1785071

Цитата:

Цитата LinkOFF
я создавал precomp'ом 0.4.2 а в isdone 0.4. precomp 0.4 сможет распаковать архив сделанный 0.4.2? »

вот в этом то и проблема)))

Цитата:

Цитата LinkOFF
а есть isdone с precomp'ом 0.4.2? »

тут

LinkOFF 30-10-2011 16:53 1785074

Цитата:

Цитата ARS_23
можно попробовать самому добавить »

я добавил, переименовал в precomp04 и вставил packjpg_dll.dll туда

простым 0.4 он говорил типа архив не был создан precomp'ом 0.4

я скачал IsDone_0.5f и попробовал там и у меня получилось, а в моем скрипте не идет

ARS_23 30-10-2011 16:57 1785080

LinkOFF,
сам не можешь обновить свой скрипт?

LinkOFF 30-10-2011 16:59 1785085

Цитата:

Цитата ARS_23
сам не можешь обновить свой скрипт? »

уже обновляю

но чего-то не получается

ARS_23 30-10-2011 17:07 1785094

LinkOFF,
дай скрипт. я обновлю

LinkOFF 30-10-2011 17:08 1785095

ARS_23, если можешь то соедени пожалуйста, буду искренне благодарен http://rghost.ru/27780851

ARS_23 30-10-2011 17:10 1785099

LinkOFF,
как сделаю-кину в лс ссылку

LinkOFF 30-10-2011 17:39 1785120

ARS_23, вот че пишет

А все не надо.я сам ошибку нашел

Rikill 30-10-2011 23:15 1785334

Цитата:

Цитата LinkOFF
И что нужно прописать в скрипте чтоб когда запускался setup.exe выводилось сообщение о том что такая программа уже есть и предлагалось удалить программу? »

Я про это говорил.

Devils Night 31-10-2011 06:10 1785451

Цитата:

Цитата Tixo
народ а кто поможет прикрутить эти компоненты, к этому скрипту http://rghost.ru/27770621 »

Лови

nik1967 31-10-2011 08:32 1785478

Цитата:

Цитата LinkOFF
И что нужно прописать в скрипте чтоб когда запускался setup.exe выводилось сообщение о том что такая программа уже есть и предлагалось удалить программу? »

Как то так

Gugle 31-10-2011 12:46 1785614

Цитата:

Цитата nik1967
Как то так »

А у меня архивчик не распаковался, сказал, что неверно упакован.

Скажите пожалуйста, можно как нить проверить окно "родилось" или нет?
Что то типа:
Код:

[_code]
var
    UnInstallPage: TWizardPage;

...

FUNCTION NextButtonClick(CurPageID: Integer): Boolean;
begin
  if UnInstallPage = null then begin
    MsgBox('Окошко не родилось.', mbConfirmation, mb_Ok);
  end else begin
    MsgBox('Окошко родилось.', mbConfirmation, mb_Ok);
  end;
end;


nik1967 31-10-2011 12:54 1785626

Цитата:

Цитата Gugle
А у меня архивчик не распаковался, сказал, что неверно упакован. »

Оффтоп конечно сие, но нужно обновлять архиваторы. Данный архив упакован 7-zip 9.25 alpha (2011-09-16).

Tixo 31-10-2011 18:25 1785924

народ как сделать такие компоненты?(скрипт на 4 странице по-мойму)
http://fastpic.ru/view/30/2011/0905/...5caa8.jpg.html

insombia 31-10-2011 18:53 1785957

Tixo Inno DescCtrl v1.0

Devils Night 31-10-2011 19:56 1785995

Цитата:

Цитата Tixo
народ как сделать такие компоненты? »

Читай справку!!! Не ужели так трудно пробежаться по справке? И читай внимательно тему с первой страницы, уже вроде был такой вопрос.
Код из справки

Код:

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Components]
Name: "program"; Description: "Игра"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Помощь"; Types: full
Name: "Text"; Description: "Tехт"; Types: full
Name: "Text\en"; Description: "Aнглийский"; Flags: exclusive
Name: "Text\de"; Description: "Немецкий"; Flags: exclusive
Name: "Text\cn"; Description: "Китайский"; Flags: exclusive
Name: "Text\ru"; Description: "Русский"; Flags: exclusive
Name: "Voice"; Description: "Озвучка"; Types: full
Name: "Voice\en"; Description: "Английская"; Flags: checkablealone
Name: "Voice\de"; Description: "Немецкая"; Flags: checkablealone
Name: "Voice\ch"; Description: "Китайская"; Flags: checkablealone
Name: "Voice\ru"; Description: "Русская"; Flags: checkablealone
Name: "Voice\ru2"; Description: "Русская"; Flags: checkablealone
Name: "Voice\ru3"; Description: "Русская"; Flags: checkablealone

[Files]
Source: compiler:Dll Pack\descctrl.dll; Flags: dontcopy

 [ Code]
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 := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);

  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;
  InfoPanel.Left := ScaleX(216);
  InfoPanel.Width := ScaleX(200);
  InfoPanel.Height := WizardForm.ComponentsList.Height;
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;
  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := 'Информация:';
  InfoCaption.Left := ScaleX(224);
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);
  InfoCaption.Font.Color := clActiveCaption;
  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188);
  Info.Top := ScaleY(12);
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
  Info.Caption := 'Наведите на компонент, чтобы получить дополнительную информацию';
  Info.WordWrap := true;
  enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
      'Короткое описание игры;'+
      'Дополнительная документация, на разных языках;'+
      'Техт игры;'+
      'Официальный английский текст от EA Games;'+
      'Официальный немецкий текст от неизвестного производителя;'+
      'Пиратский китайский текст;'+
      'Официальный русский текст от софтклаб;'+
      'Озвучка игры;'+
      'Официальная английская озвучка от EA Games;'+
      'Официальная немецкая озвучка от неизвестного производителя;'+
      'Пиратская китайская озвучка;'+
      'Официальная русская озвучка от софтклаб;'+
      'Русская озвучка от 7Wolf;'+
      'Русская озвучка от фаргуса;'
      );
end;


Цитата:

Цитата nik1967
но нужно обновлять архиваторы. Данный архив упакован 7-zip 9.25 alpha »

У меня установлен 9.20, и все прекрасно распаковывает.

Damaks 01-11-2011 12:34 1786384

Инсталлятор может после установки сам себя скопировать? Данный код не работает:
Код:

FileCopy(ExpandConstant('{srcexe}'), 'C:\Test\test.exe', False);
Путь назначения берётся из переменной, которую вводят во время установки, поэтому в секции Run через "cmd.exe copy" не получится наверное. Хотя даже с фиксированными путями у меня не получалось скопировать, при любых вариацииях с кавычками (обрамление, экранирование) открывается дефолтная консоль и команда в неё не передаётся (при одном параметре она передаётся, при двух (источник/назначение) нет, при копировании вручную в консоль работает). Например:
Код:

Filename: {sys}\cmd.exe; Parameters: "copy ""C:\In\test.exe"" ""C:\To\test.exe"""; Flags: shellexec runascurrentuser nowait
Здесь по аналогии с рабочим примером другой консольной утилиты применил похожий синтаксис, экранирование кавычек и обрамление всей команды.

Но это к слову, т.к. путь ещё нужно передать, не приходилось этого делать. Танцы с бубном (.bat) не хочется использовать, кто знает, какая система защиты у пользователя стоит, может отдельно запросить разрешение на запуск батника, а это совершенно лишнее.

Gugle 01-11-2011 13:46 1786436

Доброго времени суток!

1. Подскажите как при использовании SHFileOperation.iss функции CopyDir показать ProgressBar в котором бы отображался процесс?

2. Можно как нибуть не только скопировать файлы, но и упаковать ее в архив?

kindza811 03-11-2011 15:04 1788058

Здравствуйте.Помогите мне пожалуйста сделать или дать скрипт на такой инсталлятор.

valyok666 03-11-2011 15:12 1788066

kindza811, никто тебе его не даст)делай сам)
там вроде рисованые картинки,ну остальное всё ботва)

Gugle 03-11-2011 17:36 1788147

Как принудительно кинуть установщик на страницу "Финиш"?
Так, что бы после этого скрипт завершил свою работу при любом варианте.

Можно как нибуть получить список файлов и папок в указанной папке?

З.Ы.
2 предыдущих вопроса все еще актуальны.

Rikill 03-11-2011 21:54 1788282

Gugle, когда именно надо кинуть установщик на финиш?

Sotonisto 04-11-2011 18:08 1788656

Всем доброго времени суток! У меня есть скрипт с наложением изображения на кнопки. Как можно сделать, чтобы у кнопки "Обзор" было отдельное изображение (например, button2.bmp)? Видел несколько примеров, но одни не работают, а другие - заменяют текстуры на всех кнопках :(

Rikill 04-11-2011 20:30 1788722

Sotonisto, накладывать, а не налаживать. Это не от слова лажа, а от слова класть! :read:
Скачать переделанное.
Если надо, то текст убери с кнопки "Обзор..." коммандой:
Код:

[Messages]
rus.ButtonWizardBrowse=



Всё для Вас. :)

Sotonisto 05-11-2011 03:37 1788910

Rikill, спасибо :)

Цитата:

Цитата Rikill
накладывать, а не налаживать. Это не от слова лажа, а от слова класть! »

Прошу прощения. У меня в школе не преподавали русский язык (за исключением уроков русской литературы) и на работе почти вся документация на украинском :(
Но впредь буду более внимательным.

VASYAKRN 05-11-2011 11:58 1789002

у кого имеются Ukrainian.isl

insombia 05-11-2011 19:02 1789214

VASYAKRN у меня

VASYAKRN 05-11-2011 19:12 1789222

insombia, У меня уже есть
спасиба

oxsa91 05-11-2011 20:05 1789256

Ошибки при установке inno setup'ом
 
Есть небольшое приложение, и созданый под него инсталятор. Должно все устанавливаться в IIS7. Раньше работала с IIS6, проблем не возникало а теперь пишет вот это

Код:

  C:\DOCUME~1\9335~1\LOCALS~1\Temp\2\is-GJ8K0.tmp>powershell -command "Set-Executi  onPolicy RemoteSigned -Scope CurrentUser"   
C:\DOCUME~1\9335~1\LOCALS~1\Temp\2\is-GJ8K0.tmp>powershell -File "C:\DOCUME~1\93  35~1\LOCALS~1\Temp\2\is-GJ8K0.tmp/IIS7_0_6_0.ps1" 
Начата регистрация ASP.NET (4.0.30319) в W3SVC/. 
Завершена регистрация ASP.NET (4.0.30319) в W3SVC/. 
Нельзя вызвать метод для выражения со значением NULL.
 C:\Documents and Settings\Администратор\Local Settings\Temp\2\is-GJ8K0.tmp\IIS7  _0_6_0.ps1:11 знак:30 
+ $id = $webServer.Path.Replace <<<< ("IIS://localhost/W3SVC/", "")     
+ CategoryInfo          : InvalidOperation: (Replace:String) [], RuntimeEx    ception     
+ FullyQualifiedErrorId : InvokeMethodOnNull   
Сервер сценариев Windows (Microsoft R) версия 5.6  c
Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.     

ErrNumber: -2147463168 (0x80005000)
 Error Trying To Get the Object: W3SVC/ 
Сервер сценариев Windows (Microsoft R) версия 5.6  c
Корпорация Майкрософт (Microsoft Corp.), 1996-2001.
Все права защищены.     

ErrNumber: -2147463168 (0x80005000) 
Error Trying To Get the Object: W3SVC//root 
Сервер сценариев Windows (Microsoft R) версия 5.6  c
Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.     

ErrNumber: -2147463168 (0x80005000) 
Error Trying To Get the Object: W3SVC//root 
Сервер сценариев Windows (Microsoft R) версия 5.6  c
Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.     

ErrNumber: -2147463168 (0x80005000) 
Error Trying To Get the Object: W3SVC//root 
Сервер сценариев Windows (Microsoft R) версия 5.6  c
Корпорация Майкрософт (Microsoft Corp.), 1996-2001. Все права защищены.     

ErrNumber: -2147463168 (0x80005000) 
Error Trying To Get the Object: W3SVC//root 
Произошла ошибка при вызове метода, так как [System.Object[]] не содержит метод  с именем "Start". 
C:\Documents and Settings\Администратор\Local Settings\Temp\2\is-GJ8K0.tmp\IIS7  _0_6_0.ps1:17 знак:17 
+ $webServer.Start <<<< ()     
+ CategoryInfo          : InvalidOperation: (Start:String) [], RuntimeException     
+ FullyQualifiedErrorId : MethodNotFound     
C:\DOCUME~1\9335~1\LOCALS~1\Temp\2\is-GJ8K0.tmp>powershell -command "Set-Executi  onPolicy Restricted -Scope CurrentUser"   
C:\DOCUME~1\9335~1\LOCALS~1\Temp\2\is-GJ8K0.tmp>powershell -command "exit"   
C:\DOCUME~1\9335~1\LOCALS~1\Temp\2\is-GJ8K0.tmp>sqlcmd -s CSU-DEVELOPER  1>


Все ошибки гуглила, не особо помогает. Может быть кто сталкивался?


Если что скрипт вшитый в установочник:
Код:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -sn W3SVC/ 
$newWebSiteName = "PhoneDict" 
$newWebSitePath = "C:\inetpub\wwwroot\PhoneDict" 
$iisWebService = Get-WmiObject -namespace "root\MicrosoftIISv2" -class "IIsWebService" 
$bindingClass = [wmiclass]'root\MicrosoftIISv2:ServerBinding' 
$bindings = $bindingClass.CreateInstance() 
$bindings.Port = "80" 
$result = $iisWebService.CreateNewSite($newWebSiteName, $bindings, $newWebSitePath) 
$iis = [ADSI]"IIS://localhost/W3SVC" 
$webServer = $iis.psbase.children | where { $_.keyType -eq "IIsWebServer" -AND $_.ServerComment -eq $newWebSiteName} 
$id = $webServer.Path.Replace("IIS://localhost/W3SVC/", "") 
cscript "C:\inetpub\AdminScripts\adsutil.vbs" set W3SVC/$id/DefaultDoc "main.aspx" 
cscript "C:\inetpub\AdminScripts\adsutil.vbs" set W3SVC/$id/root/accessRead "true" 
cscript "C:\inetpub\AdminScripts\adsutil.vbs" set W3SVC/$id/root/accessScript "true" 
$webServer.Start() 
exit


valyok666 05-11-2011 20:22 1789261

VASYAKRN,
Цитата:

извините за мой русский

VASYAKRN 05-11-2011 21:08 1789296

valyok666, Спасиба

serg aka lain 06-11-2011 05:48 1789512

Цитата:

Цитата Damaks
Инсталлятор может после установки сам себя скопировать? »

Цитата:

FileCopy(ExpandConstant('{srcexe}'), 'C:\Test\test.exe', False);
Придумал такой способ

Код:

#define AppName "My Program";

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}
AllowNoIcons=True
OutputDir=userdocs:InnoSetupTest.

[code]
procedure MyFileCopy();
var
  s1, s2: string;
  ResultCode: Integer;
begin
  s1:= ExpandConstant('{sd}\MyFileCopy.cmd');
  s2 := 'copy ' + AddQuotes(ExpandConstant('{srcexe}'))
        + ' ' + AddQuotes(AddBackSlash(ExpandConstant('{sd}')) + 'Test\test.exe') + #10#13 +
        + 'del ' + s1;
  SaveStringToFile(s1, s2, False);

  if not DirExists(ExpandConstant('{sd}\Test')) then
    CreateDir(ExpandConstant('{sd}\Test'));
  Exec(s1, '', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
    MyFileCopy();
end;


З.Ы.С кириллицей в пути не сработает.

Sotonisto 06-11-2011 20:12 1789844

1. Как осуществить разбивку .arc архива на диски (игра, сжатая FreeArc'ом весит ~9.5Gb)?
Хотелось бы разместить, например, 2 архива на 2 DVD и чтобы после окончания распаковки 1 архива, выводилось сообщение "Вставьте диск 2" и т.п.
Нашел такой пример, но не особо понял что делать (у меня требует 2й диск даже не начав установку).
Код:

if not ShowChangeDiskWindow('Пожалуйста, вставьте диск 2 и дождитесь его инициализации.', ExpandConstant('{src}'),'CODMW2_Disk2.arc'              ) then break;
if not ISArcExtract ( 1, 0, ExpandConstant('{src}\rustext.arc'),  ExpandConstant('{app}'), false, '', '', '', notPCFonFLY ) then break;
if not ISArcExtract ( 2, 0, ExpandConstant('{src}\engtext.arc'),  ExpandConstant('{app}'), false, '', '', '', notPCFonFLY ) then break;
if not ISArcExtract ( 3, 0, ExpandConstant('{src}\rusvoice.arc'), ExpandConstant('{app}'), false, '', '', '', notPCFonFLY ) then break;
if not ISArcExtract ( 4, 0, ExpandConstant('{src}\engvoice.arc'), ExpandConstant('{app}'), false, '', '', '', notPCFonFLY ) then break;
if not ShowChangeDiskWindow('Пожалуйста, вставьте первый диск и дождитесь его инициализации.', ExpandConstant('{src}'),'CODMW_2.arc'              ) then break;

2. Для чего нужен файл records.inf (он у меня создается после установки)? Из-за него я не могу установить игру (если файлы инсталла находятся в образе).
После окончания распаковки афхива инсталл просто закрывается (нет ни финишной страницы, ни инсталляции доп. по) :(

Gnom_aka_Lexander 06-11-2011 20:25 1789857

Цитата:

Цитата serg aka lain
З.Ы.С кириллицей в пути не сработает. »

Продолжим тему :) Вот так, работает и с кирилицей:

читать дальше »
Код:

#define AppName "My Program";

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}
AllowNoIcons=True
OutputDir=userdocs:InnoSetupTest.

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

function CopyFile(ExistingFile,NewFile: PAnsiChar;bFailIfExists: Boolean): Boolean;
external 'CopyFile{#A}@Kernel32.dll stdcall';

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  CreateDir(ExpandConstant('{sd}\тест'));\\ папку нужно создать зарание.
  CopyFile(ExpandConstant('{srcexe}'),ExpandConstant('{sd}\тест\test.exe'),True);
end;


Rikill 06-11-2011 21:05 1789888

Alim13, :o

Sotonisto, для чего нужен records.inf посмотри в справке к ISDone.

Код:

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\1 архив.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 0, 0, ExpandConstant('{src}\2 архив.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ShowChangeDiskWindow('Пожалуйста, вставьте диск 2 и дождитесь его инициализации.', ExpandConstant('{src}'),'3 архив на 2 диске.arc') then break;
    if not ISArcExtract ( 0, 0, ExpandConstant('{src}\4 на диске.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;
    if not ISArcExtract ( 0, 0, ExpandConstant('{src}\5 на диске.arc'), ExpandConstant('{app}'), '', false, '', '', '', notPCFonFLY) then break;

Ну или эксперементируй :) .

serg aka lain 06-11-2011 22:27 1789970

Цитата:

Цитата Лександер
Продолжим тему Вот так, работает и с кирилицей »

Ценная таки мысль, только в твоём примере будет работать только в ANSI, в Unicode не сработает, так как функция CopyFile
в юникоде выглядит так:
Код:

function CopyFile(ExistingFile,NewFile: String; bFailIfExists: Boolean): Boolean;
  external 'CopyFileW@Kernel32.dll stdcall';

универсальный пример
Код:

#ifdef UNICODE
  #define PChar = "String"
  #define A = "W"
#else
  #define PChar = "PChar"
  #define A = "A"
#endif

function CopyFile(ExistingFile,NewFile: {#PChar}; bFailIfExists: Boolean): Boolean;
  external 'CopyFile{#A}@Kernel32.dll stdcall';


Gnom_aka_Lexander 06-11-2011 22:32 1789977

serg aka lain, Внимательней посмотри мой пример.
читать дальше »
Цитата:

Цитата Лександер
#ifdef UNICODE
#define A "W"
#else
#define A "A"
#endif
»

Цитата:

Цитата Лександер
external 'CopyFile{#A}@Kernel32.dll stdcall'; »

Про то, что инно не перенаправляет это дело автоматом, уже научен неприятным опытом :)

serg aka lain 06-11-2011 22:43 1789990

Цитата:

Цитата Лександер
Внимательней посмотри мой пример »

Я имел в виду этот момент
Код:

function CopyFile(ExistingFile,NewFile: String; bFailIfExists: Boolean): Boolean;
  external 'CopyFileW@Kernel32.dll stdcall';


Sotonisto 07-11-2011 00:05 1790052

Rikill, спасибо :) Немного изменил твой пример и все получилось ^^
Но появилась другая проблема: прогресс-бар доходит до конца еще во время распаковки 1-го архива :( + у меня прогресс показан %, так вот, после распаковки 3х архивов отображается 300% :(
Как это исправить? Вот скрипт инсталла.

Rikill 07-11-2011 00:27 1790068

Sotonisto, а вот теперь про records.inf. После "пробной" распаковки архивов ты наверное заметил этот файл в папке.
Для активации введи в начале скрипта #define records и перекомпилируй. Вуаля, проценты и прогресс бар не шутят. Если будешь подсовывать другие архивы то закомментируй просто #define records и переустанови "пробный" раз игру. Т.е. перераспакуй все архивы.
P.S. Пример был из справки...

Dark_Delphin 07-11-2011 00:49 1790082

Всем привет!)

Подскажите как прикрутить свой (которого Не у кого нет) шрифт у инсаталлятор?
Есть пример?

Заранее спасибо.!

Rikill 07-11-2011 00:55 1790086

ntrx, к сожалению использование этого кода приводит в неправильному запуску инсталлятора. Проси у Shegorat правильную библиотеку для вывода шрифта, мне он её не даёт.
P. S. Возможно придётся раскошелиться...

Gnom_aka_Lexander 07-11-2011 10:00 1790170

Цитата:

Цитата serg aka lain
Я имел в виду этот момент »

Понял. тогда так:
читать дальше »
Код:

#ifdef UNICODE
  #define A "W"
  #define B "Wide"
#else
  #define A "A"
  #define B "Ansi"
#endif

function CopyFile(ExistingFile,NewFile: P{#B}Char; bFailIfExists: Boolean): Boolean;
  external 'CopyFile{#A}@Kernel32.dll stdcall';

,будет более правильно, спасибо, что указал :)

... оставляем рабочим вариант уважаемого serg aka lain. оказалось, что инно не знает, что такое PWideChar. так что для юникода, применяем String.

Gugle 07-11-2011 15:09 1790351

Цитата:

Цитата Rikill
Gugle, когда именно надо кинуть установщик на финиш? »

Извиняюсь за долгое молчание.

После инициализации своих окон в процедуре
Код:

PROCEDURE InitializeWizard;
проверяется наличие установленного приложения на ОС пользователя.
Проверка делается функцией взятой отсюда. Если ПО установлено, то сравниваются версия, которая ставится (V1) и версия, которая установлена (V2).
Если V1 <= V2 то пользователю задается вопрос, хочет ли он продолжить и при отрицательном ответе надо отправить пользователя на страницу "Финиш".

З.Ы.
А прочитать список файлов в папке как нить можно?

Gnom_aka_Lexander 07-11-2011 20:24 1790545

Цитата:

Цитата Gugle
А прочитать список файлов в папке как нить можно? »

можно:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*Code]

var
  ISCustomPage1: TWizardPage;
  Label1: TLabel;
  NewListBox1: TNewListBox;
  NewButton1: TNewButton;
  NewEdit1: TNewEdit;

procedure FindFile(Dir: string);
 var
 SR: TFindRec;
 FindRes: Boolean;
 begin
 FindRes := FindFirst(Dir + '*.*', SR);
 while FindRes do
 begin
 if ((SR.Attributes and $00000010) = $00000010) and
 ((SR.Name = '.') or (SR.Name = '..')) then
 begin
 FindRes := FindNext(SR);
 Continue;
 end;

 // если найден каталог, то
 if ((SR.Attributes and $00000010) = $00000010) then
 begin
 // входим в процедуру поиска с параметрами текущего каталога +
 // каталог, что мы нашли
 FindFile(Dir + SR.Name + '\');
 FindRes := FindNext(SR);
 // после осмотра вложенного каталога мы продолжаем поиск
 // в этом каталоге
 Continue; // продолжить цикл
 end;

 NewListBox1.Items.Add(SR.Name);
 FindRes := FindNext(SR);
 end;
 FindClose(SR);
 end;

procedure NewButton1Click(Sender: TObject);
begin
 NewListBox1.Clear; // очистка списка файлов
 FindFile(NewEdit1.Text); // поиск файлов с начальными условиями, заданных в NewEdit1
end;

procedure InitializeWizard();
begin
  { Creates custom wizard page }
  ISCustomPage1 := CreateCustomPage(wpWelcome, 'Поиск', 'Здесь поиск файлов в заданном каталоге');

  { ISCustomPage1 }
  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

  { Label1 }
  Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Name := 'Label1';
    Parent := ISCustomPage1.Surface;
    Caption := 'Введите адрес поиска';
    Transparent := False;
    Left := ScaleX(8);
    Top := ScaleY(192);
    Width := ScaleX(114);
    Height := ScaleY(13);
  end;

  { NewListBox1 }
  NewListBox1 := TNewListBox.Create(WizardForm);
  with NewListBox1 do
  begin
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(417);
    Height := ScaleY(185);
    ItemHeight := 13;
    ItemIndex := -1;
  end;

  { NewButton1 }
  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(342);
    Top := ScaleY(208);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'Искать';
    OnClick := @NewButton1Click;
  end;

  { NewEdit1 }
  NewEdit1 := TNewEdit.Create(WizardForm);
  with NewEdit1 do
  begin
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(0);
    Top := ScaleY(212);
    Width := ScaleX(329);
    Height := ScaleY(21);
    Text := ExpandConstant('{pf}\Inno Setup 5\');
  end;
end;


krutx 07-11-2011 20:32 1790551

Здравствуйте, помогите плиз. Я полный нуб в этой проге и 1 день пытаюсь в ней чтото сделать.
~2 часа себе мозг выносил к прикручиванию 7zip к моему шаблону, но так и не получилось.
Прикрутите плиз к моему шаблону (http://www.mediafire.com/?rcy26qqpktx7nva), напишите как архивы кидать в инсталлер (чтобы они распаковывались от инсталлера, но были отдельным файлом).
И еще вопрос как сделать (а лучше это тоже прикрутить к шаблону) чтобы если пользователь выбирает существующую папку, то все файлы в этой папки перемещались в *эта папка*\backup.
Если подобный вопрос уже был, сорьте, я убъюсь если буду читать ~400 страниц в 3 темах.

Gnom_aka_Lexander 07-11-2011 20:43 1790558

Цитата:

Цитата krutx
~2 часа себе мозг выносил к прикручиванию 7zip »

Можно объяснить смысл сего действа? Инно сама умеет использовать сжатие lzma2 и ultra64 ировни. в том числе непрерывное сжатие не хуже 7z, в общем, что и неудивительно, поскольку 7zip алгоритмы там и работают. Плюс дополнительные настройки сжатия можно найти в справке к инно. Тоесть, прикручивать 7zip к 7zip-у - полный маразм, в моем понимании.
Цитата:

Цитата krutx
Если подобный вопрос уже был, сорьте, я убъюсь если буду читать ~400 страниц в 3 темах. »

Бекап фалов - пять минут поиска в гугле. Ссылка

LinkOFF 07-11-2011 20:56 1790565

Цитата:

Цитата krutx
Здравствуйте, помогите плиз. Я полный нуб в этой проге и 1 день пытаюсь в ней чтото сделать.
~2 часа себе мозг выносил к прикручиванию 7zip к моему шаблону, но так и не получилось.
Прикрутите плиз к моему шаблону (http://www.mediafire.com/?rcy26qqpktx7nva), напишите как архивы кидать в инсталлер (чтобы они распаковывались от инсталлера, но были отдельным файлом).
И еще вопрос как сделать (а лучше это тоже прикрутить к шаблону) чтобы если пользователь выбирает существующую папку, то все файлы в этой папки перемещались в *эта папка*\backup.
Если подобный вопрос уже был, сорьте, я убъюсь если буду читать ~400 страниц в 3 темах. »

GameScript Generator тебе в помощь

oxsa91 08-11-2011 09:20 1790759

создание диалогового окна inno Setup
 
Необходимо создать новое диалоговое окно,которое будет спрашивать: на какой сервер ставить программу, сервер базы данных, логин и пароль для доступа к серверу базы данных. все эти переменные необходимо записать в нужном месте. Я первый раз работаю с Inno setupом,подскажите как это сделать,пожалуйста

krutx 08-11-2011 13:41 1790921

Цитата:

Цитата Лександер
Цитата krutx:
~2 часа себе мозг выносил к прикручиванию 7zip »
Можно объяснить смысл сего действа? Инно сама умеет использовать сжатие lzma2 и ultra64 ировни. в том числе непрерывное сжатие не хуже 7z, в общем, что и неудивительно, поскольку 7zip алгоритмы там и работают. Плюс дополнительные настройки сжатия можно найти в справке к инно. Тоесть, прикручивать 7zip к 7zip-у - полный маразм, в моем понимании.
Цитата krutx:
Если подобный вопрос уже был, сорьте, я убъюсь если буду читать ~400 страниц в 3 темах. »
Бекап фалов - пять минут поиска в гугле. Ссылка »

на счет бекапа я спросил потому что уже задрался с решением 1вой проблемы.
Спс
Такгда еще 2 вопроса
1 как сделать чтобы инсталлятор бился на несколько частей?
2 файлы запакованные в инсталлятор в exe тоже хранятся, или в отдельных архивах?

Я немного не понял тот скрипт (а точнее почти полностью не понял)
А также вообще не понял как бекап прикрутить к скрипту, который я использую.
Единственное что я понял (хотя могу ошибаться) он делает бекап, но не удаляет файлы в папке.
А мне нужно чтобы в папке куда пользователь указал устанавливать все файлы удалялись, перед этим бекапясь.

aXmeD 08-11-2011 14:27 1790954

krutx, пример для разбивки на DVD 4.3 гб

Код:

[Setup]
DiskSpanning=yes //разбивать на части
DiskSliceSize=1555000000 //размер части в байтах
SlicesPerDisk=3 //кол-во частей




подскажите код, для замены страници приветсвия на фото и добовление прозрачности (для Вин 7) с кликабельным логотипом слева-внизу

valyok666 08-11-2011 14:45 1790973

aXmeD, поточнее изложи что надо)

aXmeD 08-11-2011 15:17 1791001

valyok666, вот http://imageshack.us/photo/my-images...11ecfcb9b.jpg/
видите прозрачность и лого, вот оно нужно, чёб можно было жмакать на лого
и вместо экрана приветствия с текстом была фотография

valyok666 08-11-2011 15:21 1791006

aXmeD, вы пишите по русски=)
Вот лого W1n7

krutx 08-11-2011 20:28 1791181

Еще вопрос появился: как делать проверку процесара (в системных стребованиях) 2х и болие ядерных?
#define Processor "3000"
тут указывается частота процессора, и я так понимаю только для 1 ядра.

Rikill 08-11-2011 21:35 1791209

krutx, библиотека вроде бы на это не способна.

nik1967 08-11-2011 22:35 1791236

krutx,
isUtils.dll v1.00 [18.08.2010] от ExpeditorR
Библиотека для проверки системных требований. Ключевой особенностью isUtils.dll является то, что вы может написав всего пару-тройку строчек кода выводить всю информацию прямо в окно Inno Setup, при этом возможно использование любых цветов, размеров и шрифтов и всё это займёт всего 4-5 строк кода. Ну, и конечно же имеются функции для ручного вывода и проверки системных требований.
В архиве имеется файл Readme.rtf с подробным описанием всех функций, а так же два примера - автоматической и ручной проверки.
HWREQ v 1.11 от Shegorat [20.03.2011]
HWREQ - Модуль системных требований для Inno Setup.
Создает страницу системных требований, при этом вам потребуется прописать всего несколько функций.
В архиве есть несколько примеров использования.
Список изменений:
Относительно v.1.0:
Полностью переписан скрипт.
Теперь не нужна библиотека get_hw_caps.dll

Gugle 09-11-2011 10:08 1791478

Доброго времени суток!

Необходим пример чтения xml файла. Объяснюсь. Я видел пример, как писать и/или заменять данные в xml, но никак не могу разобраться, как можно пробежаться по дереву и вытащить необходимые данные.
Пример xml:
читать дальше »

<root>
---<element_1>
------<element_11>
------<element_12>
---------<element_121 attr1='121.1' attr1='121.2' attr1='121.3'>
---------<element_122 attr1='122.1' attr1='122.2' attr1='122.3'>
---------<element_123 attr1='123.1' attr1='123.2' attr1='123.3'>
------<element_13>
---<element_2>
------<element_21>
------<element_22>
------<element_23>
---<element_3>
</root>


Что понятно.
читать дальше »
Код:

xmlParser := CreateOleObject('Microsoft.XMLDOM'); // используем dom
xmlParser.load(fileName); // Загрузили файл
rootElement:= xmlParser.getElementsByTagName('element_12'); // Вытащили все элементы с именем element_12



Что хочется.
1. Вытащить список елементов. После метода xmlParser.getElementsByTagName('element_12'); получить список имен элементов входящих в "element_12". Т.е.
element_121
element_122
element_123
Метод, который бы это сделал я не нашел.

2. Вытащить список атрибутов. Т.е. я получил список элементов по имени с помощью метода xmlParser.getElementsByTagName('element_122');, если использовать xml выше, то элемент будет один, но возможно их будет и несколько, а потом получить список
attr1
attr2
attr3
Опять таки я не понимаю, как вытащить названия самих атрибутов.
При переборе названий хотелось бы иметь метод получения значение атрибута. Его я то же не смог найти.

krutx 09-11-2011 14:39 1791607

Цитата:

Цитата nik1967
krutx,
isUtils.dll v1.00 [18.08.2010] от ExpeditorR
Библиотека для проверки системных требований. Ключевой особенностью isUtils.dll является то, что вы может написав всего пару-тройку строчек кода выводить всю информацию прямо в окно Inno Setup, при этом возможно использование любых цветов, размеров и шрифтов и всё это займёт всего 4-5 строк кода. Ну, и конечно же имеются функции для ручного вывода и проверки системных требований.
В архиве имеется файл Readme.rtf с подробным описанием всех функций, а так же два примера - автоматической и ручной проверки.
HWREQ v 1.11 от Shegorat [20.03.2011]
HWREQ - Модуль системных требований для Inno Setup.
Создает страницу системных требований, при этом вам потребуется прописать всего несколько функций.
В архиве есть несколько примеров использования.
Список изменений:
Относительно v.1.0:
Полностью переписан скрипт.
Теперь не нужна библиотека get_hw_caps.dll »

у меня сама библиотека есть, я хз как записать проверку многоядерного проца.

LinkOFF 09-11-2011 21:14 1791811

Подскажите пожалуйста что нужно прописать в скрипте чтоб распаковывались зашифрованные архивы(пароль).Скрипт Isdone

No4noylis 09-11-2011 21:27 1791817

LinkOFF, Какие именно архивы??? Если *.arc то здесь пароль пиши, если не ошибаюсь:

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\arc.arc'), ExpandConstant('{app}\'), '', false, 'Твой пароль', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;

krutx 10-11-2011 13:41 1792240

Цитата:

Цитата Gugle
Доброго времени суток!
Необходим пример чтения xml файла. Объяснюсь. Я видел пример, как писать и/или заменять данные в xml, но никак не могу разобраться, как можно пробежаться по дереву и вытащить необходимые данные.
Пример xml:
читать дальше »
Что понятно.
читать дальше »
Что хочется.
1. Вытащить список елементов. После метода xmlParser.getElementsByTagName('element_12'); получить список имен элементов входящих в "element_12". Т.е.
element_121
element_122
element_123
Метод, который бы это сделал я не нашел.
2. Вытащить список атрибутов. Т.е. я получил список элементов по имени с помощью метода xmlParser.getElementsByTagName('element_122');, если использовать xml выше, то элемент будет один, но возможно их будет и несколько, а потом получить список
attr1
attr2
attr3
Опять таки я не понимаю, как вытащить названия самих атрибутов.
При переборе названий хотелось бы иметь метод получения значение атрибута. Его я то же не смог найти. »

notepad++ тебе в помощ

Gugle 10-11-2011 14:20 1792264

Цитата:

Цитата krutx
notepad++ тебе в помощ »

Немного более развернутый ответ не помешал бы... По возможности.

Rikill 10-11-2011 15:34 1792319

Gugle, он глупость сказал.

valyok666 10-11-2011 15:39 1792322

Rikill, +1 Gugle, спрашивает как средствами инно вытащить их, а не notepad

krutx 10-11-2011 15:42 1792324

Цитата:

Цитата Rikill
Gugle, он глупость сказал. »

ну вообщн не глупость, он отвечает всем требованиям Gugle.
Цитата:

Цитата valyok666
Rikill, +1 Gugle, спрашивает как средствами инно вытащить их, а не notepad »

То что именно через инно нужно он не писал, ну или я не заметил.

valyok666 10-11-2011 15:55 1792342

krutx, а форум чему посвящён по-твоему?

krutx 10-11-2011 17:16 1792397

Цитата:

Цитата valyok666
krutx, а форум чему посвящён по-твоему? »

ну может ему нужно это для инно, но ему нужно делать это не обязательно в инно

valyok666 10-11-2011 17:34 1792408

krutx, ну а если надо во время установки это сделать?так что харе флуд разводить

El Sanchez 10-11-2011 18:53 1792470

Цитата:

Цитата Gugle
Необходим пример чтения xml файла »

Gugle, пример xml никуда не годится, исправил на такой:
читать дальше »

PHP код:

<root>
    <
element_1></element_1>
    <
element_11></element_11>
    <
element_12>
        <
element_121 attr1='121.1' attr2='121.2' attr3='121.3'></element_121>
        <
element_122 attr1='122.1' attr2='122.2' attr3='122.3'></element_122>
        <
element_123 attr1='123.1' attr2='123.2' attr3='123.3'></element_123>
    </
element_12>
    <
element_13></element_13>
    <
element_2>
        <
element_21></element_21>
        <
element_22></element_22>
        <
element_23></element_23>
    </
element_2>
    <
element_3></element_3>
 </
root



Парсер будет сильно зависеть от самого xml, нужные ноды могут быть где угодно в иерархии, с/без аттрибутами. Для данного примера скрипт может быть такой:
Код:

...
objXMLDoc := CreateOleObject('Microsoft.XMLDOM');  //создаем объект
  objXMLDoc.async := False;  //синхронный режим
  objXMLDoc.load('d:\Program Files\Inno Setup 5\Projects\test\Output\test.xml');  //грузим файл
  XMLPath := '//root/element_12';  //выделяем нужные ноды. Эта строка может быть очень большой
  if objXMLDoc.parseError.errorCode <> 0 then Exit; //если структура файла не xml, выходим
  objNodes := objXMLDoc.selectNodes(XMLPath); //получаем список нод в зависимости от ранее заданного XMLPath
  if objNodes.length > 0 then for i := 0 to objNodes.Length-1 do //в данном случае нода будет всего лишь одна
    if objNodes.item[i].hasChildNodes then  //если нода имеет дочерние ноды,...
      for j := 0 to objNodes.item[i].childNodes.length-1 do //... то для всех детей...
      begin
        MsgBox(objNodes.item[i].childNodes.item[j].nodeName, mbInformation, MB_OK); //...выводим имя дочерней ноды,
        for k := 0 to objNodes.item[i].childNodes.item[j].attributes.length-1 do
        begin
          MsgBox(objNodes.item[i].childNodes.item[j].attributes.item(k).name, mbInformation, MB_OK); //...названия ее аттрибутов
          MsgBox(objNodes.item[i].childNodes.item[j].attributes.item(k).value, mbInformation, MB_OK); //...и значения аттрибутов
        end;
      end;


Devils Night 10-11-2011 19:36 1792492

Проблема, при установке не записываются записи реестра, как решить?
В общем
Код:

; Служба 2
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\Служба; ValueType: string; ValueName: DisplayName; ValueData: Служба; Flags: uninsdeletekey
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\Служба; ValueType: string; ValueName: ObjectName; ValueData: LocalSystem; Flags: uninsdeletekey
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Services\Служба\Enum; ValueType: string; ValueName: 0; ValueData: Root\LEGACY_СЛУЖБА_SERVICE\0000; Flags: uninsdeletekey

записываются нормально, а

Код:

[Registry]
; Служба 1
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Enum\Root\LEGACY_СЛУЖБА_SERVICE\0000; ValueType: string; ValueName: Service; ValueData: Служба; Flags: uninsdeletekey
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Enum\Root\LEGACY_СЛУЖБА_SERVICE\0000; ValueType: string; ValueName: Class; ValueData: LegacyDriver; Flags: uninsdeletekey
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Enum\Root\LEGACY_СЛУЖБА_SERVICE\0000; ValueType: string; ValueName: DeviceDesc; ValueData: Служба; Flags: uninsdeletekey
Root: HKLM; SubKey: SYSTEM\CurrentControlSet\Enum\Root\LEGACY_СЛУЖБА_SERVICE\0000\Control; ValueType: string; ValueName: ActiveService; ValueData: Служба; Flags: uninsdeletekey

не хочет, пишет Отказано в доступе, что делать?

P.S
Цитата:

Цитата valyok666
так что харе флуд разводить »

Сам же спрашивает, а потом ещё говорит харе флудить:lol:.valyok666, krutx, вы оба могли бы и через ПМ об этом поспорить.

Rikill 10-11-2011 20:18 1792517

Devils Night, попробуй в конце строчек добавить это:
Код:

Permissions: full

Devils Night 11-11-2011 01:00 1792692

Цитата:

Цитата Rikill
попробуй в конце строчек добавить»

Не работает, пишет ошибку: Parameter "Permissions" includes a malformed value "full"

Arsi000 11-11-2011 16:09 1793034

друзья! подскажите пожалуйста что значит в секции Files флаг Flags: ignoreversion gacinstall
ну ignoreversion понятно, а вот что такое gacinstall? для чего это надо и в каких случаях может знает кто

derfyt 11-11-2011 19:19 1793187

У меня такой вопрос что нужно написать в скрипте чтобы...
Он устанавливал дополнительные программы перед установкой главной программы..
Ну что то типо: запустил Setup.exe; Нажал далее выбрал директорию типо началась установка, но сначала вылетело окно с directx установкой... (типо установите сначала это)..

krutx 11-11-2011 21:13 1793276

как сделать сильное сжатие (используя только инно)
у меня в скрипте параметры сжатия
Код:

Compression=lzma2/ultra64
 LZMAMatchFinder=BT
LZMAUseSeparateProcess=true
LZMANumFastBytes=273
LZMADictionarySize=131072
InternalCompressLevel=ultra64
 SolidCompression=true
MergeDuplicateFiles=true


Rikill 11-11-2011 21:42 1793291

krutx, ну всё. Максимум.
derfyt , почему бы не сделать установку direct x обязательной после установки программы? С помощью секции [run]?

insombia 11-11-2011 22:42 1793338

вот мой скрипт переделанный valyok666 может кому надо готовый скрипт для CODMW3
http://rghost.ru/29571811

Vista-w 12-11-2011 00:00 1793372

insombia,
В секции [*run]
измени на это
-------------------------
Check: CheckError and SoftCheck
Не будет окон ошибок установки DirectX VC++ и т.д
-------------------------
И кнопку далее на странице SelectDirPage преименуй на "Установить" а то юзверь будет думать, что имеется еще какойнить шаг перед установкой.
-------------------------

krutx 12-11-2011 10:26 1793476

Ну а может ктонибудь в мой скрипт вписать использование прекомп и создание бекапа (с удалением всех файлов из папки установки)

Vista-w 12-11-2011 14:32 1793581

krutx,
В справке ISDon'а все подробно расписано.
Бекап то для чего?

krutx 12-11-2011 18:12 1793682

Цитата:

Цитата Vista-w
krutx,
В справке ISDon'а все подробно расписано.
Бекап то для чего? »

ну если юзер выбирает папку где уже есть файлы, файлы переместятся в папку бекапа.

insombia 12-11-2011 23:13 1793887

VASYAKRN,пожалуйста, удали мой скрипт с твоего сайта, я буду очень благодарен. Если же ты не удалишь, то мне придётся написать в тех. поддержку ucoz.ru. Твой сайт удалят, а тебя же забанят по физическому адресу.
P.S. Цитата: Друзья сайта
oszone.ru и ruboard.ru не соглашались быть партнёрами твоего сайта, ты нарушаешь этим правила.

VASYAKRN 13-11-2011 00:24 1793925

insombia, Хорошо

LinkOFF 13-11-2011 17:37 1794249

Что нужно прописать в скрипте чтоб удалялись папки с файлами?

ARS_23 13-11-2011 18:06 1794262

Цитата:

Цитата LinkOFF
Что нужно прописать в скрипте чтоб удалялись папки с файлами? »

ну поидее
Код:

[UninstallDelete]
 Name: {app}; Type: filesandordirs


LinkOFF 13-11-2011 18:07 1794264

Цитата:

Цитата ARS_23
ну поидее »

Нет...во время установки

No4noylis 13-11-2011 18:30 1794276

LinkOFF, хм... тогда может так???
Код:

[InstallDelete]
 Name: {app}; Type: filesandordirs


LinkOFF 13-11-2011 18:39 1794281

Цитата:

Цитата No4noylis
хм... тогда может так??? »

попробую
А через [code] как нибудь можно.У меня скрипт ISDone, я использую PackZIP и после упаковки папки в архив папка не удаляется

No4noylis 13-11-2011 18:50 1794289

Цитата:

Цитата LinkOFF
У меня скрипт ISDone, я использую PackZIP »

LinkOFF, с этого надо было начинать, здесь исправь:
Код:

if not ISPackZIP  ( 0, 0, ExpandConstant('{app}\1a1\*'), ExpandConstant('{app}\1a1.pak'), 2, true ) then break;

Vista-w 13-11-2011 18:59 1794296

LinkOFF,
[UninstallDelete]
Name: {app}\*.*; Type: filesandordirs // маска
Type: filesandordirs; Name: {app}

Belial4444 14-11-2011 15:02 1794826

Здравствуйте, я изучаю инно сетап 2 день и мне нужна помощь, я использую модуль IsDone 0.5 final для распаковки архива 7з который лежит рядом с установочным файлом. Вопрос заключается в следующем: как можно сделать так, чтобы распаковка тех или иных архивов зависела от выбора компонентов, иными словами как засунуть архив в компонент без секции [Files], то есть например если я не поставлю галочку на "Основные файлы" то архив не будет извлекаться.
В справке вроде описано как подключить файлы в компоненты с помощью секции [Files], например:
[Components]
name: "RevEmu"; Description: "Эмулятор для игры по сети";
[Files]
Source: "C:\Project\repacks\rev_emu\*"; Components: RevEmu; DestDir: "{app}\"; Flags: external recursesubdirs skipifsourcedoesntexist
а мне надо без этого(без указания архива в секции файлов), мне надо чтобы архив который лежит рядом с установщиком распаковывался только когда отмечен нужный компонент, даже если он не прописан в секции файлов.
Благодарю за внимание.

FolDer98 14-11-2011 16:05 1794878

Доброго времени)кто подскажет код добавления иконок папок через ботву?

Rikill 14-11-2011 23:00 1795208

FolDer98, там есть примеры как подгрузить картинку. Иконка папки это и есть картинка. Просто стандарт прячешь, потом суёшь туда картинку.

Belial4444,
Код:

[Components]
 name: "RevEmu"; Description: "Эмулятор для игры по сети";
[_code]
Comps1:=0;
 TmpValue:=1;
 if IsComponentSelected('RevEmu') then Comps1:=Comps1+TmpValue; //твой компонент
 TmpValue:=TmpValue*2;

 if not IS7ZipExtract  ( 1, 0, ExpandConstant('{src}\архив.7z'),  ExpandConstant('{app}'),          false, ''                    ) then break; //единичка означает номер компонента


Belial4444 15-11-2011 01:49 1795299

Rikill, спасибо но мне не помогло, наверное что-то я не так делаю:
Код:

[Кусок секции компонентов]
Name: "GameCore"; Description: "Файлы игры"; Types: polnaya viborochnaya; ExtraDiskSpaceRequired: 16106127360
Name: "RevEmu"; Description: "Эмулятор для игры по сети"; Types: polnaya viborochnaya
[Кусок секции код]
Comps1:=0;
TmpValue:=1;
if IsComponentSelected('GameCore') then Comps1:=Comps1+TmpValue;   
TmpValue:=TmpValue*2;
repeat
MyError:=true;
if not ISDoneInitialize(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, PCFVer, false, MainForm.Handle, {#NeedMem}, @ProgressCallback) then break;
repeat
if not IS7ZipExtract (1, 0, ExpandConstant('{src}\setup.bin'), ExpandConstant('{app}\'), false,  '123') then break;

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

Raf-9600 15-11-2011 12:29 1795492

Ктонить может написать скрипт, который бы при распаковке файлов, если обнаруживает в устанавливаемой папке, файл с тем же именем и расширением что сейчас должен распаковаться, то сначала проверил CRC32 файла в папке, и если он совпал с тем CRC32 что я задал для этого файла, файл бы не распаковывался?

Gugle 15-11-2011 12:42 1795504

Доброго времени суток!

В секции [Files] прописана папка с файлами, которую надо инсталить:
Код:

[Files]
Source: "C:\MyFolder\*"; DestDir: "{app}\MyFolder.0\";

При инсталяции в одном из окон указывается число этих папок. Сейчас я делаю копирование этих папок руками в секции code и в итоге получаю:
{app}\MyFolder.0\
{app}\MyFolder.1\
{app}\MyFolder.2\
...
{app}\MyFolder.N\

Можно как нибуть в секции files указать число папок, в которые надо проинсталить, а не писать свою функцию? Мне надо сохранить флаги при установке. Например, если папка такая есть и в ней есть этот файл, то проверить версии и заменить только, если у пользователя стоит младшая версия файла.

FolDer98 15-11-2011 18:56 1795817

Вложений: 1
Добрый вечер)как сделать такие чекбоксы без ботвы

El Sanchez 16-11-2011 14:54 1796351

Цитата:

Цитата FolDer98
Добрый вечер)как сделать такие чекбоксы без ботвы »

FolDer98,
  • Использовать ISSkin.dll и свой скин.
  • Извратиться и вместо чекбокса использовать TNewCheckListBox с одним элементом и использовать LoadBtnBmpFromBitmap/LoadBtnBmpFromFile.
  • Хук на события отрисовки и рисовать самому, что сложнее.

Gnom_aka_Lexander 16-11-2011 15:23 1796380

В данном случае было использовано
Цитата:

Цитата El Sanchez
Извратиться и вместо чекбокса использовать TNewCheckListBox с одним элементом и использовать LoadBtnBmpFromBitmap/LoadBtnBmpFromFile. »

Только там еще LoadBGBmpFromBitmap/LoadBGBmpFromFile тоже задействовано :)
:)

Rikill 16-11-2011 16:15 1796441

El Sanchez, а можно пример "хука на событие установки"? А то интересно, блин. :)

FolDer98 16-11-2011 18:15 1796538

а примера нет?просто токо учусь в основном всё копипастой

valyok666 16-11-2011 18:25 1796543

Rikill, +1 тоже заитересовало)кстати вроде бы пример был у рестулз или я ошибаюсь?

MadTweest 16-11-2011 18:38 1796561

Люди добрые тыкните чайника с путь истинный !!!! Что нужно сделать чтобы Inno Setup создала Setup.exe + 1.bin + 2.bin и т.д Как образом это делается ??? Как разбивать на части в виде bin файлов ?? Надо в скрипт добавлять чего то или как ?? Только не ссылки подскажите как сделать !

Gnom_aka_Lexander 16-11-2011 18:52 1796572

MadTweest, Открываеш InnoSetup, нажимаеш на клавиатуре F1, в появившейся справке вбиваеш в поиске слово [Setup], получаеш список параметров этой секции. там есть все, что тебе нужно.
Цитата:

Цитата Rikill
а можно пример "хука на событие установки"? »

Цитата:

Цитата valyok666
оже заитересовало)кстати вроде бы пример был у рестулз или я ошибаюсь? »

антивирусы, как правило, очень не любят этого. и в 90% случаев, полностью блокируют.

insombia 16-11-2011 18:54 1796574

MadTweest
DiskSpanning=true
SlicesPerDisk=4
DiskSliceSize=10000000

Raf-9600 17-11-2011 08:38 1796894

Как в BeforeInstall прописать выполнение двух функций? В справке сказано что это возможно через запятую, но когда я пишу так:
Код:

BeforeInstall: CreateBackup, ChangeCaption('Распаковка файлов монологов...')
То компилятор жалуется на эту запятую.

South 17-11-2011 10:41 1796971

Цитата:

Цитата Rikill
El Sanchez, а можно пример "хука на событие установки"? А то интересно, блин. »

ищи на руборде в шапке пример OwnerDrawCheckBox.iss. еще 3 года назад выкладывал
Цитата:

Цитата Лександер
антивирусы, как правило, очень не любят этого. и в 90% случаев, полностью блокируют. »

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

R.i.m.s.k.y. 17-11-2011 11:31 1797011

Цитата:

Цитата Raf-9600
Как в BeforeInstall прописать выполнение двух функций »

делаешь спецпроцедуру конкретно для этого случая и в нее прописываешь вызов двух
Код:

...BeforeInstall: SpecF
[*Code]
Procedure SpecF;
Begin
ChangeCaption('Распаковка файлов монологов...');
CreateBackup;
end;


kindza811 17-11-2011 13:15 1797101

Всем привет. Как вставить видео в инсталлятор?

ARS_23 17-11-2011 14:48 1797189

Цитата:

Цитата kindza811
Всем привет. Как вставить видео в инсталлятор? »

Код для воспроизведения стандартного avi-файла на фоновом окне инсталлятора, изменяйте параметры для достижения требуемого результата.
читать дальше »

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName=C:\My Program
OutputBaseFilename=setup
Compression=lzma
WindowVisible=yes
WindowShowCaption=no

[Files]
Source: clock.avi; DestDir: {tmp}; Flags: dontcopy

[code]
const
AviFrameWidth = 500; // ширина кадра
AviFrameHeight = 500; // высота кадра

var
CommandString: String;
FileName: String;
AviFrameTop: Integer;
AviFrameLeft: Integer;

function mciSendString(lpstrCommand: string; lpstrReturnString: PChar; uReturnLength:integer; hwndCallback:integer):integer;
external 'mciSendStringA@winmm.dll stdcall';

function GetSystemMetrics(nIndex:Integer):Integer;
external 'GetSystemMetrics@user32.dll stdcall';

procedure InitializeWizard();
begin
ExtractTemporaryFile(ExpandConstant('clock.avi'));
FileName:= ExpandConstant('{tmp}\clock.avi');
AviFrameTop:= GetSystemMetrics(17) / 2 - AviFrameHeight / 2;
AviFrameLeft:= GetSystemMetrics(16) / 2 - AviFrameWidth / 2;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then
begin
CommandString:= 'Open ' + FileName + ' type AVIVideo alias AVIFile parent ' + IntToStr(MainForm.Handle) + ' style child';
mciSendString(CommandString, '', 0, 0);

CommandString:= 'put AVIFile window at ' +
IntToStr(AviFrameLeft) + ' ' + IntToStr(AviFrameTop) + ' ' +
IntToStr(AviFrameWidth) + ' ' + IntToStr(AviFrameHeight);
mciSendString(CommandString, '', 0, 0);

//CommandString:= 'Play AVIFile fullscreen'; // полноэкранный режим
CommandString:= 'Play AVIFile repeat';
mciSendString(CommandString, '', 0, 0);
end;
end;

procedure DeinitializeSetup();
begin
CommandString:= 'Close AVIFile'; // закрываем при выходе
mciSendString(CommandString, '', 0, 0);
end;

Rikill 17-11-2011 15:32 1797228

kindza811, этой библиотекой ещё можно. Довольно-таки удобно.

leshcat 17-11-2011 23:02 1797573

Здравствуйте,

Задача:

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

Пишу в реестр данной строчкой:

RegWriteStringValue(HKCU,'Software\Microsoft\Windows\CurrentVersion\RunOnce','Boban Installer', '{src}\{#archname}.exe');

Конечно же, параметр записывается как строка, а мне ,естественно, нужно получить путь от {src}. Как этого достичь?

valyok666 17-11-2011 23:50 1797600

Rikill, норм библиотека от Vintage)

Raf-9600 18-11-2011 05:57 1797692

Ктонить может написать скрипт, который бы при нахождении в устанавливаемой папке, файла с тем же именем что и у файла который сейчас должен распаковаться, сверял бы количество байт файла в папке, с количеством байт, которое я задал для этого файла, и если значения совпадают, то файл бы не распаковывался?

P.S.
Собстно такой код нужен для использования с улучшенным деинсталлятором UninsHs, чтобы когда пользователь выбрал в нем "Изменить" или "Восстановить", то не перезаписывались все файлы, а только измененные.

upd
А реально ли в этом коде сделать так, чтоб выбрав компонент под номером 3, у компонента под номером 5, менялось описание?

читать дальше »
Код:

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

[CustomMessages]
russian.ComponentsInfoPanel1=Описание
russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.

[c0de]
type
  TComponentDesc = record Description: String; Index: Integer; end;

var
  Descs: array of TComponentDesc;
  Info: TNewStaticText;
  InfoCaption: TNewStaticText;
  InfoPanel: TPanel;
  Indx: Integer;

procedure ShowDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var i: Integer;
begin
  Indx:=-1;
  for i:= 0 to GetArrayLength(Descs)-1 do begin
  if (Descs[i].Index=Index) then begin Indx:=i; Break end; end;
  if (Indx >=0)and(Area=iaItem) then Info.Caption:= Descs[Indx].Description else Info.Caption:= ExpandConstant('{cm:ComponentsInfoPanel2}');
end;

procedure AddDescription(AIndex: Integer; ADescription: String);
var i, k: Integer;
begin
i:= GetArrayLength(Descs); SetArrayLength(Descs, i+1);
Descs[i].Description:= ADescription; Descs[i].Index:= AIndex-1
end;

procedure InitializeWizard();
begin
  WizardForm.TypesCombo.Visible:=False;
  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);
  WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription

  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;//ScaleY(12);        // поднимает панель, но опускает панель с текстом
  InfoPanel.Left := ScaleX(216);
  InfoPanel.Width := ScaleX(200);
  InfoPanel.Height := WizardForm.ComponentsList.Height; //ScaleY(40);
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;
  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
  InfoCaption.Left := ScaleX(224);
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);    //поднять слово Описание
  InfoCaption.Font.Color := clActiveCaption;

  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188); //шырина текста
  Info.Top := ScaleY(12);    //Чем больше значение, тем ниже опускаеться полоска текста
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);  //Чем больше значение, тем ниже опускаеться полоска текста
  Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
  Info.WordWrap := true;

  AddDescription(1, 'Это дополнение выпущенно 31 июля 1998 года. Созданно Aztech New Media. Этот продукт был официально признан Blizzard Entertainment, разработчиком оригинальной игры. Дополнение содержит три кампании, по 10 миссий каждая, и более чем 100 дополнительных карт.123456789'); //первый параметр - это номер компонента, идет последовательно от начала записи компонентов
  AddDescription(2, 'Английская справка'); //Второй параметр - это собственно описание компонента
  AddDescription(3, 'Русская справка');
  AddDescription(4, 'Плагины');
  AddDescription(5, 'Внутреннего просмотра');
  AddDescription(6, 'Архиваторные');
  AddDescription(7, 'Системные');
  AddDescription(8, 'CanonCam');
  AddDescription(9, 'PluginManager');
  AddDescription(10, 'Registry');
  AddDescription(11, 'Services');
  AddDescription(12, 'StartupGuard');
  AddDescription(13, 'Другие');

end;


R.i.m.s.k.y. 18-11-2011 08:14 1797716

leshcat, ExpandConstant
Код:

RegWriteStringValue(HKCU,'Software\Microsoft\Windows\CurrentVersion\RunOnce','Boban Installer', ExpandConstant('{src}\{#archname}.exe'));
я точно не знаю переварит ли ExpandConstant переменную {#archname}, по идее должен

XXXler 18-11-2011 11:15 1797835

Возникла необходимость решения следующей задачи - необходимо получить индекс checkbox'а в списке компонентов по имени компонента (не описанию, т.к. описание "Для всех форматов" используется и в других компонентах) - у кого-нибудь имеются наработки в этом направлении?

Цитата:

Цитата R.i.m.s.k.y.
я точно не знаю переварит ли ExpandConstant переменную {#archname}, по идее должен »

{#blah-blah-blah} - это директивы пред-процессора, ExpandConstant получит уже конечное значение выражения blah-blah-blah

valyok666 18-11-2011 11:28 1797848

XXXler, посмотрите пример из ботвы BtnGroup.iss там токо кнопки вместо чекбоксов))

XXXler 18-11-2011 12:12 1797873

Цитата:

Цитата valyok666
посмотрите пример из ботвы BtnGroup.iss там токо кнопки вместо чекбоксов)) »

это совсем не из той оперы, мне нужен индекс для управления этим чекбоксом, а не для получения оповещений о его нажатии

valyok666 18-11-2011 14:32 1797957

XXXler, ну я просто хотел помочь=)

leshcat 18-11-2011 18:15 1798121

R.i.m.s.k.y.,

Большое спасибо, проработала точно как надо :)

Еще вопрос... как тосле этого подать команду на рестарт?
Хотел реализовать через shellexec с помощью виндовского 'shutdown /r'.

Rikill 18-11-2011 18:31 1798132

leshcat,
[setup]
AlwaysRestart=yes

leshcat 18-11-2011 18:42 1798137

Rikill,

Нет, это не то, нужна команда shellexec или exec

R.i.m.s.k.y. 18-11-2011 18:55 1798146

Цитата:

Цитата leshcat
Хотел реализовать через shellexec с помощью виндовского 'shutdown /r'. »

а что мешает реализовать с помощью виндовского 'shutdown /r?

El Sanchez 18-11-2011 19:00 1798150

Цитата:

Цитата Rikill
а можно пример "хука на событие установки"? »

Rikill, событие отрисовки.

Цитата:

Цитата South
смысла нет использовать для такой задачи хуки, достаточно сабклассинга »

South, спасибо, различия в терминах усвоил.

Пример кода отрисовки кастомного чекбокса. Реализовал 12 состояний. В качестве изображения для чекбокса взял btnimage.bmp из примеров Restools.
читать дальше »

Код:

[Setup]
AppName=test
AppVerName=test
CreateAppDir=false
DefaultDirName={tmp}
UsePreviousAppDir=false
UsePreviousGroup=false
AlwaysShowComponentsList=true
FlatComponentsList=false
UsePreviousSetupType=false
UsePreviousTasks=false
UsePreviousUserInfo=false
DisableStartupPrompt=true
Uninstallable=false
AllowNoIcons=yes
BitmapResource=btn:{app}\btnimage.bmp

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

[code]
type
    TPaintStruct = record
        hdc: Longint;
        fErase: BOOL;
        rcPaint: TRect;
        fRestore: BOOL;
        fIncUpdate: BOOL;
        rgbReserved: array [0..31] of byte;
    end;

    TCheckBoxArray = array of record
        Control: TWinControl;
        PrevWndProc: Longint;
    end;

const
    BM_GETCHECK = $F0;
    BM_GETSTATE = $F2;
    BST_UNCHECKED = $0;
    BST_CHECKED = $1;
    BST_INDETERMINATE = $2;
    BST_FOCUS = $8;
    BST_HOT = $200;
    BST_PUSHED = $4;
    CN_CTLCOLORSTATIC = $BD38;
    WM_PAINT = $F;
    COLOR_GRAYTEXT = 17;
    COLOR_BTNTEXT = 18;

var
    btn: TBitmapImage;
    ControlArray: TCheckBoxArray;

function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint;  external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function BeginPaint(hWnd: HWND; var lpPaint: TPaintStruct): Longint; external 'BeginPaint@user32.dll stdcall';
function EndPaint(hWnd: HWND; const lpPaint: TPaintStruct): Boolean; external 'EndPaint@user32.dll stdcall';
function InvalidateRect(hWnd: HWND; lpRect: Longint; bErase: Boolean): Boolean; external 'InvalidateRect@user32.dll stdcall';
function GdiTransparentBlt(hdcDest: Longint; xoriginDest, yoriginDest, wDest, hDest: Integer; hdcSrc: Longint; xoriginSrc, yoriginSrc, wSrc, hSrc: Integer; crTransparent: UINT): Boolean; external 'GdiTransparentBlt@gdi32.dll stdcall';
function DrawText(hDC: Longint; lpchText: PAnsiChar; nCount: Integer; var lpRect: TRect; uFormat: UINT): Integer; external 'DrawTextA@user32.dll stdcall';
function SetTextColor(hdc: Longint; crColor: DWORD): DWORD; external 'SetTextColor@gdi32.dll stdcall';
function SetBkMode(hdc: Longint; iBkMode: Integer): Integer; external 'SetBkMode@gdi32.dll stdcall';
function SelectObject(hdc: Longint; hgdiobj: Longint): LongWord; external 'SelectObject@gdi32.dll stdcall';
function GetSysColor(nIndex: Integer): DWORD; external 'GetSysColor@user32.dll stdcall';


function WndProc(hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint;
var
    i, id: Integer;
    ps: TPaintStruct;
    rs: TRect;
begin
    Result := 0;
    i := GetWindowLong(hWnd, -21);
    case Msg of
        CN_CTLCOLORSTATIC: InvalidateRect(hWnd, 0, False);
        WM_PAINT: begin
            InvalidateRect(hWnd, 0, True);
            BeginPaint(hWnd, ps);
            case SendMessage(hWnd, BM_GETSTATE, 0, 0) of
                BST_UNCHECKED + BST_FOCUS: id := 9;                                 
                BST_CHECKED + BST_FOCUS: id := 13;
                BST_INDETERMINATE + BST_FOCUS: id := 17;

                BST_UNCHECKED + BST_HOT: id := 10;
                BST_CHECKED + BST_HOT: id := 14;
                BST_INDETERMINATE + BST_HOT: id := 18;

                BST_UNCHECKED + BST_FOCUS + BST_HOT: id := 10;
                BST_CHECKED + BST_FOCUS + BST_HOT: id := 14;
                BST_INDETERMINATE + BST_FOCUS + BST_HOT: id := 18;

                BST_UNCHECKED + BST_FOCUS + BST_HOT + 100: id := 11;
                BST_CHECKED + BST_FOCUS + BST_HOT + 100: id := 15;
                BST_INDETERMINATE + BST_FOCUS + BST_HOT + 100: id := 19;
               
                BST_UNCHECKED + BST_FOCUS + BST_HOT + 100 - BST_PUSHED: id := 11;
                BST_CHECKED + BST_FOCUS + BST_HOT + 100 - BST_PUSHED: id := 15;
                BST_INDETERMINATE + BST_FOCUS + BST_HOT + 100 - BST_PUSHED: id := 19;
               
                BST_UNCHECKED: id := 9;
                BST_CHECKED: id := 13;
                BST_INDETERMINATE: id := 17;
            end;
            if not TNewCheckBox(ControlArray[i].Control).Enabled then
            case SendMessage(hWnd, BM_GETCHECK, 0, 0) of
                BST_UNCHECKED: id := 12;
                BST_CHECKED: id := 16;
                BST_INDETERMINATE: id := 20;
            end;
            GdiTransparentBlt(ps.hdc, 0, 0, ps.rcPaint.Bottom, ps.rcPaint.Bottom, btn.Bitmap.Canvas.Handle, id*btn.Bitmap.Height, 0, btn.Bitmap.Height, btn.Bitmap.Height, clFuchsia);
            SelectObject(ps.hdc, TNewCheckBox(ControlArray[i].Control).Font.Handle);
            SetBkMode(ps.hdc, 1);
            if TNewCheckBox(ControlArray[i].Control).Enabled then
                SetTextColor(ps.hdc, GetSysColor(COLOR_BTNTEXT))  //ãëîáàëüíûé öâåò òåêñòà ÷åêáîêñà
            else
                SetTextColor(ps.hdc, GetSysColor(COLOR_GRAYTEXT));
            rs.Left := ps.rcPaint.Bottom;
            rs.Top := (ps.rcPaint.Bottom - TNewCheckBox(ControlArray[i].Control).Font.Size) div 4;  //ïîäãîíêà ïî âåðòèêàëè, íåîïòèìàëüíî
            rs.Right := ps.rcPaint.Right - rs.Left;
            rs.Bottom := ps.rcPaint.Bottom;
            DrawText(ps.hdc, TNewCheckBox(ControlArray[i].Control).Caption, Length(TNewCheckBox(ControlArray[i].Control).Caption), rs, 0);
            EndPaint(hWnd, ps);
        end;
        else Result := CallWindowProc(ControlArray[i].PrevWndProc, hWnd, Msg, wParam, lParam);
    end;
end;

procedure SetOwnerDrawCheckBox(Ctrl: TWinControl);
var
    i: Integer;
begin
    if Assigned(Ctrl) then
    begin
        for i := 0 to Ctrl.ControlCount-1 do if Ctrl.Controls[i] is TWinControl then
        begin
            if (Ctrl.Controls[i] is TNewCheckBox) then
            begin
                SetArrayLength(ControlArray, GetArrayLength(ControlArray)+1);
                ControlArray[GetArrayLength(ControlArray)-1].Control := TWinControl(Ctrl.Controls[i]);
                ControlArray[GetArrayLength(ControlArray)-1].PrevWndProc := SetWindowLong(TWinControl(Ctrl.Controls[i]).Handle, -4, CallbackAddr('WndProc'));
                SetWindowLong(TWinControl(Ctrl.Controls[i]).Handle, -21, GetArrayLength(ControlArray)-1);
            end;
            if TWinControl(Ctrl.Controls[i]).ControlCount > 0 then SetOwnerDrawCheckBox(TWinControl(Ctrl.Controls[i]));
        end;
    end;
    if not Assigned(Ctrl) then
    begin
        for i := 0 to GetArrayLength(ControlArray)-1 do SetWindowLong(ControlArray[i].Control.Handle, -4, ControlArray[i].PrevWndProc);
        SetArrayLength(ControlArray, 0);
    end;
end;


procedure InitializeWizard();
begin
    with WizardForm do
    begin
        OuterNotebook.Hide;
        NoIconsCheck.Parent := WizardForm;
        NoIconsCheck.Left := 100;
        //NoIconsCheck.Height := 24;
        NoIconsCheck.Show;
        NoIconsCheck.AllowGrayed := True;
        //NoIconsCheck.Enabled := False;
        btn := TBitmapImage.Create(WizardForm);
        btn.Bitmap.LoadFromResourceName(HInstance, '_IS_BTN');
    end;
    SetOwnerDrawCheckBox(WizardForm);
end;

procedure DeinitializeSetup();
begin
    SetOwnerDrawCheckBox(nil);
end;



upd
Доработал еще 9 состояний чекбокса

Devils Night 19-11-2011 06:42 1798502

Цитата:

Цитата leshcat
Еще вопрос... как тосле этого подать команду на рестарт? »

Если так например?

читать дальше »
Код:

[Run]
Filename: shutdown; Parameters: /r /t 10; Flags: runhidden


R.i.m.s.k.y. 19-11-2011 07:16 1798507

Цитата:

Цитата Devils Night
Если так например »

а разве не надо указывать полностью имя?
Код:

[Run]
Filename: shutdown.exe; Parameters: /r /t 10; Flags: runhidden


Devils Night 19-11-2011 08:52 1798526

Цитата:

Цитата R.i.m.s.k.y.
а разве не надо указывать полностью имя? »

у меня так отработало нормально,
пример из батника брал, там не каких exe не было, в оригинале вообще вот так было
Код:

shutdown -r -t 1 -c

OxFFEEDD 19-11-2011 10:54 1798589

Всех приветствую.

Ищу варианты решения одной задачки, по этому решил задать вопросы здесь.

Интересует создание инсталлятора программы FlylinkDC++ для локальной сети, а в частности, сможет-ли движок Inno Setup проделать такой финт:
1. показать пользователю поле ввода для ника;
2. отобразить выпадающий список с ip адресами сетевых интерфейсов, существующих на данный момент в системе;
3. по результатам пользовательского ввода модифицировать файл настроек Flylink'а.

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

Devils Night 19-11-2011 11:05 1798597

Цитата:

Цитата OxFFEEDD
Интересует создание инсталлятора программы FlylinkDC++ для локальной сети
Самому писать инсталлятор пока лень »

Мда, и лень тему полистать, уже был такой вопрос, valyok666 давал ответ, вот здесь

OxFFEEDD 19-11-2011 11:23 1798605

Спасибо.
Реестр мне не подходит по определённым причинам. Интересует возможность модификации файла настроек DCPlusPlus.xml во время установки.

Devils Night 19-11-2011 12:19 1798633

Цитата:

Цитата OxFFEEDD
Интересует возможность модификации файла настроек DCPlusPlus.xml во время установки. »

Подозреваю что нибудь этакое, только ввод в окне инсталятора или что то в этом духе. Самого такое интересует.

OxFFEEDD 19-11-2011 12:36 1798639

Извиняюсь за глупые вопросы, времени нехватает на вдумчивое чтение доков по Inno, но функции, вроде DeleteIniEntry являются API вызовами или это скриптовые обёртки? Если это Native API, то можно извратиться в моём случае и воспользоваться MSXML для доступа к данным DCPlusPlus.xml. Но это изврат получается )).

В итоге если хорошо подумать, то остаётся единственный вариант, написать программку, которая делает замену строк по шаблонам и вызывать её с аргументами - строками для замены (ник, ip, каталог), а после установки удалять её, что-бы не искушала пользователей. Так же сделать и при получении списка ip-адресов из системы (я надеюсь Inno Setup позволяет получать вывод вызываемых программ или ошибаюсь?).

R.i.m.s.k.y. 19-11-2011 13:14 1798658

Вложений: 1
OxFFEEDD,
вот тебе, старче, скрипты инно для работы с XML

OxFFEEDD 19-11-2011 15:57 1798779

Универсальная библиотечка... спасибо. Теперь есть точка опоры, с которой можно начинать!
Осталось реализовать задуманное. Всем удачи!

PS
Кстати, если особо не заморачиваться на формате xml, то можно в файле настроек, предварительно прописав строковые шаблоны типа %nick%, %ip%, %dowload_dir% в соотв. теги, заменить шаблоны на значения, полученные от пользователя с помощью функции StringChangeEx, как вариант.

Devils Night 19-11-2011 20:27 1798904

Как совместить эти два кода?

читать дальше »
Код:

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: dontcopy

[ Code]
function KillTask(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

//**************************************************//
function InitializeSetup(): Boolean;
begin
  If RunTask('winamp.exe', false) then
    begin
      if MsgBox('Программа Winamp используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
        begin
          KillTask('winamp.exe');
          Result:= True;
        end else
          Exit;
    end;
Result:=True;
end;


Код:

[Files]
Source: ISTask.dll; DestDir: {app}; Flags: ignoreversion

[ Code]
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';
function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  if RunTask('winamp.exe', False) then
    begin
      // прячем форму
      UninstallProgressForm.Visible:= False;
      if MsgBox('Программа winamp.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
        begin
          KillTask('winamp.exe');
          UnloadDll(ExpandConstant('{app}\ISTask.dll'));
          // показываем форму
          UninstallProgressForm.Visible:= True;
        end
      else
        begin
          MsgBox('Завершите работу winamp.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
          UnloadDll(ExpandConstant('{app}\ISTask.dll'));
          Abort;
        end;
    end;
end;


Rikill 20-11-2011 00:57 1799076

Devils Night,
Код:

function KillTasks(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';

function RunTasks(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

//**************************************************//
function InitializeSetup(): Boolean;
begin
  If RunTasks('Winamp.exe', false) then
    begin
      if MsgBox('Программа Winamp используется. Закрыть и продолжить установку?', mbInformation, mb_YesNo) = idYes then
        begin
          KillTasks('Winamp.exe');
          Result:= True;
        end else
          Exit;
    end;
Result:=True;
end;


procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep = usUninstall then
  if RunTask('Winamp.exe', False) then
    begin
      // прячем форму
      UninstallProgressForm.Visible:= False;
      if MsgBox('Программа winamp.exe используется. Закрыть и продолжить удаление?', mbConfirmation, MB_YESNO) = IDYES then
        begin
          KillTask('Winamp.exe');
          UnloadDll(ExpandConstant('{app}\ISTask.dll'));
          // показываем форму
          UninstallProgressForm.Visible:= True;
        end
      else
        begin
          MsgBox('Завершите работу winamp.exe, затем снова запустите программу удаления.', mbInformation, MB_OK);
          UnloadDll(ExpandConstant('{app}\ISTask.dll'));
          Abort;
        end;
    end;
end;


Aplle 20-11-2011 20:49 1799461

Всем Здрасте. Кто может поделиться скриптом для который используеться в этом уроке http://rutracker.org/forum/viewtopic.php?t=2729289 или вобщем скрипт с поддержкой вставки изображения, музыки и разархивации FreeArc для версии 5

Belial4444 21-11-2011 09:47 1799682

Здравствуйте, у меня новая проблема появилась, надеюсь Вы подскажите. Суть проблемы: у меня 2 компонента в установке, первый это файлы игры, 2 это эмулятор для игры, файлы игры запиханы в архив 7з, который лежит рядом с установщиком и извлекается если отмечен 1 компонент, проблема заключается в том, что эмулятор из 2 компонента устанавливается до того, как разархивируются файлы игры, думаю это происходит так потому что инно сетап считает 1 компонент пустым так как там к нему не подключены файлы через секцию [Files] , а просто есть команда на распаковку архива, то есть инно сетап обрабатывает 1 компонент, считает его пустым и распаковывает 2 компонент, а мне нужно чтобы распаковывал только когда извлечется архив. Спасибо за внимание.

R.i.m.s.k.y. 21-11-2011 09:53 1799685

Belial4444,
я много читать, и думать и мой моск сломать об клавиатура читай твой сообщения
если ты пожалуйста положить скрипт может быть я смогу знать где есть ошибка

Belial4444 21-11-2011 14:22 1799846

R.i.m.s.k.y, старался писать понятно, не получилось)
Короче по порядку. Есть два компонента:
[Components]
Name: "GameCore"; Description: "Файлы игры"; ExtraDiskSpaceRequired: 17287243366
Name: "RevEmu"; Description: "Эмулятор для игры по сети";
По описанию понятно что есть что), мне нужно чтобы после установки первого компонента устанавливался второй. В первом компоненте у меня идет распаковка архива формата 7z:
[code]
Код:

const
  PCFonFLY=true;
  notPCFonFLY=false;
var
  LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
  ISDoneProgressBar1: TNewProgressBar;
#ifdef SecondProgressBar
  LabelPct2: TLabel;
  ISDoneProgressBar2:TNewProgressBar;
#endif
  MyCancelButton: TButton;
  Cancel:integer;
  MyError:boolean;
  PCFVer:double;

type
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

function WrapMyCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall';

function ISArcExtract(CurComponent:longword; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: BOOL ):BOOL; external 'ISArcExtract@files:ISDone.dll stdcall';
function IS7ZipExtract(CurComponent:longword; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):BOOL; external 'IS7zipExtract@files:ISDone.dll stdcall';
function ISRarExtract(CurComponent:longword; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):BOOL; external 'ISRarExtract@files:ISDone.dll stdcall';
function ISPrecompExtract(CurComponent:longword; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):BOOL; external 'ISPrecompExtract@files:ISDone.dll stdcall';
function ISSRepExtract(CurComponent:longword; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):BOOL; external 'ISSrepExtract@files:ISDone.dll stdcall';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):BOOL; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall';
function ISDoneInitialize(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:longword; PrecompVers: double; RecursiveSubDir:boolean; WinHandle, NeededMem:longint; callback:TCallback):BOOL; external 'ISDoneInitialize@files:ISDone.dll stdcall';
function ISDoneStop:BOOL; external 'ISDoneStop@files:ISDone.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
  if OveralPct<=1000 then ISDoneProgressBar1.Position := OveralPct;
  LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
#ifdef SecondProgressBar
  if CurrentPct<=1000 then
    ISDoneProgressBar2.Position := CurrentPct;
  LabelPct2.Caption := IntToStr(CurrentPct div 10)+'.'+chr(48 + CurrentPct mod 10)+'%';
#endif
  LabelCurrFileName.Caption:=MinimizePathName(ExpandConstant('{cm:ExtractedFile} ')+CurrentFile, LabelCurrFileName.Font, LabelCurrFileName.Width);
  LabelTime1.Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
  LabelTime2.Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
  LabelTime3.Caption:=ExpandConstant('{cm:AllElapsedTime}')+TimeStr3;
  Result := Cancel;
end;

procedure CancelButtonOnClick(Sender: TObject);
begin
  if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then Cancel:=1;
end;

procedure HideComponents;
begin
  WizardForm.FileNamelabel.Hide;
  ISDoneProgressBar1.Hide;
  LabelPct1.Hide;
  LabelCurrFileName.Hide;
  LabelTime1.Hide;
  LabelTime2.Hide;
  MyCancelButton.Hide;
#ifdef SecondProgressBar
  ISDoneProgressBar2.Hide;
  LabelPct2.Hide;
#endif
end;

procedure ShowComponents;
var PBTop:integer;
begin
  PBTop:=ScaleY(50);
  ISDoneProgressBar1 := TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar1 do begin
    Parent  := WizardForm.InstallingPage;
    Height  := WizardForm.ProgressGauge.Height;
    Left    := ScaleX(0);
    Top      := PBTop;
    Width    := ScaleX(365);
    Max      := 1000;
  end;
  LabelPct1 := TLabel.Create(WizardForm);
  with LabelPct1 do begin
    Parent    := WizardForm.InstallingPage;
    AutoSize  := False;
    Left      := ISDoneProgressBar1.Width+ScaleX(5);
    Top      := ISDoneProgressBar1.Top + ScaleY(2);
    Width    := ScaleX(80);
  end;
  LabelCurrFileName := TLabel.Create(WizardForm);
  with LabelCurrFileName do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := ISDoneProgressBar1.Width+ScaleX(30);
    Left    := ScaleX(0);
    Top      := ScaleY(30);
  end;
#ifdef SecondProgressBar
  PBTop:=PBTop+ScaleY(25);
  ISDoneProgressBar2 := TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar2 do begin
    Parent  := WizardForm.InstallingPage;
    Left    := ScaleX(0);
    Top      := PBTop+ScaleY(8);
    Width    := ISDoneProgressBar1.Width;
    Max      := 1000;
    Height  := WizardForm.ProgressGauge.Height;
  end;
  LabelPct2 := TLabel.Create(WizardForm);
  with LabelPct2 do begin
    Parent    := WizardForm.InstallingPage;
    AutoSize  := False;
    Left      := ISDoneProgressBar2.Width+ScaleX(5);
    Top      := ISDoneProgressBar2.Top + ScaleY(2);
    Width    := ScaleX(80);
  end;
#endif
  LabelTime1 := TLabel.Create(WizardForm);
  with LabelTime1 do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := ISDoneProgressBar1.Width div 2;
    Left    := ScaleX(0);
    Top      := PBTop + ScaleY(35);
  end;
  LabelTime2 := TLabel.Create(WizardForm);
  with LabelTime2 do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := LabelTime1.Width+ScaleX(40);
    Left    := ISDoneProgressBar1.Width div 2;
    Top      := LabelTime1.Top;
  end;
  LabelTime3 := TLabel.Create(WizardForm);
  with LabelTime3 do begin
    Parent  := WizardForm.FinishedPage;
    AutoSize := False;
    Width    := 300;
    Left    := 180;
    Top      := 200;
  end;
  MyCancelButton:=TButton.Create(WizardForm);
  with MyCancelButton do begin
    Parent:=WizardForm;
    Width:=ScaleX(135);
    Caption:=ExpandConstant('{cm:CancelButton}');
    Left:=ScaleX(360);
    Top:=WizardForm.cancelbutton.top;
    OnClick:=@CancelButtonOnClick;
  end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  if (CurPageID = wpFinished) and MyError then
  begin
    LabelTime3.Hide;
    WizardForm.Caption:= ExpandConstant('{cm:Error}');
    WizardForm.FinishedLabel.Font.Color:= clRed;
    WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
  end;
end;

function CheckError:boolean;
begin
  result:= not MyError;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var Comps1,Comps2,Comps3, TmpValue:longword;
ResultCode:Integer;
tmp:integer;
IsExtracted:integer;
begin
  if CurStep = ssInstall then begin  //Если необходимо, можно поменять на ssPostInstall
    WizardForm.ProgressGauge.Hide;
    WizardForm.CancelButton.Hide;
    ShowComponents;
    WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
    Cancel:=0;

// Распаковка всех необходимых файлов в папку {tmp}.

//    ExtractTemporaryFile('arc.ini');
//    ExtractTemporaryFile('srep.exe');

#ifdef records
    ExtractTemporaryFile('records.inf');
#endif
#ifdef precomp04
    ExtractTemporaryFile('packjpg_dll.dll');
    ExtractTemporaryFile('RTconsole.exe');
    ExtractTemporaryFile('precomp04.exe');
#endif
#ifdef precomp038
    ExtractTemporaryFile('packjpg_dll.dll');
    ExtractTemporaryFile('RTconsole.exe');
    ExtractTemporaryFile('precomp038.exe');
    ExtractTemporaryFile('zlib1.dll');
#endif
#ifdef unrar
    ExtractTemporaryFile('Unrar.dll');
#endif

Comps1:=0;
TmpValue:=1;
if IsComponentSelected('GameCore') then Comps1:=Comps1+TmpValue;    //компонент 1
TmpValue:=TmpValue*2;
IsExtracted:=0;

#ifdef precomp04
    PCFVer:=0.4;
#else
#ifdef precomp038
    PCFVer:=0.38;
#else
    PCFVer:=0;
#endif
#endif
repeat
MyError:=true;
if not ISDoneInitialize(ExpandConstant('{tmp}\records.inf'), $F777, Comps1,Comps2,Comps3, PCFVer, false, MainForm.Handle, {#NeedMem}, @ProgressCallback) then break;
repeat
if not IS7ZipExtract (1, 0, ExpandConstant('{src}\setup.bin'), ExpandConstant('{app}\'), false,  '123') then break; //тот самый архив первого компонента
 MyError:=false;
      until true;
      ISDoneStop;
    until true;
    HideComponents;
    WizardForm.CancelButton.Visible:=true;
    WizardForm.CancelButton.Enabled:=false;
        IsExtracted:=1;
  end;
 if (IsComponentSelected('RevEmu')) and (CurStep=ssDone) then begin
Exec(ExpandConstant('{app}\UltimateNameChanger.exe'), '', '', SW_SHOW, ewNoWait, ResultCode);
end;
if (CurStep=ssPostInstall) and MyError then begin
Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, tmp);
end;
end;

То есть инно сетап считает первый компонент "пустым", потому что там только распаковка архива сетап.бин Проблема в том, что инно сетап обрабатывает первый компонент, начинает распаковывать архив и не дожидаясь распаковки этого архива устанавливает второй компонент, мне нужно чтобы второй компонент начал устанавливаться только после завершения распаковки архива. Надеюсь сейчас описал проблему лучше.

R.i.m.s.k.y. 21-11-2011 14:59 1799890

Belial4444,
c исданом не работал, но думаю трабла в том что на шаге CurStep=ssInstall инсталлер отдает на распаковку архив, а сам переходит к CurStep=ssDone где распаковывает эмулятор

Aplle 21-11-2011 17:21 1799987

Что делать с этой частью скрипта??? Выбивает тут ошибка. как поменять на свою версию. версия: 5,4,2(u)

type
#ifdef UNICODE ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
#define A "W"
#else
#define A "A" ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
PAnsiChar = PChar; // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже)
#endif
#if Ver < 84018176
AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif

Aplle 21-11-2011 17:22 1799989

Что делать с этой частью скрипта??? Выбивает тут ошибка. как поменять на свою версию. версия: 5,4,2(u)

type
#ifdef UNICODE ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
#define A "W"
#else
#define A "A" ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
PAnsiChar = PChar; // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже)
#endif
#if Ver < 84018176
AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif

ZverBY 21-11-2011 17:23 1799990

Кто-нибудь может достать либо сделать скрипт, как ТУТ (см. в спойлере "Скриншоты инсталляторов") ???

Aplle 21-11-2011 18:05 1800022

Что делать с этой ошибкой??
Изображение удалено модератором. Нарушение ОПК 3.9

valyok666 21-11-2011 19:41 1800098

PAnsiChar = PChar; // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже)
AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)

ненужны

ZverBY 21-11-2011 20:26 1800147

Кто-нибудь может достать либо сделать скрипт, как ТУТ (см. в спойлере "Скриншоты инсталляторов") ???

Gnom_aka_Lexander 21-11-2011 20:39 1800159

Написано-же - отсутствует ; в конце строкм.

Aplle 21-11-2011 21:22 1800194

Как тут поставить свой размер??? http://radikal.ua/data/upload/0fccf/...00fa557703.jpg

Aplle 21-11-2011 21:22 1800196

Как тут поставить свой размер???
Изображение удалено модератором. Нарушение ОПК 3.9

Rikill 21-11-2011 21:23 1800197

ZverBY,
Цитата:

Вам был закрыт доступ к форуму



You have been banned from this forum.
Выкладывай сюда скрины.

Aplle 21-11-2011 21:26 1800202

Вот
Изображение удалено модератором.
Aplle внимательно читаем правила концеренции, особенно пункт 3.9
Цитата:

Запрещается:
Вставлять в сообщение рисунок разрешением более 640x480 или размером более 40Кб. Такие рисунки разрешено указывать только в виде ссылки. Вы можете прикрепить рисунок к сообщению в расширенном режиме ответа.
При повторении подобного приму меры.

Aplle 21-11-2011 21:49 1800212

Помогите c ошибкой

Aplle 21-11-2011 21:50 1800213

Помогите с ошибкой.

valyok666 21-11-2011 21:54 1800217

Aplle, duplicat тоесть у тебя уже есть эта строчка удали или закомментируй эту

Aplle 21-11-2011 21:55 1800218

а как закоментировать можно?

valyok666 21-11-2011 21:57 1800220

Aplle, // поставь перед строчкой

insombia 21-11-2011 22:12 1800232

Aplle вот место на диске

kenny_danger 21-11-2011 22:12 1800233

извините за глупый вопрос
но как сделать так чтобы после установи инсталятор предложил перейти на сайт автора
всю голову уже сломал

Belial4444 21-11-2011 22:20 1800236

kenny_danger, прописываешь в секцию [Run]
Filename: "http://www.oszone.net"; Description: "Форум для продвинутых"; Flags: postinstall shellexec skipifsilent
R.i.m.s.k.y, что мне сделать тогда предлагаешь?:) Да кстати есть ещё проблемка, при указании директории установки к ней дописывается последняя папка, приведу пример, по дефолту папка установки C:\Valve\Left4Dead2\ , хочу установить в C:\Valve2\Left4Dead2\ выбираю эту папку а у меня пишется C:\Valve2\Left4Dead2\Left4Dead2 подскажите пожалуйста как избавиться от этого бага, в NSIS такой баг лечился добавлением "\" в конце дефолтной папки, но я я так и делал а баг все равно возникает

R.i.m.s.k.y. 21-11-2011 22:26 1800238

Belial4444, про исдоне я тебе ничего конкретно не скажу, извини
если мое предположение верно я бы попробовал функции распаковки не раскидывать по двум CurStep'ам, а в одной CurStep=ssInstall собрать

а про дубли в пути если это стандартными средствами - попробуй в секции Setup у параметра DefaultDirName={pf}\Left4Dead2 удали хвост Left4Dead2
Код:

[Setup]
DefaultDirName={pf}\

в инно писать научился, а разделять предложения знаками пунктуации - нет :read:

Belial4444 21-11-2011 22:28 1800239

R.i.m.s.k.y, попробовал сейчас как ты сказал, все так же, теперь приписывает в конце Program Files :)

valyok666 21-11-2011 22:30 1800241

Belial4444, DefaultDirName=\valve\{#MyAppName}

R.i.m.s.k.y. 21-11-2011 22:34 1800247

Belial4444,
[Setup]
DefaultDirName=\
или вообще параметр оставь пустым

Belial4444 21-11-2011 22:34 1800248

valyok666, попробовал баг остался)
Код:

#define MyAppName "Left4Dead2"
[Setup]
DefaultDirName={pf}\{#MyAppName}

R.i.m.s.k.y, ок сейчас попробую..
Попробовал DefaultDirName=\ кгдазаупскаю путь по дефолту ставится C:\, а когда любую папку выбираю к ней дописывается \Новая папка 0_0 Сейчас просто пустой попробую..
С пустым параметром путь по умолчанию пуст, но все равно приписывается \новая папка , что делать?))

valyok666 21-11-2011 22:36 1800249

Belial4444, замени его DefaultDirName=\valve\{#MyAppName}
{pf} убери

R.i.m.s.k.y. 21-11-2011 22:37 1800250

Belial4444, в общем истина где-то рядом
комбинируй :)

valyok666 21-11-2011 22:37 1800251

Belial4444, всё понял сам описался)

R.i.m.s.k.y. 21-11-2011 22:43 1800256

у меня вопрос не такой простой как с папками
подскажите, пожалуйста, как узнать запущено ли программа у пользователя или нет не используя WMI
вопрос со звездочкой - исдоне для этого использует WMI или нет?
я бы и сам попробовал, но не могу воспроизвести проблему с крашащимися WMI-запросами инсталлера, у меня все робит
Ошибка инсталлера - SWbemSecurity: Generic Failure

kenny_danger 21-11-2011 22:55 1800267

Belial4444,
[Setup]
AppendDefaultDirName=False

Belial4444 21-11-2011 22:57 1800269

kenny_danger,спасибо большое! Ты меня просто спас :) Может ты знаешь ответ и на мой вопрос про исдан?

kenny_danger 21-11-2011 23:02 1800271

Belial4444, к сожалению не знаю)

Belial4444 21-11-2011 23:10 1800279

Ладно спасибо), если разберусь напишу как)

BigBoo 22-11-2011 13:24 1800656

Можно ли и что прописать в скрипте, чтобы у скомпилированного приложения в папке Output была не стандартная, а нужная мне иконка, к примеру иконка exe-файла из {app}?

nik1967 22-11-2011 13:59 1800687

BigBoo,
Код:

[Setup]
SetupIconFile=путь до файла .ico


El Sanchez 22-11-2011 14:04 1800689

Цитата:

Цитата R.i.m.s.k.y.
как узнать запущено ли программа у пользователя или нет не используя WMI »

R.i.m.s.k.y.,
читать дальше »

Код:

[code]
const
    TH32CS_SNAPPROCESS = $2;
    INVALID_HANDLE_VALUE = -1;
   
type
    TPROCESSENTRY32 = record
        dwSize, cntUsage, th32ProcessID: DWORD;
        th32DefaultHeapID: Longint;
        th32ModuleID, cntThreads, th32ParentProcessID: DWORD;
        pcPriClassBase: Longint;
        dwFlags: DWORD;
        szExeFile: array [0..259] of char;
    end;

function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall';
function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall';
function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): Boolean; external 'CloseHandle@kernel32.dll stdcall';


function IsProcessRunning(FileName: String): Boolean; //FileName - имя exe-файла процесса
var
    hProcessSnap: THandle;
    pe32: TPROCESSENTRY32;
    szExeFile: String;
begin
    hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if hProcessSnap = INVALID_HANDLE_VALUE then Exit;
    pe32.dwSize := sizeof(pe32);
    if not Process32First(hProcessSnap, pe32) then Exit;
    while not Result and Process32Next(hProcessSnap, pe32) do
    begin
        szExeFile := '';
        while not (pe32.szExeFile[Length(szExeFile)] = #0) do szExeFile := szExeFile + pe32.szExeFile[Length(szExeFile)];
        Result := LowerCase(FileName) = LowerCase(szExeFile);
    end;
    CloseHandle(hProcessSnap);
end;

procedure InitializeWizard();
begin
    // запущен ли калькулятор
    if IsProcessRunning('calc.exe') then
        MsgBox('yes', mbInformation, MB_OK)
    else
        MsgBox('no', mbError, MB_OK);
end;



Цитата:

Цитата R.i.m.s.k.y.
но не могу воспроизвести проблему с крашащимися WMI-запросами инсталлера, у меня все робит
Ошибка инсталлера - SWbemSecurity: Generic Failure »

R.i.m.s.k.y., пример можно?

Цитата:

Цитата BigBoo
Можно ли и что прописать в скрипте, чтобы у скомпилированного приложения в папке Output была не стандартная, а нужная мне иконка, к примеру иконка exe-файла из {app}? »

BigBoo, иконку придется выдирать самому из файла и использовать с директивой SetupIconFile секции Setup.

nik1967 22-11-2011 14:09 1800695

Цитата:

Цитата El Sanchez
BigBoo, иконку придется выдирать самому из файла и использовать с директивой SetupIconFile секции Setup. »

А я не то же самое написал?

R.i.m.s.k.y. 22-11-2011 14:12 1800698

Цитата:

Цитата El Sanchez
R.i.m.s.k.y., пример можно? »

вот тут ветка
Куски скрипта
Код:

function IsProcessRunning(FileName: String): Boolean;
var
  objSWbemLocator, objSWbemServices: Variant;
begin
  try
    objSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  except
    ShowExceptionMessage;
    Exit;
  end;
  objSWbemServices := objSWbemLocator.ConnectServer();
  objSWbemServices.Security_.ImpersonationLevel := 3;
  Result := (objSWbemServices.ExecQuery('SELECT * FROM Win32_Process WHERE Name="' + FileName + '"').Count > 0);
end;


Function InitializeSetup: Boolean;
Begin
...
  if IsProcessRunning('mpc-hc.exe') then s_apprun := s_apprun + #13#10 + '- Media Player Classic Home Cinema'; //формируется строка с перечислением приложений которые надо закрыть
...

Спасибо!

El Sanchez 22-11-2011 14:50 1800735


Цитата:

Цитата nik1967
А я не то же самое написал? »

nik1967, то же самое, у нас с вами почти одновременные сообщения :)

ZverBY 22-11-2011 19:16 1801005

Кто-нибудь может сделать скрипт с вот таким оформлением:


Скрывайте пожалуйста большие сообщения тегом [more]

insombia 22-11-2011 19:17 1801007

ZverBYи зачем он тебе?придумай что-то свое
p.s.Скрипт есть у самой группы

valyok666 22-11-2011 19:28 1801020

ZverBY, insombia, это группа делает практически тоже самое что и R.G Catalyst

volk1234 22-11-2011 22:19 1801150

Гражданин\Господин Aplle !
Изображения таких больших размеров выкладывать в форуме запрещено. Используйте иконки как в последнем своем сообщении.
"Романенко! Фу-фу-фу!" (С)

Gnom_aka_Lexander 23-11-2011 08:23 1801364

Цитата:

Цитата Aplle
Помогите c ошибкой »

Тебе компилятор говорит, что такая константа уже объявлена. просто удали эту строчку.

Vista-w 23-11-2011 11:24 1801514

ZverBY,
Скрипт простенький написать не составит труда.)

Gonies 23-11-2011 14:37 1801658

что нужно добавить в скрипт чтоб программа при инсталляции добавлялась в службу windows ?

R.i.m.s.k.y. 23-11-2011 14:59 1801677

Цитата:

Цитата Gonies
что нужно добавить в скрипт чтоб программа при инсталляции добавлялась в службу windows »

экспортируй к примеру \\\Registry\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\AppMgmt\ и посмотри на
DisplayName - имя отображаемое
Start - тип запуска
ImagePath - путь

ZverBY 23-11-2011 16:53 1801777

insombia, valyok666, Vista-w, автор этого скрипта не хочет делиться !!! А я сам не знаю как его сделать, могу только отредактировать под себя !!!

Rikill 23-11-2011 23:30 1802051

ZverBY, значит сиди и делай сам, потому, что никто ссориться с авторами не хочет.

valyok666 24-11-2011 10:07 1802201

Rikill, +1 ZverBY, есть закос по R.G Catalyst скрипт похожий просто уменьшаешь окно и ещё помелочам вот и всё

LinkOFF 24-11-2011 18:16 1802573

Люди подскажите пожалуйста куда прописывать пароль от архива freearc в скрипте isdone 0.6f

MarkusEVO 24-11-2011 18:41 1802589

Народ помогите, не могу разобраться в чем причина ошибки!!!



Пробывал уже и не сжимать, всё равно ошибку вот такую выдаёт...

если убераю архив ISO.arc, всё работает!

valyok666 24-11-2011 21:42 1802681

MarkusEVO, ты ошибку хоть переводил?тебе места не хватает

MarkusEVO 25-11-2011 05:29 1802848

valyok666, Конечно переводил. У меня свободно на жестком очень много! Незнаю в чем проблема этой сранной ошибки...

MarkusEVO 25-11-2011 05:45 1802850

На жёстком свободно 600 Гб

R.i.m.s.k.y. 25-11-2011 08:02 1802871

MarkusEVO
Код:

[Setup]
DiskSpanning=yes
DiskSliceSize=2100000000 //max


MarkusEVO 25-11-2011 08:08 1802874

R.i.m.s.k.y., выдаёт ошибку


R.i.m.s.k.y. 25-11-2011 08:12 1802877

MarkusEVO, если бы я щаз сидел дома на модеме я бы тебя проклял за такие скрины! :)
1) копируй само сообщение об ошибке
мало кто знает, но если в виндовом окне ошибки нажать CTRL+C то скопируется текст этого окна! ну и соответсвенно этот текст можно вставить в форум
2) если религия разрешает только принтскринить то пользуйся ALT+PrintScreen - в буфер попадет активное окно, а не весь монитор с кактусами

по ошибке - убери //max, я думал ты поймешь что этот камент означает максимальный размер = 2100000000
Код:

[Setup]
DiskSpanning=yes
DiskSliceSize=2100000000


Devils Night 25-11-2011 08:14 1802878

Aplle, ты не в тему, тебе вообще то сюда .
Цитата:

Цитата Aplle
Нарушение ОПК 3.9 »

volk1234, А 3.7 уже не считается?
Цитата:

Цитата ZverBY
Кто-нибудь может достать либо сделать скрипт »

Тебя это тоже касается. Нарушение ОПК 3.7

MarkusEVO 25-11-2011 08:27 1802883

Всё заработало! Убрал не нужное....
Код:

[Setup]
DiskSpanning=yes
DiskSliceSize=max

R.i.m.s.k.y., спасибо я сделал вот так проверил всё работает!
Ты н ругайся я еще в этом чайнк имею дела с этой прогой всего лишь неделю :)

R.i.m.s.k.y. 25-11-2011 08:32 1802887

MarkusEVO
1) Я не ругаюсь, просто хотелось бы чтобы люди читали справку перед задаванием вопросов
в шапке темы есть русская справка по инно, староватая но сгодится
2) Старайся писать просто и грамотно, не бойся знаков препинания, это помогает тебя понять.
3) Дави "полезное сообщение" если сообщение помогло :)

спасибо за внимание!

MarkusEVO 25-11-2011 08:33 1802888

Народ подскажите как можно сделать, чтобы при нажатие "У Вас 64bit Система" потемнела строка "У Вас 32bit Система" и была не доступна и наоборот!?
Вот скрин на мой Инстал:


R.i.m.s.k.y., друг я сразу же нажал на полезное сообщение :yahoo:
Спасибо тебе еще раз!
Может и в этом сообщение поможешь, тогда точно будет царить в этом мире счастье :bow:

R.i.m.s.k.y. 25-11-2011 08:44 1802891

MarkusEVO, по сабжу - для систем х64 надо ставить и х32 компоненты тоже, так что х32 компоненты засвечивать в системах х64 не нужно
а так есть системная функция IsWin64 - возвращает True если инсталлер запущен под виндой х64
более детально нужен кусок кода который рисует это окно
но с кодовым оформлением я не помощник, я его не знаю и вообще пустая трата времени

MarkusEVO 25-11-2011 08:49 1802894

Ну вобщем вот код отвечающий з эту страничку в инстале:
Код:

////////////////////// SelectTasksPade //////////////////////

  SelectTasksPage := CreateCustomPage(wpSelectProgramGroup, ExpandConstant('{cm:TasksName}'), ExpandConstant('{cm:TasksDescription}'));
  SelectTasksLabel := TLabel.Create(WizardForm);
  with SelectTasksLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(120), ScaleY(250), ScaleX(600), ScaleY(50));
    WordWrap:= True;
    Transparent:=True;
    Font.Name:= 'Georgia'           
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold, fsItalic];
    Caption:= ExpandConstant('{cm:SelectTasksLabel}');
    Parent := WizardForm;
  end;

  DesktopCheck:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(303),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(DesktopCheck,BtnClickEventID,WrapBtnCallback(@DesktopClick,1));
  BtnSetEvent(DesktopCheck,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(DesktopCheck,GetSysCursorHandle(32649));
 
  DesktopLabel := TLabel.Create(WizardForm);
  with DesktopLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(310), ScaleX(265), ScaleY(17));
    OnClick:= @DesktopLabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:Desktop}');
    Parent := WizardForm;
  end;
 
  QuickLaunchCheck:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(333),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(QuickLaunchCheck,BtnClickEventID,WrapBtnCallback(@QuickLaunchClick,1));
  BtnSetEvent(QuickLaunchCheck,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(QuickLaunchCheck,GetSysCursorHandle(32649));

  QuickLaunchLabel := TLabel.Create(WizardForm);
  with QuickLaunchLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(340), ScaleX(345), ScaleY(17));
    OnClick:= @QuickLaunchLabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:QuickLaunch}');
    Parent := WizardForm;
  end;

  SystimeBitx32Check:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(363),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(SystimeBitx32Check,BtnClickEventID,WrapBtnCallback(@SystimeBitx32Click,1));
  BtnSetEvent(SystimeBitx32Check,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(SystimeBitx32Check,GetSysCursorHandle(32649));

  SystimeBitx32Label := TLabel.Create(WizardForm);
  with SystimeBitx32Label do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(370), ScaleX(155), ScaleY(17));
    OnClick:= @SystimeBitx32LabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:SystimeBitx32}');
    Parent := WizardForm;
  end;

  SystimeBitx64Check:=BtnCreate(WizardForm.Handle,ScaleX(285),ScaleY(363),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(SystimeBitx64Check,BtnClickEventID,WrapBtnCallback(@SystimeBitx64Click,1));
  BtnSetEvent(SystimeBitx64Check,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(SystimeBitx64Check,GetSysCursorHandle(32649));

  SystimeBitx64Label := TLabel.Create(WizardForm);
  with SystimeBitx64Label do begin
    AutoSize:=False;
    SetBounds(ScaleX(325), ScaleY(370), ScaleX(155), ScaleY(17));
    OnClick:= @SystimeBitx64LabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:SystimeBitx64}');
    Parent := WizardForm;
  end;

  LanguageLabel := TLabel.Create(WizardForm);
  with LanguageLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(410), ScaleX(400), ScaleY(17));
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=clLime;
    Font.Style:=[fsBold, fsItalic];
    Caption:= ExpandConstant('{cm:Language}');
    Parent := WizardForm;
  end;

  LngNameLbl := TLabel.Create(WizardForm);
  with LngNameLbl do begin
    AutoSize:=False;
    SetBounds(ScaleX(300), ScaleY(410), ScaleX(100), ScaleY(17));
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=clLime;
    Font.Style:=[fsBold, fsItalic];
    Parent := WizardForm;
  end;

  LanguageButton[1]:=BtnCreate(WizardForm.Handle,ScaleX(395),ScaleY(403),ScaleX(48),ScaleY(36),ExpandConstant('{tmp}\us.png'),0,True);
  BtnSetEvent(LanguageButton[1],BtnClickEventID,WrapBtnCallback(@SelectLanguage,1));
  BtnSetEvent(LanguageButton[1],BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(LanguageButton[1],GetSysCursorHandle(32649));

  BtnSetChecked(LanguageButton[1],True);

////////////////////// SelectTasksPade //////////////////////

Вот не большой пример в инстале при выборе создания папке в меню пуск:

и если нажать не создавать получается, что кнопка обзор и строка пути, она темнеет и становится не доступной:

R.i.m.s.k.y. 25-11-2011 09:09 1802903

MarkusEVO,
ну не обещаю что сработает
советую проверить на вин32 и вин64
а про обзор ничего не скажу, ну не знаю я оформление инно, и прекрасно себя чуйствую
Код:

////////////////////// SelectTasksPade //////////////////////

  SelectTasksPage := CreateCustomPage(wpSelectProgramGroup, ExpandConstant('{cm:TasksName}'), ExpandConstant('{cm:TasksDescription}'));
  SelectTasksLabel := TLabel.Create(WizardForm);
  with SelectTasksLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(120), ScaleY(250), ScaleX(600), ScaleY(50));
    WordWrap:= True;
    Transparent:=True;
    Font.Name:= 'Georgia'           
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold, fsItalic];
    Caption:= ExpandConstant('{cm:SelectTasksLabel}');
    Parent := WizardForm;
  end;

  DesktopCheck:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(303),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(DesktopCheck,BtnClickEventID,WrapBtnCallback(@DesktopClick,1));
  BtnSetEvent(DesktopCheck,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(DesktopCheck,GetSysCursorHandle(32649));
 
  DesktopLabel := TLabel.Create(WizardForm);
  with DesktopLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(310), ScaleX(265), ScaleY(17));
    OnClick:= @DesktopLabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:Desktop}');
    Parent := WizardForm;
  end;
 
  QuickLaunchCheck:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(333),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(QuickLaunchCheck,BtnClickEventID,WrapBtnCallback(@QuickLaunchClick,1));
  BtnSetEvent(QuickLaunchCheck,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(QuickLaunchCheck,GetSysCursorHandle(32649));

  QuickLaunchLabel := TLabel.Create(WizardForm);
  with QuickLaunchLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(340), ScaleX(345), ScaleY(17));
    OnClick:= @QuickLaunchLabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:QuickLaunch}');
    Parent := WizardForm;
  end;

  SystimeBitx32Check:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(363),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(SystimeBitx32Check,BtnClickEventID,WrapBtnCallback(@SystimeBitx32Click,1));
  BtnSetEvent(SystimeBitx32Check,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(SystimeBitx32Check,GetSysCursorHandle(32649));

  SystimeBitx32Label := TLabel.Create(WizardForm);
  with SystimeBitx32Label do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(370), ScaleX(155), ScaleY(17));
    OnClick:= @SystimeBitx32LabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:SystimeBitx32}');
    Parent := WizardForm;
  end;


//скрываем лейбл х64 на вин-х32
if IsWin64 then begin
  SystimeBitx64Check:=BtnCreate(WizardForm.Handle,ScaleX(285),ScaleY(363),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(SystimeBitx64Check,BtnClickEventID,WrapBtnCallback(@SystimeBitx64Click,1));
  BtnSetEvent(SystimeBitx64Check,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(SystimeBitx64Check,GetSysCursorHandle(32649));


  SystimeBitx64Label := TLabel.Create(WizardForm);
  with SystimeBitx64Label do begin
    AutoSize:=False;
    SetBounds(ScaleX(325), ScaleY(370), ScaleX(155), ScaleY(17));
    OnClick:= @SystimeBitx64LabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:SystimeBitx64}');
    Parent := WizardForm;
  end;
end; //if IsWin64

  LanguageLabel := TLabel.Create(WizardForm);
  with LanguageLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(410), ScaleX(400), ScaleY(17));
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=clLime;
    Font.Style:=[fsBold, fsItalic];
    Caption:= ExpandConstant('{cm:Language}');
    Parent := WizardForm;
  end;

  LngNameLbl := TLabel.Create(WizardForm);
  with LngNameLbl do begin
    AutoSize:=False;
    SetBounds(ScaleX(300), ScaleY(410), ScaleX(100), ScaleY(17));
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=clLime;
    Font.Style:=[fsBold, fsItalic];
    Parent := WizardForm;
  end;

  LanguageButton[1]:=BtnCreate(WizardForm.Handle,ScaleX(395),ScaleY(403),ScaleX(48),ScaleY(36),ExpandConstant('{tmp}\us.png'),0,True);
  BtnSetEvent(LanguageButton[1],BtnClickEventID,WrapBtnCallback(@SelectLanguage,1));
  BtnSetEvent(LanguageButton[1],BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(LanguageButton[1],GetSysCursorHandle(32649));

  BtnSetChecked(LanguageButton[1],True);

////////////////////// SelectTasksPade //////////////////////


MarkusEVO 25-11-2011 09:18 1802906

R.i.m.s.k.y., то есть ты сделал так, чтобы автоматически скрывалась?

Сейчас проверим!

R.i.m.s.k.y., всё осталось как и прежне.

R.i.m.s.k.y. 25-11-2011 09:30 1802914

MarkusEVO, значит венда х64
я ж выше написал что для вин-х64 надо ставить и х32 компоненты тоже
я поставил просто проверку на вин64, вот и все,
лейблы не скрываются, а не_создаются, это две разные разницы

если хочешь сделать неправильно
Код:

if (not IsWin64) then begin

  SystimeBitx32Check:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(363),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(SystimeBitx32Check,BtnClickEventID,WrapBtnCallback(@SystimeBitx32Click,1));
  BtnSetEvent(SystimeBitx32Check,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(SystimeBitx32Check,GetSysCursorHandle(32649));

  SystimeBitx32Label := TLabel.Create(WizardForm);
  with SystimeBitx32Label do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(370), ScaleX(155), ScaleY(17));
    OnClick:= @SystimeBitx32LabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:SystimeBitx32}');
    Parent := WizardForm;
  end;
end; //if (not IsWin64)


MarkusEVO 25-11-2011 09:43 1802921



R.i.m.s.k.y., ладно не буду тебя мучить, может кто другой поможет! Всё равно спасибо тебе.

А вот код страницы про создание папки в меню Пуск:
Код:

////////////////////// SelectProgramGroupPage //////////////////////

  SelectStartMenuFolderBrowseLabel := TLabel.Create(WizardForm);
  with SelectStartMenuFolderBrowseLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(120), ScaleY(250), ScaleX(600), ScaleY(50));
    WordWrap:= True;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold, fsItalic];
    Caption:= WizardForm.SelectStartMenuFolderBrowseLabel.Caption;
    Parent := WizardForm;
  end;                           

  GroupEditLabel := TLabel.Create(WizardForm);
  with GroupEditLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(127), ScaleY(308), ScaleX(446), ScaleY(15));
    WordWrap:= True;
    ShowAccelChar := False;
    Transparent:=True;
    Font.Name:= 'Arial'
    Font.Size:= 9;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold];
    Caption := MinimizePathName(WizardForm.GroupEdit.Text, GroupEditLabel.Font, GroupEditLabel.Width);
    Parent := WizardForm;
  end;

  NoIconsCheck:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(430),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(NoIconsCheck,BtnClickEventID,WrapBtnCallback(@NoIconsClick,1));
  BtnSetEvent(NoIconsCheck,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(NoIconsCheck,GetSysCursorHandle(32649));

  NoIconsLabel := TLabel.Create(WizardForm);
  with NoIconsLabel do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(437), ScaleX(275), ScaleY(17));
    OnClick:= @NoIconsLabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := WizardForm.NoIconsCheck.Caption;
    Parent := WizardForm;
  end;

  WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text;
  WizardForm.GroupEdit.OnChange := @GroupChange;

////////////////////// SelectProgramGroupPage //////////////////////


Gnom_aka_Lexander 25-11-2011 20:12 1803431

MarkusEVO, там, такто, не в создании, там на клик выключенное состояние вешается. в твоем случае, все строчки, на которые ругнется таким-же образом - нужно обрамлять в то-же условие:
Код:

if (not IsWin64) then
... строчка на которую ругнулось

если таких строчек несколько подряд, то так:
  if (not IsWin64) then
    begin
    ... строчка на которую ругнулось
    ... строчка на которую ругнулось
    ... строчка на которую ругнулось
  end;


LinkOFF 25-11-2011 21:37 1803471

подскажите как чтоб после установки была кнопочка "Начать игру" рядом с "Завершить".Ну и собственно игра запускалась.

valyok666 25-11-2011 21:41 1803477

LinkOFF, создай кнопку процедурой прикрепи к ней функцию запуска ехе файла

MarkusEVO 25-11-2011 23:20 1803529

Всё, разобрался, сделал вот так:
Код:

if (not IsWin64) then begin
  SystimeBitx32Check:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(363),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(SystimeBitx32Check,BtnClickEventID,WrapBtnCallback(@SystimeBitx32Click,1));
  BtnSetEvent(SystimeBitx32Check,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(SystimeBitx32Check,GetSysCursorHandle(32649));

  SystimeBitx32Label := TLabel.Create(WizardForm);
  with SystimeBitx32Label do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(370), ScaleX(155), ScaleY(17));
    OnClick:= @SystimeBitx32LabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:SystimeBitx32}');
    Parent := WizardForm;
  end;
end;

if IsWin64 then begin
  SystimeBitx64Check:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(363),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  BtnSetEvent(SystimeBitx64Check,BtnClickEventID,WrapBtnCallback(@SystimeBitx64Click,1));
  BtnSetEvent(SystimeBitx64Check,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetCursor(SystimeBitx64Check,GetSysCursorHandle(32649));

  SystimeBitx64Label := TLabel.Create(WizardForm);
  with SystimeBitx64Label do begin
    AutoSize:=False;
    SetBounds(ScaleX(115), ScaleY(370), ScaleX(155), ScaleY(17));
    OnClick:= @SystimeBitx64LabelClick;
    Cursor:= CrHand;
    Transparent:=True;
    Font.Name:= 'Georgia'
    Font.Size:= 10;
    Font.Color:=$FFFFFF;
    Font.Style:=[fsBold,fsItalic];
    Caption := ExpandConstant('{cm:SystimeBitx64}');
    Parent := WizardForm;
  end;
end;

И в дальнейшем вставил, где выдаёт ошибки под функции 32 бит
Код:

if (not IsWin64) then
    begin
    ... строчка на которую ругнулось
    end;

а где под 64 би:
Код:

if IsWin64 then
  begin
  ... строчка на которую ругнулось
  end;


MarkusEVO 26-11-2011 09:50 1803650

Всё я разобрался, проверил на 32 битной и 64 битной системе, всё автоматически убирается! Спасибо...
Теперь нужна помощь в том, чтобы самому не ставить галочку, а чтобы уже автоматически стояла...

valyok666 26-11-2011 10:13 1803654

MarkusEVO, а ты думаешь пользователь глупый?

MarkusEVO 26-11-2011 10:19 1803656

Цитата:

Цитата valyok666
MarkusEVO, а ты думаешь пользователь глупый? »

Поверь моему опыту, что ДА :lol:
Бывает что такое задают, что аш реально хочется по головке пройтися, всё у них перед глазами написано и всё равно задают :biggrin:

valyok666 26-11-2011 10:23 1803660

MarkusEVO, Таких в наше время поискать надо))

MarkusEVO 26-11-2011 10:26 1803661

Цитата:

Цитата valyok666
MarkusEVO, Таких в наше время поискать надо)) »

Но они где то среди НАС)))
Ну так ты поможешь? Знаешь как?
Заранее благодарин :bow:

valyok666 26-11-2011 10:50 1803669

MarkusEVO, я просто ща не на своём компе дома буду посмотрю)

nik1967 26-11-2011 11:40 1803684

MarkusEVO, а файл "botva2.iss" не пробовал открыть?
читать дальше »
Код:

procedure BtnSetChecked(h :HWND; Value :boolean); external 'BtnSetChecked@{tmp}\botva2.dll stdcall delayload';
//устанвливает состояние (включена/выключена) кнопки (аналог Сheckbox.Checked:=True / Сheckbox.Checked:=False)
//h - хэндл кнопки (результат возвращенный BtnCreate)
//Value - значение состояния кнопки

В твоём случае:
Код:

if (not IsWin64) then begin
  SystimeBitx32Check:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(363),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  --------------------
  --------------------
  --------------------
  BtnSetChecked(SystimeBitx32Check,True);

if IsWin64 then begin
  SystimeBitx64Check:=BtnCreate(WizardForm.Handle,ScaleX(75),ScaleY(363),ScaleX(28),ScaleY(28),ExpandConstant('{tmp}\CheckBox.png'),8,True);
  --------------------
  --------------------
  --------------------
  BtnSetChecked(SystimeBitx64Check,True);


valyok666 26-11-2011 13:00 1803710

nik1967, без справок никуда ИМХО

Dark_Delphin 26-11-2011 19:16 1803864

Всем привет.
У кого-то есть скрипт рекодингов, тот что они юзают на даный момент?
Пару строчек хотел бы увидеть)

Rikill 26-11-2011 22:34 1803952

ntrx, скрины дай.

LinkOFF 26-11-2011 22:56 1803962

Цитата:

Цитата valyok666
LinkOFF, создай кнопку процедурой прикрепи к ней функцию запуска ехе файла »

Если б я знал как

Помогите мне с шифрованием архивов.Я создал архив FreeArc и поставил пароль, теперь мне нужно вписать в скрипт ISDone пароль чтоб распаковались архивы.Я облазил справку ISDone но не нашел ничего

Dark_Delphin 26-11-2011 23:55 1803990

Rikill, вот. Плагиатить не буду..


Rikill 27-11-2011 14:19 1804197

LinkOFF, что именно интересует в скрипте?

Gnom_aka_Lexander 27-11-2011 17:34 1804347

Цитата:

Цитата ntrx
Всем привет.
У кого-то есть скрипт рекодингов, тот что они юзают на даный момент?
Пару строчек хотел бы увидеть) »

Цитата:

Цитата ntrx
вот. Плагиатить не буду..
читать дальше » »

Оригинал тебе вряд-ли кто даст, а вот фейк накатать - пять минут работы в формдизайнере расширенной версии.
Вот, сляпал на скорую руку. Скачать.

MarkusEVO 27-11-2011 18:52 1804393

Цитата:

Цитата nik1967
MarkusEVO, а файл "botva2.iss" не пробовал открыть?
читать дальше » »

Благодарю, всё помогло и заработало!

R.i.m.s.k.y. 27-11-2011 18:53 1804396

Подскажите, пожалуйста, что написать в NextButtonClick чтобы "внутренности" отрабатывались только на странице wpSelectComponents
т.е. примерно так
Код:

function NextButtonClick(CurPageID:integer): Boolean;
begin
  Result:= True;
  If CurPageID=wpSelectComponents then begin
  ...
    Result:= False;
  end;
end;

я знаю что в NextButtonClick нельзя проверять If CurPageID, но как это правильно сделать?

Gnom_aka_Lexander 27-11-2011 18:59 1804402

NextButtonClick работает в момент перехода на страницу. приведенный код сработает, при переходе со страницы wpSelectComponents на следующую. А что именно нужно сделать?
Вот так будет более правильно, в моем понимании:
читать дальше »
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  case CurPageID of // условия при переходе со страниц
    wpSelectComponents:  // со страницы выбора компонентов
  begin
  ...
    Result:= False;
    end;
  end;
Result:= True; // общий результат если ни одно условие не подошло
end;

Цитата:

Цитата R.i.m.s.k.y.
я знаю что в NextButtonClick нельзя проверять If CurPageID »

непонятно тогда, для чего
Цитата:

Цитата R.i.m.s.k.y.
NextButtonClick(CurPageID:integer) »

CurPageID в параметре указан по умолчанию?

Обновил пост

R.i.m.s.k.y. 27-11-2011 19:08 1804408

Лександер, спасибо, странно почему-то не сработало
Код:

function NextButtonClick(CurPageID:integer): Boolean;
begin
  Result:= True;
  if (CurPageID = 7) then begin...


Gnom_aka_Lexander 27-11-2011 19:15 1804413

Цитата:

Цитата R.i.m.s.k.y.
спасибо, странно почему-то не сработало »

нужно само условие, которое не сработало. сам сталкиваюсь с тем, что любое неверное движение в этой функции вызывает отсутствие ожидаемого результата. Например:
Цитата:

Цитата R.i.m.s.k.y.
function NextButtonClick(CurPageID:integer): Boolean;
begin
Result:= True; »

тоесть, сперва мы разрешаем переход на следующую страницу, потом функции становится по барабану на все условия. Постом выше дал более надежное оформление условия страниц.

R.i.m.s.k.y. 27-11-2011 19:30 1804423

Лександер, в примере вышше помоему else не хватает на общий результат если ни одно условие не подошло

Gnom_aka_Lexander 27-11-2011 19:44 1804440

Цитата:

Цитата R.i.m.s.k.y.
в примере вышше помоему else не хватает на общий результат если ни одно условие не подошло »

Извиняюсь, все правильно. Правильно будет так:
читать дальше »
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result:=False;
  case CurPageID of // условия при переходе со страниц
    wpSelectComponents:  // со страницы выбора компонентов
  begin
  ...
    Result:= False;
  end;
 else
  Result:= True; // общий результат если ни одно условие не подошло
  end;
end;


R.i.m.s.k.y. 27-11-2011 19:51 1804448

Лександер, тогда логически неверно: сначала отрабатывает case CurPageID of wpSelectComponents: Result := false, а ниже уже Result := True!

Gnom_aka_Lexander 27-11-2011 20:03 1804463

Цитата:

Цитата R.i.m.s.k.y.
тогда логически неверно: »

Постом выше исправил. Для информации: при такой проверке - для каждой страницы обязательно указывать варианты для двух случаев - правда - ложь, у меня в том косяк и был - не было альтернативного условия. и косяк в итоге вылез совершенно на другой странице, поскольку все условие целиком было составлено неверно, а при правильном условии переставала работать кнопка далее на странице, на которой не было условия разрешающее переход далее :)

Raf-9600 28-11-2011 16:38 1804997

Ктонить может подкрутить скрипт, чтоб та часть что касается возврата оригинальных файлов, запускалась только если выбран компонент "Game\Lokal\Backup", а та часть что отвечает за проверку на оставшыеся файлы, если выбран "Game\Full"?

читать дальше »
Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  Res: Integer;
 
//Возврат оригинальных файлов
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Backup\'),ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Backup\'));
end;


//Проверка на оставшыеся файлы
begin
 case CurUninstallStep of
 usPostUninstall:
  begin
  if DirExists(ExpandConstant('{app}')) then
  if ExpandConstant('{language}') = 'ua' then
  case MsgBox('Папка "' + ExpandConstant('{app}') + '" не порожня.'#13#13 +
              '"Так" – повне видалення всіх файлів у папці, включаючи саму папку.' #13#13 +
              '"Ні" – відкрити папку в провіднику, щоб вручну видалити файли.'#13#13 +
              '"Скасувати" – нічого не робити, видалити папку пізніше самостійно.', mbInformation, MB_YESNOCANCEL) of

        IDYES:
        if not DelTree(ExpandConstant('{app}'), True, True, True) then
                MsgBox('Папка не видалена.' #13#13 'Папка або один з файлів у ній задіяні іншою програмою.', mbError, MB_OK);

        IDNO:
        if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
                MsgBox('Помилка відкриття.' #13#13 'Папка не знайдена.', mbError, MB_OK);

        IDCANCEL:;
  end
  else
  if ExpandConstant('{language}') = 'ru' then
  case MsgBox('Папка "' + ExpandConstant('{app}') + '" не пуста.'#13#13 +
              '"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
              '"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
              '"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of

        IDYES:
        if not DelTree(ExpandConstant('{app}'), True, True, True) then
                MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);

        IDNO:
        if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
                MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);

        IDCANCEL:;
  end
  else
    case MsgBox('Directory "' + ExpandConstant('{app}') + '" is not empty.'#13#13 +
              '"Yes" to delete all of the files in the directory, including the directory itself.' #13#13 +
              '"No" to open the directory with explorer to delete the files manually.'#13#13 +
              '"Cancel" to do nothing and delete the directory later manually.', mbInformation, MB_YESNOCANCEL) of

        IDYES:
        if not DelTree(ExpandConstant('{app}'), True, True, True) then
                MsgBox('Directory is not deleted.' #13#13 'Directory or one of the files are used by the other application.', mbError, MB_OK);

        IDNO:
        if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
                MsgBox('Error opening the directory.' #13#13 'Directory is not found.', mbError, MB_OK);

        IDCANCEL:;
    end
  end
 end
end;
end;


El Sanchez 28-11-2011 18:58 1805107

Цитата:

Цитата Лександер
Постом выше исправил »

Лександер, усе не так. В самом начале Result должен быть True - это результат функции по-умолчанию, else в операторе case не нужен. Если на страницах нужно что-то проверять и от результата этой проверки будет происходить\не происходить переход на следующую страницу, то обязательно нужно условие. Пример:
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;
  case CurPageID of
    wpSelectComponents:
    begin
      c := a + b;
      Result := c <> 20; //либо if c = 20 then Result := False;
    end;
  end;
end;

Перехода на wpSelectProgramGroup не произойдет, если c = 20. Result зависит от переменной с только на wpSelectComponents, для всех остальных Result = True, установленный в самом начале функции.

Dark_Delphin 28-11-2011 20:54 1805186

Всем привет.
Подскажите пожалуйста, что это за ошибка и как исправить?


Rikill 28-11-2011 21:13 1805202

ntrx, может так?
Код:

fsItalic];

Dark_Delphin 28-11-2011 21:22 1805208

Rikill, нет.

R.i.m.s.k.y. 28-11-2011 21:25 1805211

ntrx, я насчитал 64 символа в строке, а ругается на 74 символ, на закрывающуся скобку
скрипт

Dark_Delphin 28-11-2011 21:30 1805214

R.i.m.s.k.y., да.
Я вот не пойму почему так...
Ругатся на эту строку начало, после того как поставил секцыю [RUN] и [Tasks].

R.i.m.s.k.y. 28-11-2011 21:34 1805218

ntrx,
у меня так с закрывающими эндами бывает - ругается не там где не хватает, хотя намудрил выше места ругани
так шта ишшы, должон быть скобка

Dark_Delphin 28-11-2011 21:46 1805223

Вчера работал скрипт нормально..

R.i.m.s.k.y. 28-11-2011 21:51 1805231

ntrx,
я батарейки для хрустального шара берегу - дорогие стали
вот и вспоминай чего наворотил с послевчерашнего :tongue:

Dark_Delphin 28-11-2011 22:06 1805247

Где можна найти пример прикрутки скина в инсталлятор?

El Sanchez 28-11-2011 22:20 1805260

Цитата:

Цитата ntrx
Подскажите пожалуйста, что это за ошибка и как исправить? »

ntrx, ну {cm:Welcome1} раскроются при такой записи, а {#MyAppName} кто раскроет? ExpandConstant закончился на {cm:Welcome1}.
Нужно убрать лишние 2 скобки.
Код:

Caption := ExpandConstant('{cm:Welcome1}'#13#10'{#MyAppName}');

R.i.m.s.k.y. 28-11-2011 22:35 1805270

Цитата:

Цитата El Sanchez
Нужно убрать лишние 2 скобки »

никогда бы не подумал, я всегда в инно все конструкции заключаю в скобки при первом случае, удобнее потом разбираться

Dark_Delphin 28-11-2011 22:41 1805278

Хэх...

Ну проблема была в этом:

#define MyAppName "Hell's Reach"

В слове Hell's просто нужно было убрать апостроф.

El Sanchez 28-11-2011 23:16 1805301


Цитата:

Цитата El Sanchez
а {#MyAppName} кто раскроет? »

Тьфу ты! Надо же сглупил я как. Всю жизнь константы препроцессора в ExpandConstant заключал, а на самом деле не обязательно. Вот что значит привычка. :)


ntrx, если нужно апостроф сохранить, удвой его: #define MyAppName "Hell''s Reach"

TROY Diamond 29-11-2011 17:46 1805801

Здравствуйте!

читать дальше »
ПОМОГИТЕ МНЕ ПОЖАЛУЙСТА!!! БУДЬТЕ ЛЮБЕЗНЫ!!! ОЧЕНЬ ПРОШУ ВАС!!!

Как сделать "универсальную проверку" на наличие уже ранее установленного приложения, с предложением его удалить/запустить/выйти или всё равно продолжить установку (если можно, то укажите мне, пожалуйста, "отдельно эти варианты" и все вместе). Если вариантов несколько, то тем более помогите, пожалуста!!!

МНЕ НУЖНО, чтобы при запуске моего установщика, происходила проверка на наличие уже установленной проги, как моим установщиком, так и другими вне зависимости от того как бы она не называлась? Просто "искалось" бы в реестре какой-то абсолютно "одинаковый" параметр, например... и по нему находилась эта прога. Или как-то по-другому?!

кроме вот этого варианта (или может в него можно что-то добавить, "усовершенствовать"?):

Код:

function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  ResultStr:string;
begin
Result:=True;
begin
  If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Программа_is1', 'UninstallString', ResultStr)
then
 begin
  If ResultStr<>''
then
 begin
  ResultStr:=RemoveQuotes(ResultStr);
  if MsgBox('Эта программа уже была ранее установлена.' #13#13 'Вы хотите предварительно удалить её?', mbInformation, MB_YESNO) = idYes
then
  if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
  MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещён, удалён или переименован.', mbError, MB_OK);
end;
end;
end;
end;

Так как он подойдёт только Inno Setup, ведь он добавляет "_is1", (и только с именем "Программа_is1", а если у кого-то она по-другому называется) и для установленных другими инсталляторами, например Wise или InstallShild?

Что делать? Нужен "ориентир" по какому-то параметру, который прописывается в реестр всеми установщиками или как?

МНЕ нужно, чтобы при запуске моего установщика, происходила проверка на наличие уже установленной проги, как моим установщиком, так и другими вне зависимости от того как бы она не называлась?

Здравствуйте!

Подскажите, пожалуйста, как сделать сборку игрушек типа Quake, где большая часть ресурсов игры упакована в zip-архивы.

Как сделать? Насколько я понимаю, сначала, надо всё распаковать, а потом запокавать болле сильно, а в процессе установки обратно упаковать и чтобы это всё НЕ было видно для конечного пользователя, с удалением этих папок после создания

Чем открыть формат ar? Ни WinRAR, ни 7-zip, ни Universal Extractor его не берут. Используется в игре SRS


Модератор: TROY Diamond учитесь оформлять сообщение, скрываете большие тексты тегом more, код выделять тегом code. Писать в тексте слова вроде ПОМОГИТЕ МНЕ ПОЖАЛУЙСТА!!! пустая трата времени + нарушение правил оформления сообщения.

TROY Diamond 30-11-2011 14:37 1806457

Подскажите, как делают "компактные RePack'и" для игр типа Quake, CoD, SRS и т.п., где большая часть ресурсов игры уже упакована во что-нибудь "слабо сжатое" (что ещё раз бесполезно ужимать), например в переименованные zip-архивы *.pak, *.iwd, *.pk3?

Надо сначало это всё дело распаковать в отдельные папки, загнать в Inno, НЕ хочу создавать SFX-архивы, хочу просто всё ввиде соответствующих папок лежало в инстале, которые извлекаются из инстала и сразу же перепаковываются, а потом удаляются.

Так? или есть другой способ?!
читать дальше »

Как вот это или что-то в этом роде, запустить по ходу установки, а не в конце? Где это прописать?

[Run]
FileName: "{app}\Папка\pkzip25.exe"; Parameters: "-add -dir=relative -NoZipExtension Архив.pk3 pak1/*.*"; WorkingDir: "{app}\Папка"; StatusMsg: "Создание файла.pk3..."

Только не из секции "[Run]" ИЛИ КАК ВООБЩЕ ЭТО ДЕЛАЕТСЯ, ЧТОБЫ ПРОЦЕСС ЗАПУСКАЛСЯ НЕ В КОНЦЕ УСТАНОВКИ, А ПО ХОДУ РАСПАКОВКИ, ТАК КАК КРОМЕ "НУЖДАЮЩИХСЯ В УПАКОВКИ", - ЕСТЬ И КУЧА ДРУГИХ ФАЙЛОВ, КОТОРЫЕ ПРОСТО НАДО ИЗВЛЕЧЬ ИЗ ИНСТАЛА И СКОПИРОВАТЬ В ПАПКУ УСТАНОВКИ?!

Чё та где-то "Before" надо писать, в коде, подскажите, пожалуйста!!!

БЕЗ "pkzip", если это возможно (и какой и где его взять если без него нельзя?!!!), а также, чтобы архивы сразу имели нужное расширение, а НЕ *.zip, И ЧТОБЫ ПАПКА НЕ ВИСЕЛА НА ВИНТЕ, ДО ЗАВЕРШЕНИЯ УСТАНОВКИ И ЗАКРЫТИЯ ИНСТАЛЛЯТОРА, А ПРЯМ СРАЗУ УДАЛЯЛАСЬ ПОСЛЕ СОЗДАНИЯ И ПЕРЕИМЕНОВАНИЯ АРХИВА!!!

Началось извлечение файлов из дистрибутива (в том числе и тех которые НЕ требуют дальнейшей упаковки: документация, значки, исполняемые файлы), а вместе с ними и папки, которые нужно "превратить" в архивы, - СРАЗУ, т.е. извлеклась "папка" -> перепаковалась, переименовалась как надо, удалилась... дальше копируется следующая или другие файлы и чтобы индикатор процесса тоже НЕ стоял на месте во время упаковки...

По поводу: "Создание Файла.pk3...", можно ли сделать так, чтобы индикатор процесса в это время двигался или создать иммитацию, или вручную его двигать?
Я БЫ ВООБЩЕ УБРАЛ БЫ ДОПОЛНИТЕЛЬНОЕ СООБЩЕНИЕ: "СОЗДАНИЕ ФАЙЛА.PK3..." ЕСЛИ БЫ ИНДИКАТОР ПРОЦЕССА ПРОДОЛЖАЛ ДВИГАТЬСЯ ВО ВРЕМЯ УПАКОВКИ!!!

А по окончании установки, удалялся весь оставшийся "мусор" и ещё раз проверялось, чтобы ничего лишнего НЕ осталось?!


БУДЬТЕ ЛЮБЕЗНЫ, дайте, пожалуйста, полный скрипт инстала для пакетов кодеков K-Lite!

Цитата:

TROY Diamond, мемуары под спойлер, пожалуйста. Все Ваши проблемы обсуждались ранее. Советую почитать по подробнее.
Ну, что Вам сложно что ли подсказать? У меня Инернет медленный, я 2-части осилил прочитал, но не нашёл, то что мне именно нужно!!!

Помогите!!!

R.i.m.s.k.y. 30-11-2011 14:49 1806469

TROY Diamond,


я, к примеру, не могу вычленить из потока сознания техзадание: чего надо то? почему не упаковывать стандартными средствами инно?
И верхний пример проверки установленной программы вполне годный.
А что до усовершенствовать, то у каждой биологической модели человека свои понятия совершенного, а кнопки "сделать гут" еще не придумали.

Ставь конкретные вопросы: чего нужно, чего непонятно, первое-второе-третье
Я на прошлой странице спрашивал, веришь-нет - ответили.
Потому что грамотно спросил: что хочу и в чем затык.

И не думай что за тебя скрипт писать будут!


Что до к-ляйта, то возми Inno Unpacker и распотроши его
Только не жди многого, там очень жирная секция кода, она только дизассемблируется


Ну а для начала советую в стандартном инно компиляторе нажать F1, в строке поиска ввести Installation order, и почитать
Проблемы с английским? в шапке русская справка

R.i.m.s.k.y. 30-11-2011 16:25 1806558

Цитата:

Цитата TROY Diamond
Так как он подойдёт только Inno Setup, ведь он добавляет "_is1", (и только с именем "Программа_is1", а если у кого-то она по-другому называется) и для установленных другими инсталляторами, например Wise или InstallShild?
Что делать? Нужен "ориентир" по какому-то параметру, который прописывается в реестр всеми установщиками или как?
МНЕ нужно, чтобы при запуске моего установщика, происходила проверка на наличие уже установленной проги, как моим установщиком, так и другими вне зависимости от того как бы она не называлась? »

тогда нужно знать точно как другой установщик проверяет наличие этой программы
в ~75% случаев достаточно отрегшотить* ключи реестра устанавливаемой программы, исключив HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* - это секция установки/удаления программ в панели управления
сделать это нужно в двух системах: х86 и х64, тк ключи реестра будут разными



Цитата:

Цитата TROY Diamond
Подскажите, как делают "компактные RePack'и" »

наверное freearc + isdone
не вижу в них смысла кроме возможности вывода красивых процентов и времени распаковки
инно на максе жмет не хуже, а может даже чуть лучше

Цитата:

Цитата TROY Diamond
Надо сначало это всё дело распаковать в отдельные папки, загнать в Inno, НЕ хочу создавать SFX-архивы, хочу просто всё ввиде соответствующих папок лежало в инстале, которые извлекаются из инстала и сразу же перепаковываются, а потом удаляются.
Так? или есть другой способ?! »

такая постановка вопроса показывает, что ты еще ничего даже не пробовал сделать, иначе такого вопроса просто не было бы
скачай в шапке самые простые примеры, разбери, почитай

и запомни - простой репак чего_ты_там_перепаковываешь в 100500 раз стабильнее красивостей
док-ва на руторе в раздачах игр-репаков


----------------------
* отрегшотить - отследить установку проги программой regShot, она же умеет отслеживать устанавливаемые файлы

TROY Diamond 30-11-2011 20:28 1806766

Цитата:

тогда нужно знать точно как другой установщик проверяет наличие этой программы
в ~75% случаев достаточно отрегшотить* ключи реестра устанавливаемой программы, исключив HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\* - это секция установки/удаления программ в панели управления
сделать это нужно в двух системах: х86 и х64, тк ключи реестра будут разными
Я знаю куда и чё прописывается! Я спрашиваю как это всё указать, чтобы моя сборка находила, всё это дело?

Цитата:

скачай в шапке самые простые примеры, разбери, почитай
Я, что против, какие? у меня всё в "крестиках", страницы по пол-минуты грузятся...

Цитата:

и запомни - простой репак чего_ты_там_перепаковываешь в 100500 раз стабильнее красивостей
док-ва на руторе в раздачах игр-репаков
Цитата:

наверное freearc + isdone
не вижу в них смысла кроме возможности вывода красивых процентов и времени распаковки
инно на максе жмет не хуже, а может даже чуть лучше
А КТО ПИСАЛ ЧТО МНЕ НУЖНЫ КРАСИВЫЕ, Я ПРОСИЛ "КОМПАКТНЫЕ"!!!

Да, мне не нужна эта гламурная мишура я спрашиваю как сделать такой репак, zip-архивы ведь не пережмешь, мне надо их все распаковать, упаковать в Инно, а потом снова всё это создать обратно?

Цитата:

R.i.m.s.k.y., мда *iss у K-lite Codec Pack весит почти 1 мб
Цитата:

у инсталлера кляйта очень большой блок Code, бинарник полметра весит
Кто-нибудь поделится?

Цитата:

Цитата R.i.m.s.k.y.
TROY Diamond,


я, к примеру, не могу вычленить из потока сознания техзадание: чего надо то? почему не упаковывать стандартными средствами инно?
И верхний пример проверки установленной программы вполне годный.
А что до усовершенствовать, то у каждой биологической модели человека свои понятия совершенного, а кнопки "сделать гут" еще не придумали.

Ставь конкретные вопросы: чего нужно, чего непонятно, первое-второе-третье
Я на прошлой странице спрашивал, веришь-нет - ответили.
Потому что грамотно спросил: что хочу и в чем затык.

И не думай что за тебя скрипт писать будут!


Что до к-ляйта, то возми Inno Unpacker и распотроши его
Только не жди многого, там очень жирная секция кода, она только дизассемблируется


Ну а для начала советую в стандартном инно компиляторе нажать F1, в строке поиска ввести Installation order, и почитать
Проблемы с английским? в шапке русская справка

Вот нашёл на Вашем форуме вот этот скрипт:

http://rghost.ru/27877781

НО ЭТО ТОЛЬКО ПО ПЕРВОМУ ВОПРОСУ И ТО НЕ СОВСЕМ... (А по-второму вопросу про установщики для игр типа Call of Duty и Quake. И по третьему вопросу про игру Street Racing Syndicate, чем и как открыть формат *.ar, + скрипт чтобы его упаковать, а в процессе установки обратно создать)?

Он мне не подходит!!!

Так как проверка НЕ "универсальная", - "заточена" под Inno Setup!!! А если приложение было установлено другим инсталлятором, например Wise или InstallShild и/или файл деинсталлятора имеет другое имя и или находится НЕ в папке установки!

Мне нужно, чтобы при запуске моей сборке, происходило обнаружение ранее установленного этого же приложения, НО НЕ ТОЛЬКО С ПОМОЩЬЮ МОЕГО ИНСТАЛА!!!
С предложением, его удалить, запустить, выйти и ПРОПУСТИТЬ (ВСЁ РАВНО ПРОДОЛЖИТЬ УСТАНОВКУ) - т.к. очень часто пользователи некорректно удаляют приложение, НЕ с помощью деинсталлятора (а ключ в реестре всё равно весит), проги -то нет, но НЕ запустить НЕ удалить, НЕ переустановить её НЕЛЬЗЯ!!!

К примеру, пользователь, ДО этого устанавливал программу с помощью другого инсталла и/или неправильно её удалил. А тут он взял мою сборку - запустил она нашал ранее установленную и предложила её либо удалить, запустить или всё равно продолжить установку (удалив/затерев или "поверх" поставив).

Хочу, чтобы у меня был "установщик-чистильщик", при запуске, которого, будет найдена ранее установленная программа, а при корректном удалении её - УДАЛИТСЯ ВСЁ, включая и то, что было создано в процессе установки/использования, как моей так и другой сборки!

TROY Diamond 30-11-2011 20:48 1806782

Как ярлыку задать параметр скрывать консольные окна? Запускать командную строку в скрытом режиме?

Дело в том, что при запуске утилиты сбиваются, настроенные мной опции... мне ничего не пришло в голову, как создать bat'ник, который эти настройки восстанавливает обратно, по закрытии утилиты.
И ярлык я сделал именно на этот bat'ник, а не на саму утилиты. Пользователь запускает утилиту с ярлыка, запускается bat-ник, который запускает утилиту, а после вносит изменения в реестр и весит на пол-экрана пока утилиту не закроют!!! Как его скрыть?!

ИЛИ МОЖЕТ БЫТЬ ЕСТЬ КАКОЙ-НИБУДЬ ДРУГОЙ СПОСОБ, КОГДА ПРИ ЗАПУСКЕ ОДНОЙ ПРОГИ С ЯРЛЫКА ВЫПОЛНЯЛАСЬ БЫ ЕЩЁ ПОТОМ И ДРУГАЯ?

В данном случае, мне нужно после закрытия утилиты внести/заменить некоторые записи в реестре, которые утилита изменила.



Как при установке запустить "на мнгновение" определённое приложение (буквально на 1-2 секунды), а потом автоматически его закрыть, как при нажатии на крестик или на кнопку "Отмена"/"Закрыть".
Приложение находится в инстале и копируется в папку основного приложения. В принципе её можно и вручную, потом запустить, или "чекбокс" поставить в конце, но я хочу чтобы всё это было сделано "на автомате"!
И всё это необходимо "провернуть" в скрытом режиме, чтобы пользователь не видел запускаемого приложения, именно поэтому нужно, чтобы прога сама автоматически закрылась!
Наверное, надо как-то "убить процесс"?!

R.i.m.s.k.y. 30-11-2011 22:34 1806854

TROY Diamond, ты только себя читаешь?
тебе известен способ как ищется твоя прога?
ты уже хотя бы отрегшотил что пишет в реестр твоя прога?

к тому же задаешь такие общие вопросы, что у меня закладываются подозрения что компьютер появился около месяца назад

не обижайся

если ты сам свою задачу разложишь по полочкам и начнешь с начала то
а) будет проще самому разобраться
б) задавать конкретные вопросы по одному разу и получать конкретные ответы,

в конце концов кому тут помощь нужна?

начать следует как раз с того какие изменения нужно сделать в системе чтобы поставить прогу: скопировать файлы, записать в реестр, зарегить библиотеки.
это ты знаешь?
если знаешь - начинаешь потихоньку заполнять Setup/Files/Registry
кстати это ответ на твой вопрос "как узнать стоит прога или нет?"

поменьше эмоций, у компилятора нет параметра /emotion=true

батник запускается сам и висит окном, скрыть его нельзя, наследие доса
строки в батнике запускаются последовательно одна за другой
если нужно запустить скопом из батника - в начале поставь start прога.ехе, следующая прога запустится не ожидая окончания предыдущей
но если ты батник запускаешь из инно то есть параметр runhidden - черного окна батника не будет видно, и ошибок тоже

И если ты знаешь про раздел реестра "установка/удаление программ" то наверное знаешь и про ключ UninstallString - строчка с деинсталлятором, которую нужно запустить для удаления

Это дурной тон удалять то чего не просят. Достаточно чтобы инсталлер проверил что есть "инородное вкрапление", предупредил и закрылся.


Цитата:

Цитата TROY Diamond
Я знаю куда и чё прописывается! Я спрашиваю как это всё указать, чтобы моя сборка находила, всё это дело? »

в шестой версии протокола TCP/IP будет добавлена возможность угадывания куда и чё прописывается по словам "Я спрашиваю"

valyok666 01-12-2011 01:34 1806942

Привет всем)щас задался вопросом)мне надо сделать онлайн инсталл InnoTools Downloader т.е он скачивает архив (эт знаю как справку читал) а как сделать чтобы файл скачивался в темп и дальше шла распаковка через ISDOne?И распаковка шла в путь указанный в сетупе)кто нибудь задавался таким вопросом???или есть примеры кроме стандартных с сайта буду рад))

TROY Diamond 01-12-2011 20:35 1807488

Цитата:

Цитата R.i.m.s.k.y.
TROY Diamond, ты только себя читаешь?

НЕ ПОСЫЛАЙТЕ МЕНЯ И НЕ ПОСЫЛАЙТЕ В ПОИСКОВИКИ, ПОЖАЛУЙСТА!!!
читать дальше »

НЕ пишите, что-нибудь вроде "Погугли в Яндексе...". Я только Яндексом и пользуюсь, именно с помощью него я и вышел на Ваш форум!!!

Я писал: "Скрипты для Inno Setup"; "Как сделать в Inno Setup"; "Секция [code] в Inno Setup" и эти же вопросы которые я здесь задаю, - все "дорожки привели" сюда!!!

Но поисковик - машина, его не спросишь на прямую, он не поймёт... если не сформулируешь верно или не будет совпадений, - а здесь живые люди - великие мудрецы!!!

Где, как не на форуме, задавать вопросы, узнавать что-то новое и нужное, а также делиться полезной информацией с нуждающимися?!

Да как Вы не поймёте зачем и почему мне это надо?! Не для гламура ведь ради...

1. Если тупо взять и загнать всё, как есть в Inno Setup или попытаться сжать каким-нибудь другим компрессором, то в лучшем случае, пару метров всего выиграю, а в худшем, размер ещё больше увеличится!!!
АРХИВЫ, НЕ СЖИМАЮТ!!! Сжатие одного архива другим архиватором приводит к увеличению размера!!! Только сжатие в zip, не накручивает размер, а они и так zip-архивы. Проще тогда вообще БЕЗ сжатия скомпилировать и всё!

2. А я хочу уменьшить размер... я пробовал... распаковывал эти архивы и упаковывал их обратно, но в RAR или 7-zip, ТАК РАЗМЕР УМЕНЬШАЛСЯ РАЗА В 3-4!!! Поэтому я и хочу так сделать.

3. Если запускать упаковку в архивы просто из секции "[Run]", то сначала всё содержимое инстала извлечётся на винт, потом начнётся, упаковка в архивы и только в конце "всё это дело" удалится!!! Для такого репака места на ЖД нужно раза в 3-4 больше, чем занимает сама игра!!!
К ТОМУ ЖЕ ИНДИКАТОР ПРОЦЕССА ДОЙДЁТ ДО КОНЦА (будет 100%), А ПОТОМ ПОЛЧАСА ВСЁ ЭТО БУДЕТ ВИСЕТЬ... так как создать архивов нужно кучу, да и на упаковку не мало времени уйдёт!!!
Пользователь подумает, что комп просто завис - индикатор процесса дошёл до конца, а установка не всё никак не завершается!!!

4. Поэтому я и хочу, чтобы всё происходило "по шагам":
Из инстала извлекается 1 папка -> создаётся архив (можно и сообщение соответствующее добавить "Создание файла...", а расширение из *.zip - переименовывается на нужное или сразу создаётся с нужным, или в конце), папка удаляется - индикатор процесса "двигается"...
Из инстала извлекается 2 папка -> создаётся 2 архив (расширение из *.zip - переименовывается на нужное или сразу создаётся с нужным, или в конце), папка удаляется - индикатор процесса продолжает "двигается"...
Из инстала извлекается 3 папка -> создаётся 3 архив, (расширение из *.zip - переименовывается на нужное или сразу создаётся с нужным, или в конце), папка удаляется - индикатор процесса всё дальше и дальше...
И так по очереди, пока все извлечённые нужные папки не "превратятся" в архивы.
А когда индикатор процесса дойдёт до конца, то и установка тоже завершится.

Вот и всё! Я ведь видел подобную реализацию, в какой-то сборке игры Бернаут или какой-то другой, а также в некоторых русификаторах от SerGEAnt's (Zone Of Games) - НЕ будут же они все ресурсы игры упаковывать?!
Поэтому они вызывают команду, чтобы архив распаковался, в него добавился перевод, а потом он снова упаковался обратно... (НО ЭТО НЕ ВЕЗДЕ В "МАЛЕНЬКИХ" РУСИФИКАТОРАХ, команда вызывалась просто из секции "[Run]").

ПОМОГИТЕ, ПОДСКАЖИТЕ, ПОЖАЛУЙСТА!!!

Ведь и установку каких-нибудь дополнительных приложений, реализуют подобным образом.
БЫВАЕТ же, к примеру, что до начала или во время установки приложения, надо что-то скопировать и/или запустить - это ведь примерно тоже самое!

Я ведь не прошу никого чё нибудь "гламурненкое" замутить, не прошу слайд-шоу, музыку и т.п. Не прошу; "А как вот такой сделать" и т.п. А тут ведь много таких просьб - им Вы помогаете!!!

А мне всего лишь кодик, команду, параметр, пример, нужны... Я ведь даже не знаю, что и куда в этом случае...


Цитата:

тебе известен способ как ищется твоя прога?
ты уже хотя бы отрегшотил что пишет в реестр твоя прога?

к тому же задаешь такие общие вопросы, что у меня закладываются подозрения что компьютер появился около месяца назад

не обижайся

если ты сам свою задачу разложишь по полочкам и начнешь с начала то
а) будет проще самому разобраться
б) задавать конкретные вопросы по одному разу и получать конкретные ответы,

в конце концов кому тут помощь нужна?

начать следует как раз с того какие изменения нужно сделать в системе чтобы поставить прогу: скопировать файлы, записать в реестр, зарегить библиотеки.
это ты знаешь?
если знаешь - начинаешь потихоньку заполнять Setup/Files/Registry
кстати это ответ на твой вопрос "как узнать стоит прога или нет?"

поменьше эмоций, у компилятора нет параметра /emotion=true
Я хочу чтобы моя сборка определяла это же ранее установленное приложение, каким бы инсталлятором оно не было установлено. NSIS, Wise, InstallShild или Inno Setup.

ВСЕ возможные и невозможные варианты названий и т.п. я готов написать, хоть 100 - мне не влом, Вы только скажите куда и как?

Inno Setup в реестре пишет в "Uninstall" с "is1", Wise "{цифры}" и т.п. К тому же название тоже может быть разным, к примеру у кого-то с какими-нибудь знаками "-", "." ":" или просто к названию прибавлено "Сборка..."
И как мне к каждому привязать, что бы всё это находилось, а главное можно было запустить деинсталлятор!

И ещё мне обязательно нужно, чтобы было несколько вариантов, в том числе и продолжении установки, так как очень часто юзвери тупят и некоректно удаляют приложение - не при помощи деинсталлятора!!!

А потом ещё и возмущаются, почему приложение нельзя переустановить?! Ключ в реестре, то висит, его никто не удалил...

Поделитесь скриптом для UltraISO

Как сделать проверку разрядности и/или версии ОС для установки соответствующих компонентов?

К примеру у меня есть какие-то дополнительные файлы/проги, которые нужно поставить в зависимости от разрядности и/или версии системы.
Если x86, то ставим одну, если x64, то другую или туже, но с соответствующей разрядностью, если XP, то одно если Vista/7, то другое и т.п.

Чё та надо писать, типа "Check", а что конкретно и какой код я вообще НЕ знаю.

ТОТ ЖЕ САМОЕ И ДЛЯ ПАПКИ УСТАНОВКИ (или это не принципиально?).
К примеру папка "Program Files" вроде бы чем-то "отличается"?

Поделитесь, пожалуйста, самым оптимальным и простым скриптом для создания сильно упакованного дистрибутива (Inno Setup + внешний компрессор)
Насколько я знаю, чаще всего используют FreeArc

МНЕ НУЖНО, чтобы архив(ы), был(и) "рядом" с файлом "setup.exe" и извлекались сразу напрямую из него, чтобы не тратилось время и места на ЖД, для извлечения сначала из "Inno Setup".
ОБЯЗАТЕЛЬНО НУЖНО, чтобы архивы были поделены на части нужного мне размера, т.к. как размер большой и ВЫГЛЯДЕЛИ ОНИ ТАК ЖЕ КАК И "СТАНДАРТНЫЕ ЧАСТИ INNO SETUP" (setup-1.bin, setup-2.bin...).
И ВНЕШНЕ ПРИ РАСПАКОВКЕ, ЧТОБЫ ВСЁ ВЫГЛЯДЕЛО "КАК СТАНДАРТНАЯ УСТАНОВКА", с одним обычным прогресс-баром и БЕЗ всяких: "Извлечение из архива...", "файлов: .., % выполнено, осталось ждать..." и т.п. НИЧЕГО ЭТОГО НЕ НАДО!!!

Должно быть как обычно "Распаковка файлов..." и один стандартный индикатор процесса.
И распаковка начиналась НЕ из секции "Run", а в процессе установки, чтобы индикатор процесса "двигался".
А при отмене/прерывании установки - удалялось всё, что распаковалось, типа как обычно: "Откат изменений..." и всё...

Один раз видел, что-то подобное... поэтому и спрашиваю!

А обычно "куча мишуры", оформление, несколько индикаторов процесса, дополнительные окна и надписи, изменение цвета, НИЧЕГО этого не надо.

Дайте, пожалуйста, скрипт и посоветуйте как и чем лучше сжимать и т.п.

Спасибо! Жду Вашего ответа...

Модератор: TROY Diamond учитесь оформлять сообщение, скрываете большие тексты тегом more, код выделять тегом code. Писать в тексте слова вроде ПОМОГИТЕ МНЕ ПОЖАЛУЙСТА!!! , да еще большим шрифтом пустая трата времени + нарушение правил оформления сообщения.

dracosha 02-12-2011 00:59 1807686

Доброго дня!
Люди помогите решить задачу...
Через препроцессор пишу в ини дату:
Код:

#expr WriteIni(MyAppSourcePath + "\profiles\settings_ru.ini", "Section1", "ReleaseDate", GetDateTimeString('dd.mm.yyyy', '', ''))
Значение (т.е.) саму дату пишет естественно без кавычек... Вот так:
Код:

ReleaseDate=01.12.2011
а я хочу что бы писало так:
Код:

ReleaseDate="01.12.2011"
куда только не пробовал подсунуть кавычки, ничего не помогает :(

Arsi000 02-12-2011 05:43 1807740

никто не в курсе собираются разработчики портировать inno на 64 бита? вообще разработчик достаточно ленивый походу такую маленькую программку до сих пор не портировал. прямо странности

R.i.m.s.k.y. 02-12-2011 08:09 1807764

dracosha, что если добавить AddQuotes?
Код:

#expr WriteIni(MyAppSourcePath + "\profiles\settings_ru.ini", "Section1", "ReleaseDate", AddQuotes(GetDateTimeString('dd.mm.yyyy', '', '')))

Rikill 02-12-2011 15:17 1808003

Arsi000, всё работает и хорошо. Зачем это нужно?

R.i.m.s.k.y. 02-12-2011 16:32 1808071

Rikill, между прочим я старался помочь, пытался узнать чего нужно, на понятые мною вопросы я ответил
а смысл в сообщениях обратно пропорционален кол-ву знаков
что до per rectum ad astrum я только сегодня после обеда вкурил что TROY Diamond хочет такой изврат сотворить, у меня просто в голове не укладывалась вся абсурдность этой затеи
столько писать и я смогу, см на моем сайте инструкции :)

Devils Night 03-12-2011 22:31 1808727

Как сделать такое как на скрине?

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

Rikill 04-12-2011 01:15 1808837

Devils Night, а как может быть три подряд выбранных радиобаттонов?!
Сейчас очень быстро накатал примерчик, так что умные люди сильно ногами не бейте, а поправьте меня.
Пример не работает, но думаю если приложить немного знаний и сил то заработает, просто самому интересно стало. :)
Код:

[Setup]
AppName=1
AppVerName=1
DefaultDirName=1

[Files]
Source: Files\*; Flags: dontcopy

[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: Lang1; Description: ляляля; Types: full;
Name: Lang2; Description: ляляля1; Types: full;


       
Код:

       
var
 bmp: TBitmapImage;
 bmp1: TBitmapImage;
 
procedure InitializeWizard;
 begin
  ExtractTemporaryFile('bmp1.bmp');
 bmp1 := TBitmapImage.Create(WizardForm);
 With bmp1 do
 begin
   Top:=100;
   Left:=330;
   Width:=100;
   Height:=30;
   Parent:=WizardForm.SelectComponentsPage;
   Bitmap.LoadFromFile(ExpandConstant('{tmp}\bmp1.bmp'));
 
 ExtractTemporaryFile('bmp.bmp');
 bmp := TBitmapImage.Create(WizardForm);
 With bmp do
 begin
   Top:=100;
   Left:=330;
   Width:=100;
   Height:=30;
   Parent:=WizardForm.SelectComponentsPage;
   Bitmap.LoadFromFile(ExpandConstant('{tmp}\bmp.bmp'));
 end;
 end;
 end;

procedure CurPageChanged(CurPageID: Integer);
begin
//bmp.hide
    if IsComponentSelected('Lang1') then bmp.show
    if IsComponentSelected('Lang2') then bmp1.show
end;




Devils Night 04-12-2011 06:22 1808890

Rikill, Не то.
Цитата:

Цитата Rikill
а как может быть три подряд выбранных радиобаттонов?! »

нужно не три подряд, а один из них, но три и более.
Конкретно, нужно тоже самое, но чтобы при выбранном, сбоку менялась картинка

Код:

[Setup]
AppId={{452AA98F-8AA7-40C9-A583-6DAF44B9E14E}
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[Files]
Source: A\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: A
Source: B\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: B
Source: C\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: C

[Tasks]
Name: A; Description: A; GroupDescription: Типа прога; Flags: exclusive
Name: B; Description: B; Flags: exclusive; GroupDescription: Типа прога
Name: C; Description: C; Flags: exclusive; GroupDescription: Типа прога


Именно при выборе, а не при наведении.

Gnom_aka_Lexander 04-12-2011 13:09 1808999

Цитата:

Цитата Devils Night
нужно не три подряд, а один из них, но три и более.
Конкретно, нужно тоже самое, но чтобы при выбранном, сбоку менялась картинка
Именно при выборе, а не при наведении. »

Прикрепил пример.

Devils Night 05-12-2011 06:29 1809447

Тут появилась проблема, хотел чтобы при удалении удалялась папка MyProgs в C:\Documents and Settings\Имя_Пользователя, но {userprofile}/MyProgs не отрабатывает, подскажите, как решить?

Лександер, Спасибо большое.

Gnom_aka_Lexander 05-12-2011 08:50 1809469

Вложений: 1
Цитата:

Цитата Devils Night
{userprofile}/MyProgs не »

а {userdocs}\MyProgs не пробовал? и это, у тебя слеш в неправильную сторону в пути.
А так-же, удаляяя из секции сода, не забываеш обрамлять в ExpandConstant('{userdocs}\MyProgs')?

P.S. Накидал тут самый короткий пример вставки изображений на все страницы инсталлятора. Страницы "зашториваются" автоматически, при создании новых страниц - теоретически так-же автоматом затекстурируется(не пробовал, но должно)

Devils Night 05-12-2011 09:29 1809476

Цитата:

Цитата Лександер
а {userdocs}\MyProgs не пробовал? »

Ну так с этой же командой оно попадает в
C:\Documents and Settings\Имя_Пользователя\Мои документы\MyProgs а нужно в C:\Documents and Settings\Имя_Пользователя\MyProgs

Gnom_aka_Lexander 05-12-2011 09:38 1809478

Цитата:

Цитата Лександер
и это, у тебя слеш в неправильную сторону в пути »

Обратил внимание?
Цитата:

Цитата Devils Night
но {userprofile}/MyProgs не отрабатывает »

{userprofile}\MyProgs

Devils Night 05-12-2011 09:58 1809488

Лександер, Оно вот такую фигню выдало


Скрипт обычный
читать дальше »
Код:

[Setup]
AppId={{7BF96892-6F6A-411C-B5B3-07566B9D3074}
AppName=MyProgs
AppVersion=1.5
AppVerName=MyProgs 1.5
AppPublisher=My Company, Inc.
DefaultDirName={pf}\MyProgs
DefaultGroupName=MyProgs
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked

[Files]
Source: C:\Program Files\Inno Setup 5\Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: {group}\MyProgs; Filename: {app}\MyProg.exe
Name: {group}\{cm:UninstallProgram,MyProgs}; Filename: {uninstallexe}
Name: {commondesktop}\MyProgs; Filename: {app}\MyProg.exe; Tasks: desktopicon

[UninstallDelete]
Name: {userprofile}\MyProgs; Type: filesandordirs



Цитата:

Цитата Лександер
ExpandConstant('{userdocs}\MyProgs')? »

И куда её пихать, т.е получается ещё дополнительный код нужен? InitializeWizard подойдёт?

R.i.m.s.k.y. 05-12-2011 10:06 1809491

Цитата:

Цитата Devils Night
Оно вот такую фигню выдало »

справка инно показывает, что такой переменной нету
в шапке есть ссылка на стандартные папки винды http://www.forum.oszone.ru/showpost....&postcount=102

Devils Night 05-12-2011 10:11 1809494

Цитата:

Цитата R.i.m.s.k.y.
справка инно показывает, что такой переменной нету »

Я в файле %%_Windows нашёл

читать дальше »
C:\D&S\User\Рабочий стол -- {userdesktop}

C:\D&S\All Users\Рабочий стол -- {commondesktop}

C:\D&S\User -- {userprofile}

C:\D&S\User\Избранное -- {userfavorites}

C:\D&S\Al Users\Избранное -- {commonfavorites}

C:\D&S\User\Local Settings\App Data -- {localappdata}

C:\D&S\User\Мои документы -- {userdocs}

C:\D&S\All Users\Общие документы -- {commondocs}

C:\D&S\User\Главное меню\Программы -- {userprograms}

C:\D&S\All Users\Главное меню\Программы -- {commonprograms}

C:\D&S\User\App Data -- {userappdata}

C:\D&S\All Users\App Data -- {commonappdata}

C:\D&S\User\Send To -- {sendto}


C:\ -- {systemdrive} или {sd}

C:\WINDOWS\Fonts -- {fonts}

C:\WINDOWS\Temp -- {tmp}

C:\WINDOWS -- {systemroot} или {windir} или {win}

C:\WINDOWS\System32 -- {sys} или {systemsystem}

C:\Program Files -- {programfiles} или {pf}

C:\Program Files\Common Files -- {commonprogramfiles}


А ещё в Inno Script Studio есть то чего нет в Inno IDE

Цитата:

Цитата R.i.m.s.k.y.
щито это? »

По Русски можешь писать? Моя твоя не понимать!
Этот файл в сборке InnoUltra имеется.

R.i.m.s.k.y. 05-12-2011 10:15 1809497

Цитата:

Цитата Devils Night
Я в файле %%_Windows нашёл »

щито это?

Gnom_aka_Lexander 05-12-2011 10:18 1809501

Цитата:

Цитата Devils Night
Оно вот такую фигню выдало »

Я сейчас поискал, и не нашел в инно константы {userprofile}. Может, конечно, плохо искал, но подозреваю, что достаточно. в шапке есть скрипт Стандартные папкам Windows, который в твоем случае поможет.

Цитата:

Цитата R.i.m.s.k.y.
щито это? »

в составе справочных материалов в моей сборке есть файл констант. видимо устарел.

Devils Night 05-12-2011 10:31 1809507

Цитата:

Цитата Лександер
в шапке есть скрипт Стандартные папкам Windows, который в твоем случае поможет. »

Теперь точно, отвесил до зубов, мне теперь этого на целый год хватит.
А как нибудь попроще нельзя? А то как бы я в этих тонкостях не волоку.

Gnom_aka_Lexander 05-12-2011 11:19 1809527

Цитата:

Цитата Devils Night
Теперь точно, отвесил до зубов, мне теперь этого на целый год хватит.
А как нибудь попроще нельзя? А то как бы я в этих тонкостях не волоку. »

читать дальше »
Код:

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

[*Code]
const
  MAX_PATH = 260;
  // Папка пользователя (обычно C:\Documents and Settings\username)
  CSIDL_PROFILE                = $28;

function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL;
  external 'SHGetSpecialFolderPathA@shell32.dll stdcall';

function GetSpecialPath(CSIDL: Word): string;
var
  s:  string;
begin
  SetLength(s, MAX_PATH);
  if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then s := '';
  Result:= PChar(s);
end;

procedure InitializeWizard;
begin
  // определим расположение папки пользователя
  MsgBox(GetSpecialPath(CSIDL_PROFILE), mbInformation, MB_OK);
end;

procedure DeinitializeUninstall();
begin
  DelTree(GetSpecialPath(CSIDL_PROFILE)+'\папка',True,False,False);
end;

Както так пробуй.

R.i.m.s.k.y., уже :) просто не хочет, почемуто работать в CurUninstallStepChanged, попробовал в DeinitializeUninstall - там заработало.

R.i.m.s.k.y. 05-12-2011 11:27 1809531

Лександер, ты через реестр хочешь выдирать путь до папок? неправильно, сильно глюкаво сие есть
лучше пример из шапки адаптируй как Devils Night надо
не, я мог бы и сам, но мой большой толстый скрипт из которого я примеры дергаю лежит дома
а тут делов то, к CurUninstallStepChanged прикрутить удаление папки из перечисленного в шапке

R.i.m.s.k.y. 05-12-2011 11:59 1809549

как-то так
Код:

const
  MAX_PATH = 260;
  // Папка пользователя (обычно C:\Documents and Settings\username)
  CSIDL_PROFILE                = $28;

function SHGetSpecialFolderPath(hwndOwner: HWND; lpszPath: PChar; nFolder: Integer; fCreate: BOOL): BOOL;
  external 'SHGetSpecialFolderPathA@shell32.dll stdcall';

function GetSpecialPath(CSIDL: Word): string;
var
  s:  string;
begin
  SetLength(s, MAX_PATH);
  if not SHGetSpecialFolderPath(0, PChar(s), CSIDL, True) then s := '';
  Result:= PChar(s);
end;

procedure RD(Dir:string);
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + AddQuotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure RF(file:string);
begin
  Exec('cmd.exe', ' /c del /F /Q  ' + AddQuotes(file),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
  Exec('cmd.exe', ' /c erase /F /Q  ' + '"'+file+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep=usDone then RD(RemoveBackslashUnlessRoot(GetSpecialPath(CSIDL_PROFILE))+'\MyProgs');
end;

инношные функции DelTree и RemoveFile какие-то капризные
я своими RD/RF пользуюсь

R.i.m.s.k.y. 05-12-2011 12:24 1809560

Лександер, я вообще-то путь удаления взял из твоего скрипта выше
свой скрипт поправил

к тому же это плохой тон править сообщения выше после критики снизу :)

Gnom_aka_Lexander 05-12-2011 12:32 1809565

Цитата:

Цитата R.i.m.s.k.y.
к тому же это плохой тон править сообщения выше критики снизу »

Это на всякий случай, поскольку вариант рабочий, и лучше исправить. то, что он у меня не отработал, еще не значит, что не сработает еще у когото.
Цитата:

Цитата R.i.m.s.k.y.
это значит ровно то что у кого-то еще он тоже не сработает »

Не отработала функция DelTree, но на семерке она так-же, видимо через раз работает. Это не значит, что она не сработает ни у кого.
Разве нет?

R.i.m.s.k.y. 05-12-2011 12:37 1809568

Цитата:

Цитата Лександер
Это на всякий случай, поскольку вариант рабочий, и лучше исправить. то, что он у меня не отработал, еще не значит, что не сработает еще у когото »

это значит ровно то что у кого-то еще он тоже не сработает
я не знаю что там с DelTree, когда я столкнулся что на шаге ssInstall ничего не удаляется, я стал использовать RF/RD что в примере выше

El Sanchez 05-12-2011 19:23 1809823

Цитата:

Цитата R.i.m.s.k.y.
я не знаю что там с DelTree, когда я столкнулся что на шаге ssInstall ничего не удаляется »

Стало быть в папке есть файлы, занятые системой.

P.S. Получить userprofile штатно:
Код:

GetEnv('USERPROFILE');
GetShellFolderByCSIDL($28, True);


TROY Diamond 05-12-2011 20:35 1809872

Если приложение "мультиразрядное"...

1. Сам по себе Inno Setup по умолчанию делает "универсальные" установщики, которые будут работать на всех ОС или нет?

Если к примеру, программа может работать как на 32-х, так и на 64-х разрядной версиях Windows, то нужно ли в скрипте установки указывать какие-нибудь дополнительные параметры?

Например:
"ArchitecturesAllowed=x86 x64 и/или "ArchitecturesInstallIn64BitMode=x64"?

А также если программа по умолчанию должна устанавливаться в в папку "Program Files", то путь прописывать какой константой:
"{pf}" или "{pf32}"?

Аналогичный вопрос по поводу папки Windows и System как с ними быть в 64-х разрядной ОС?

ИМЕЕТСЯ ВВИДУ, ЧТО ПРИЛОЖЕНИЕ СОДЕРЖИТ 64-Х РАЗРЯДНЫЕ МОДУЛИ: системные файлы, библиотеки, драйвера, а не просто поддерживают обе версии ОС.
Т.к. как большинство 32-х разрядных приложений может вполне нормально работать и на 64-х разрядной ОС!

ИЛИ ЖЕ ВСЕ ЭТИ "ТОНКОСТИ" НУЖНЫ ЛИШЬ КОГДА ПРИЛОЖЕНИЕ 64-х РАЗРЯДНОЕ и будет работать, только на 64-х разрядной ОС?

2. Ещё подобный вопрос по поводу 32-х разрядного приложения, которое будет запускаться на 64-х разрядной ОС, в таком случае, что писать в скрипте?

3. И последнее, когда приложение само по себе 64-х разрядное, то установщик для неё то же должен быть 64-х разрядным? Т.е. чтобы инстал был 64-х разрядным и вообще НЕ запускался на 32-х разрядной ОС.
Умеет ли Inno Setup это делать и можно ли собрать установщик для 64-х разрядного приложения на 32-х разрядной ОС?

R.i.m.s.k.y. 05-12-2011 21:15 1809903

Цитата:

Цитата TROY Diamond
Сам по себе Inno Setup по умолчанию делает "универсальные" установщики, которые будут работать на всех ОС или нет »

да универсальные пока в ArchitecturesAllowed не указано иное, к примеру если указать ArchitecturesAllowed=х64 то на винх86 инсталлер выдаст сообщение что ОС не поддерживается и закроется, по умолчанию ArchitecturesAllowed не задан и инсталлер работает на винх86 как родной, в винх64 - как вин32 приложение

Цитата:

Цитата TROY Diamond
А также если программа по умолчанию должна устанавливаться в в папку "Program Files", то путь прописывать какой константой:
"{pf}" или "{pf32}" »

прописывать константой {app}
или зависит от самого приложения где ему комфортней

Цитата:

Цитата TROY Diamond
Аналогичный вопрос по поводу папки Windows и System как с ними быть в 64-х разрядной ОС »

в вин64 system32 теперь ютятся х64 компоненты, в syswow64 - это аналог system32, там проживают х32 компоненты
читай в справке 64-bit Installation Limitations и Install Mode: 32-bit vs. 64-bit

Цитата:

Цитата TROY Diamond
ИМЕЕТСЯ ВВИДУ, ЧТО ПРИЛОЖЕНИЕ СОДЕРЖИТ 64-Х РАЗРЯДНЫЕ МОДУЛИ: системные файлы, библиотеки, драйвера, а не просто поддерживают обе версии ОС.
Т.к. как большинство 32-х разрядных приложений может вполне нормально работать и на 64-х разрядной ОС! »

индивидуально отслеживать что куда пишется и раскидывать внимательно, системная функция IsWin64 тебе в помощь

Цитата:

Цитата TROY Diamond
ИЛИ ЖЕ ВСЕ ЭТИ "ТОНКОСТИ" НУЖНЫ ЛИШЬ КОГДА ПРИЛОЖЕНИЕ 64-х РАЗРЯДНОЕ и будет работать, только на 64-х разрядной ОС? »

тонкости есть всегда, но в данном акцепте в вин64 надо следить что-куда раскидывается независимо х64 или х32 приложение устанавливается

Цитата:

Цитата TROY Diamond
Ещё подобный вопрос по поводу 32-х разрядного приложения, которое будет запускаться на 64-х разрядной ОС, в таком случае, что писать в скрипте »

зависит от того что нужно приложению, не ставь ArchitecturesInstallIn64BitMode=x64 и в вин64 инно поставит твое х32 прогу как 32битное приложение

Цитата:

Цитата TROY Diamond
И последнее, когда приложение само по себе 64-х разрядное, то установщик для неё то же должен быть 64-х разрядным? »

инно 32 разрядный, поэтому он не может вызывать х64 библиотеки, но ставить может
пишешь ArchitecturesInstallIn64BitMode=x64

Цитата:

Цитата TROY Diamond
чтобы инстал был 64-х разрядным и вообще НЕ запускался на 32-х разрядной ОС. »

ArchitecturesAllowed=x64 и инсталлер на вин32 выдаст предупреждение и закроется

Цитата:

Цитата TROY Diamond
Умеет ли Inno Setup это делать и можно ли собрать установщик для 64-х разрядного приложения на 32-х разрядной ОС »

можно собрать инно64 но с нюансами, описанными в Install Mode: 32-bit vs. 64-bit

при четком понимании процесса и ясной голове проблем не возникнет


ПыСы: какие вопросы такие и ответы

ArchitecturesAllowed задает тип винды на котором запускается инсталлер
по умолчанию пустой, инсталлер работает в вин32 как родной, в вин64 как 32 битное приложение, если прописать только один тип винды, то на другой инсталлер не заработает, напишет неподдерживаемая венда и закроется

ArchitecturesInstallIn64BitMode=х64 говорит инсталлеру что в вин64 он будет как вин64 приложение, от этого зависят пути до папок, ключи реестра и прочее
прочитай 64-bit Installation Limitations и Install Mode: 32-bit vs. 64-bit



Цитата:

Цитата El Sanchez
я не знаю что там с DelTree, когда я столкнулся что на шаге ssInstall ничего не удаляется »
Стало быть в папке есть файлы, занятые системой. »

а стандартная RD удаляет занятые файлы влет? так не бывает, что-то другое

Devils Night 06-12-2011 02:59 1810048

читать дальше »
Цитата:

Цитата Лександер
Както так пробуй. »

Цитата:

Цитата R.i.m.s.k.y.
как-то так »

Цитата:

Цитата El Sanchez
Код:

GetEnv('USERPROFILE');
GetShellFolderByCSIDL($28, True);

»

Лександер, R.i.m.s.k.y., El Sanchez, Спасибо вам ребятки огромное, но что-то никак.
Короче говоря
Код:

[UninstallDelete]
Name: {userdocs}\MyProgs; Type: filesandordirs

т.е из C:\Documents and Settings\iUser\Мои документы\MyProgs
всё прекрасно удаляет

Код:

[UninstallDelete]
Name: {userprofile}\MyProgs; Type: filesandordirs

C:\Documents and Settings\iUser\MyProgs - (%userprofile%\MyProgs)
ни в какую, что с выше приведёнными примерами, что без них, а нужно то, всего лишь удалить папку :cry:.

Вы конечно извините, но эти скрипты мне с трудом даются, где то могу понять, а где то нет, так что не обессудьте за тормознутость, да и прежде чем задать вопрос, я всегда смотрю справку. А поиск, а что поиск, там какие алгоритмы не вводи, всё равно выдаёт не то что нужно.



Еще три вопроса. Как сделать вот что?
1. Вопрос
a) При нажатии на кнопку выводил адрес шлюза с возможностью копирования его по кнопке.
b) Трассировку маршрута, т.е на странице дополнительных задач было окно в котором вводится шлюз и по нажатии Ок происходит трассировка или как там ещё называется.
читать дальше »
Код:

[ Code]
var
  IPAddressEdit: TIPAddressEdit;
  Button: TNewButton;
procedure RedesignWizardForm;
begin

//************************************ Трассировка ************************************
  IPAddressEdit := TIPAddressEdit.Create(WizardForm);
  with IPAddressEdit do
  begin
    Name := 'IPAddressEdit';
    Parent := WizardForm.SelectTasksPage;
    Left := ScaleX(8);
    Top := ScaleY(200);
    Width := ScaleX(150);
    Height := ScaleY(21);
  end;
  IPAddressEdit.TabOrder := 2;
//************************************ Вывод Трассировка ************************************

//************************************ Кнопка Проверить шлюз ************************************
Button := TNewButton.Create(WizardForm);
  with Button do
  begin
    Name := 'Button';
    Parent := WizardForm;
    Left := ScaleX(16);
    Top := ScaleY(327);
    Width := ScaleX(99);
    Height := ScaleY(23);
    Caption := 'Проверить шлюз';
  end;
  Button.TabOrder := 5;
//************************************ Кнопка Проверить шлюз ************************************
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;


//************************************ Вывод шлюза ************************************
//Function InitializeSetup: Boolean;
//begin
//if MsgBox('Ваш шлюз: 000.000.000.000', mbError, MB_OK) = idYes then result := true else result := false;
//end;
//************************************ Вывод шлюза ************************************




//************************************ Вывод шлюза ************************************
var
  Button1: TNewButton;
Function InitializeSetup: Boolean;
begin
if MsgBox('Ваш шлюз: 000.000.000.000', mbError, MB_OK) = idYes then result := true else result := false;

begin
  Button1 := TNewButton.Create(WizardForm);
  with Button1 do
  begin
    Name := 'Скопировать';
    Parent := WizardForm;
    Left := ScaleX(32);
    Top := ScaleY(327);
    Width := ScaleX(75);
    Height := ScaleY(25);
  end;
  Button1.TabOrder := 5;
end;

end;
//************************************ Вывод шлюза ************************************

Визуально представить это могу, но чтобы средствами Inno это сделать, просто в голове не укладывается.

2. Вопрос
Как сделать четыре кнопки Изменить, Запустить, Удалить и Отмена
читать дальше »
Код:

#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "unins000.exe"

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}

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

[Messages]
rus.SetupWindowTitle={#AppName}

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion nocompression;

[Icons]
Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}"
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, "&", "&&")}}"; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKLM; Subkey: "SOFTWARE\{#AppName}"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\{#AppName}"; ValueName: "Path"; ValueType: String; ValueData: "{app}\"; Flags: uninsdeletekey

[UninstallDelete]
Type: filesandordirs; Name: {app};

[ Code]
//************************************** Четыре кнопки **************************************
var
AppDir, unins, run: string;
ResultCode: Integer;
UninsButton, RunButton: TButton;
MyLabel: TLabel;

procedure ReadEntries;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\{#AppName}', 'Path', AppDir);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;

procedure Uninstall(Sender: TObject);
begin
unins:='{#UnExe}';
ReadEntries;
if not (FileExists(AddBackslash(AppDir) + unins)) then
MsgBox('Невозможно запустить деинсталляцию программы ' + ExpandConstant('{#AppName}') + ', т.к. исполняемый файл деинсталляции unins000.exe не найден.', mbCriticalError, MB_OK or MB_DEFBUTTON1)
else
Exec(AddBackslash(AppDir) + unins, '', ExtractFilePath(AddBackslash(AppDir) + unins), SW_SHOW, ewNoWait, ResultCode);
WizardForm.Close;
end;

procedure RunProgramm(Sender: TObject);
begin
run:='{#AppExeName}';
ReadEntries;
if (FileExists(AddBackslash(AppDir) + run)) then
Exec(AddBackslash(AppDir) + run, '', ExtractFilePath(AddBackslash(AppDir) + run), SW_SHOW, ewNoWait, ResultCode);
WizardForm.Close;
end;


//************************************** Новый кнопарь *****************************************
procedure RunInstall(Sender: TObject);
begin
run:='{src}\{#InExe}';
ReadEntries;
if (FileExists(AddBackslash(AppDir) + run)) then
Exec(ExpandConstant('{src}\{#InExe}'),'','',SW_SHOW,ewNoWait,ResultCode);
WizardForm.Close;
end;
//************************************** Новый кнопарь *****************************************


procedure NewForm;
begin
ReadEntries;
if (RegValueExists(HKLM, 'SOFTWARE\{#AppName}', 'Path')) and (FileExists(ExpandConstant(AppDir)+'\{#AppExeName}')) then begin
with WizardForm do
begin
ClientWidth := ScaleX(395);
ClientHeight := ScaleY(120);
Bevel.Hide;
InnerNotebook.Hide;
OuterNotebook.Hide;
BorderStyle:= bsDialog;
Center;
with CancelButton do
begin
Left := WizardForm.CancelButton.Left -100;
Top := WizardForm.ClientHeight - CancelButton.Height - ScaleY(10);
BringToFront;
end;




//************************************** Новый кнопарь *****************************************
RunButton:= TButton.Create(WizardForm);
with RunButton do
begin
Left := WizardForm.NextButton.Left -280;
Top := WizardForm.ClientHeight - NextButton.Height - ScaleY(10);
Width:= WizardForm.NextButton.Width;
//Height := 22;
Parent:= WizardForm;
Caption:= 'Изменить';
OnClick := @RunInstall;
//Cursor:= crHand;
BringToFront;
end;
//************************************** Новый кнопарь *****************************************



UninsButton:= TButton.Create(WizardForm);
with UninsButton do
begin
Left := WizardForm.NextButton.Left -100;
Top := WizardForm.ClientHeight - NextButton.Height - ScaleY(10);
Width:= WizardForm.NextButton.Width;
Parent:= WizardForm;
Caption:= 'Удалить';
OnClick := @Uninstall;
BringToFront;
end;

RunButton:= TButton.Create(WizardForm);
with RunButton do
begin
Left := WizardForm.BackButton.Left -110;
Top := WizardForm.ClientHeight - BackButton.Height - ScaleY(10);
Width:= WizardForm.BackButton.Width;
Parent:= WizardForm;
Caption:= 'Запустить';
OnClick := @RunProgramm;
BringToFront;
end;

MyLabel:= TLabel.Create(WizardForm);
with MyLabel do
begin
SetBounds(10,10,380,80);
AutoSize:=False;
WordWrap:=True;
//Font.Color:=$000000;
//Font.Style:=[fsBold];
//Font.Size:=10;
Parent:=WizardForm;
Transparent:=True;
Caption:= 'Программа ' + ExpandConstant('{#AppName}') + ' уже установлена на Ваш компьютер.' +#13#13+ 'Выберите нужное действие.';
end;
end;
end;
end;

procedure InitializeWizard;
begin
NewForm;
end;
//************************************** Четыре кнопки **************************************


3. Вопрос
Как сделать так чтобы при установки определялась версия Net.Framework 3.5, если он не установлен, то сначало устанавливался Net.Framework 3.5 из папки Others, а потом продолжалася установка, если установлен то продолжал установку?

R.i.m.s.k.y. 06-12-2011 08:12 1810102

Цитата:

Цитата Devils Night
Как сделать так чтобы при установки определялась версия Net.Framework 3.5, если он не установлен, то сначало устанавливался Net.Framework 3.5 из папки Others, а потом продолжалася установка, если установлен то продолжал установку? »

Код:

function netfw35(): Boolean;
begin
if ( RegKeyExists(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5') ) then Result := True else Result := False;
end;

Function InitializeSetup: Boolean;
var res, i : Integer;
Begin
result:=true;//шоп не закрылся инсталлер
if (not netfw35) then begin
  MsgBox('Net.Framework 3.5 не найден, нажмите ОК для установки', mbInformation, MB_OK);
  Exec(ExpandConstant('{src}\Others\dotnet35.exe'), ' /q /passive /norestart',ExpandConstant('{src}\Others\'),SW_show, ewWaitUntilTerminated, res);
  result:=true;//шоп не закрылся инсталлер
end;//if (not netfw35)
end; //InitializeSetup


Devils Night 06-12-2011 12:27 1810248

R.i.m.s.k.y., это я закоментировал
Код:

result:=true;//шоп не закрылся инсталлер
, чтоб закрывался, потому не нужно чтобы устанавливался без Framework-а, и нужно вот что, чтобы установка дожидалась пока установится Framework, и как Framework установится то продолжалась основная установка!?

R.i.m.s.k.y. 06-12-2011 12:39 1810258

Цитата:

Цитата Devils Night
чтоб закрывался, потому не нужно чтобы устанавливался без Framework-а, и нужно вот что, чтобы установка дожидалась пока установится Framework, и как Framework установится то продолжалась основная установка!? »

ewWaitUntilTerminated указывает, что инсталлер будет ждать пока не поставится фреймворк
тебе надо чтобы закрылся или чтобы поставил фреймворк и продолжил?
вверху - поставит и продолжит
если хочешь чтобы закрылся - убери Exec и исправь

if (not netfw35) then begin
...
result:=false;
...

кстати зря закомменил "шоп не закрылся инсталлер", если какой-то шаг вернет false в результате ошибки вызова, то без этой строчки InitializeSetup тоже может получить на выходе false и инсталлер закроется

ворчание моде он
народ, где вы так писать научились, а? зато никто не забывает попинать бабу-ЕГЭ
книжки бы хоть почитали, грамотные, как предложения строятся, как мысль из мозга переносится на бумагу/клавиатуру
хотя если учесть, что написанная мысль - есть мысль измышленная, я даже боюсь представить что там измышляется :)

TROY Diamond 07-12-2011 18:49 1811150

Помогите, пожалуйста, доработать, исправить, "усовершенствовать" скрипт!
Или поделитесь какими-нибудь другими кодами создания индикаторов процесса "для секции [Run]"

ПРОБЛЕМА: Индикатор работает НЕ на всех темах!!!

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
OutputDir=.
Compression=lzma/ultra
SolidCompression=yes

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[code]
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

const
PBM_SETMARQUEE = $040A;
GWL_STYLE = -16;
PBS_MARQUEE = $08;

var
AnimatePb: TNewProgressBar;

procedure CreateAnimatePb;
begin
AnimatePb := TNewProgressBar.Create(WizardForm);
with AnimatePb do
begin
Parent := WizardForm.InstallingPage;
SetBounds(WizardForm.ProgressGauge.Left, WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10),
WizardForm.ProgressGauge.Width, WizardForm.ProgressGauge.Height);
SetWindowLong (AnimatePb.Handle, GWL_STYLE, (GetWindowLong (AnimatePb.Handle, GWL_STYLE) or PBS_MARQUEE));
SendMessage(AnimatePb.Handle, PBM_SETMARQUEE, 1, 20);
end;
end;

procedure AnimatePbMsg(const msg: string);
begin
if AnimatePb = nil then
CreateAnimatePb;
WizardForm.FilenameLabel.Caption := msg;
end;

procedure AnimatePbFree;
begin
if AnimatePb <> nil then
begin
AnimatePb.Free;
AnimatePb := nil;
end;
end;

[Run]
Filename: {app}\MyProg.exe; BeforeInstall: AnimatePbMsg('Создание файла...'); Flags: skipifsilent
Filename: {app}\MyProg2.exe; BeforeInstall: AnimatePbMsg('Создание файла...'); Flags: skipifsilent
Filename: {app}\MyProg3.exe; BeforeInstall: AnimatePbMsg('Создание файла...'); AfterInstall: AnimatePbFree; Flags: skipifsilent

ПРОБЛЕМА: Индикатор работает НЕ на всех темах!!!

А также:
1. Нужно поднять индикатор выше, чтобы он был на том же самом месте, что и оригинальный и выглядел также.
2. Убрать сообщения, т.к. я использую "StatusMsg", а если не использовать, то появится сообщение "Завершение установки"
3. Сделать кнопку "Отмена" активной и вернуть возможность прерывания процесса установки.

Если нельзя ничего этого сделать, поделитесь какими-нибудь другими кодами создания индикаторов процесса "для секции [Run]"

У меня из секции [Run], выполняется ещё куча команд в скрытом режиме, которая занимает довольно много времени, поэтому нужна какая-то индикация...

ИЛИ МОЖЕТ ЕСТЬ КАКОЙ-НИБУДЬ ДРУГОЙ СПОСОБ, для запуска и выполнения дополнительных операций, во время и/или после установки, НЕ обязательно из секции [Run] со стандартной индикацией процесса?!

Devils Night 08-12-2011 07:46 1811427

Цитата:

Цитата R.i.m.s.k.y.
чтобы поставил фреймворк и продолжил? »

Именно это надо.
Цитата:

Цитата R.i.m.s.k.y.
кстати зря закомменил "шоп не закрылся инсталлер" »

А когда не убран, он всё равно продолжает установку, даже если фреймворк не установлен.
Цитата:

Цитата R.i.m.s.k.y.
убери Exec и исправь
if (not netfw35) then begin
...
result:=false;
... »

Насчёт этого, я тугой вообще, туго соображаю.

TROY Diamond 08-12-2011 16:13 1811683

Посмотрите, пожалуйста, мой скрипт, - проверьте, исправьте если, что нужно и скажите, что да, как!
За гламуром вообще НЕ гонюсь... наоборот, всё должно быть компактно, аккуратно и близко к оригиналу...

http://rghost.ru/33759851

Если есть более, простой способ всех проведённых мною манипуляций, то подскажите, пожалуйста!
А также, посоветуйте, пожалуйста, насчёт индикатора процесса...
И вообще, что касается выполнения большого количества каких-либо операций во время и/или после установки, как это лучше реализовать?
Можно ли сделать кнопку "Отмена" активной и/или выполнять это всё не из секции [Run]?!
А последнее по поводу "runascurrentuser" нужно, чтобы все команды выполнялись с правами Администратора!

TROY Diamond 08-12-2011 17:17 1811723

Как использовать *.png или *.gif картинку в WizardSmallImageFile и WizardImageFile, вместо *.bmp

Vista-w 08-12-2011 18:01 1811742

TROY Diamond,
botva2.dll

ARS_23 08-12-2011 22:28 1811837

Vista-w,
на сколько я знаю-ботва не работает с *.gif

No4noylis 08-12-2011 22:44 1811843

ARS_23, Inno GIFCtrl не поможет???

ARS_23 08-12-2011 22:56 1811850

Цитата:

Цитата No4noylis
Inno GIFCtrl не поможет??? »

вот она как раз подойдет

valyok666 09-12-2011 13:14 1812125

Цитата:

Цитата ARS_23
Цитата No4noylis:
Inno GIFCtrl не поможет??? »
вот она как раз подойдет »

botva2.dll 0.9.5
Библиотека для вставки изображений в инсталлятор (jpg, png, gif, tif, bmp). Присутствует возможность создания обычных кнопок и кнопок имеющих 8 состояний (как у чекбоксов), а также множество разнообразных функций и процедур для работы с изображениями. В архиве (1.2 Мб) dll + примеры использования.

sergey3695 09-12-2011 18:43 1812319

valyok666, ботва отображает gif как картинку. Анимацию gif она не поддерживает. ))

Rikill 09-12-2011 20:03 1812353

ARS_23, ой, фу, ребят, GIFCtrl трешак ещё тот. Советую использовать fairy.dll. У неё функций побольше.

ARS_23 09-12-2011 20:10 1812356

Rikill,
спасибо за совет
может в будущем пригодится :)

LinkOFF 09-12-2011 22:11 1812420

Здраствуйте.Как убрать вот это -

Dark_Delphin 09-12-2011 22:28 1812430

LinkOFF, в секцие [Сomponents] убери вот такие строчки ExtraDiskSpaceRequired: 19100000

LinkOFF 09-12-2011 22:30 1812434

Цитата:

Цитата ntrx
LinkOFF, в секцие [Сomponents] убери вот такие строчки ExtraDiskSpaceRequired: 19100000 »

не помогло.тоже самое пишет

mezi 10-12-2011 01:20 1812516

LinkOFF,
Код:

[Setup]
ShowComponentSizes=false


TROY Diamond 11-12-2011 15:26 1813224

НЕ пинайте меня, пожалуйста! Подобное уже спрашивали!!!

1. Мне нужно наложить картинку на все диалоговые окна инсталлятора, КРОМЕ ПЕРВОЙ И ПОСЛЕДНЕЙ. А здесь есть на все окна... и только на первую и последнюю.

2. Как при удалении приложения организовать полное удаление всего, что было создано в процессе установки и использования: профили, настройки, конфигурацию, сохранения... БЕЗ использования утилит типа "Kill_Save".
Как при установке (запуске) и удалении приложения находить и удалять "хвосты", "мусор". К примеру до этого приложение было установлено, - его удалили, но после него, что-то осталось?

3. Как использовать png-картинку вместо BMP в WizardSmallImageFile и WizardImageFile, - скриптик можно?

4. Константа (переменная) папки временных файлов Windows. {tmp} - ЭТО НЕ ТО!!!

R.i.m.s.k.y. 11-12-2011 16:28 1813261

Цитата:

Цитата TROY Diamond
. Константа (переменная) папки временных файлов Windows. »

{%TEMP}, {%TMP}, конструкция {%NAME} возвращает переменную окружения NAME
или используй функцию GetTempDir

TROY Diamond 11-12-2011 19:36 1813388

Как сделать такой установщик?


ARS_23 11-12-2011 19:41 1813390

TROY Diamond,
на скрине немного перекрашенный инсталл от YURSHAT
оригинал уже давно лежит в паблике ссылка, а перекрасить его 5сек

nik1967 11-12-2011 20:30 1813412

Цитата:

Цитата ARS_23
оригинал уже давно лежит в паблике »

Только там, насколько я помню, ISDone 5 версии. С 6 версией я сей скрипт не обновлял :(

TROY Diamond 11-12-2011 20:33 1813416

Цитата:

Цитата ARS_23
TROY Diamond,
на скрине немного перекрашенный инсталл от YURSHAT
оригинал уже давно лежит в паблике ссылка, а перекрасить его 5сек

Доступен NFS Undercover, а это NFSMW!

Мне бы скриптик, так, чтобы представление иметь как картинку наложить и как внешним компресором упаковать/распаковать.

Совсем НЕ обязательно весь этот гламур!

Edison007 11-12-2011 20:42 1813422

Цитата:

Цитата nik1967
Только там, насколько я помню, ISDone 5 версии. С 6 версией я сей скрипт не обновлял »

вообще стоило бы весь скрипт переписать, т.к много лишнего, что можно сократить, переделать и оптимизировать ;)

ARS_23 11-12-2011 20:46 1813423

Цитата:

Цитата TROY Diamond
Доступен NFS Undercover, а это NFSMW! »

это один и тот же скрипт, просто в оригинале заменили фоновую картинку
Цитата:

Цитата TROY Diamond
Мне бы скриптик, так, чтобы представление иметь как картинку наложить и как внешним компресором упаковать/распаковать. »

этот скрипт как раз для этого подойдет, хотя проще скачать отдельно ботву и посмотреть примеры
Цитата:

Цитата nik1967
Только там, насколько я помню, ISDone 5 версии. С 6 версией я сей скрипт не обновлял »

кому надо-обновит :)

TROY Diamond 11-12-2011 21:07 1813427

Цитата:

Цитата ARS_23
этот скрипт как раз для этого подойдет, хотя проще скачать отдельно ботву и посмотреть примеры

Спасибо Вам всем!!!

Мне бы вообще простой скрипт, БЕЗ мишуры...

Чтобы файлы были *.bin, лежали рядом с setup.exe и распаковка начиналась из них без копирования на винт, а потом распаковка... чтобы это всё выглядело как обычная установка.

А также скрипт для упаковки файлов в zip с переименованием, для создания репаков игр типа Quake, Hitman, Call of Duty, где большая часть ресурсов игры упауовано в переименованные архивы.
Я вс е эти архивы распаковал, хочу загнать в инстал, сжать, а потом, чтобы они при установке запаковывались, и сразу удалялись.

Я НЕ знаю как поэтому сделал, из секции Code, поэтому сделал из Run с кучей батников, но это долго, нужно много места и дополнительная индикация процесса какая-то!

http://rghost.ru/33759851

Подскажите!

nik1967 11-12-2011 21:47 1813454

Цитата:

Цитата Edison007
вообще стоило бы весь скрипт переписать, т.к много лишнего, что можно сократить, переделать и оптимизировать »

Оффтоп
А чё сразу я? Скрипт YURSHAT'a, пусть он и переделывает :)

Gugle 12-12-2011 13:36 1813721

Доброго времени суток!

Мне нужно спросить пользователя о перезагрузке ПК после установки приложения. В параметрах установки в секции [Setup] прописал: AlwaysRestart=yes. После установки на странице Finish появляется сообщение, что надо перезапустить ПК, но при выборе "Да, перегрузить сейчас" ничего не происходит. Подскажите пожалуйста что не так?

R.i.m.s.k.y. 12-12-2011 13:39 1813723

Gugle, симметрично доброго!

а случайно системная функция NeedRestart не переопределена?

nugzari 12-12-2011 20:20 1813955

Здравствуйте! Помагите пожалуйста создать такие окна инсталяции
читать дальше »
и заранее спасибо!

TROY Diamond 12-12-2011 20:37 1813967

Как с помощью [INI] или как-то по другому создать файл, текстовый и другие, НО ТОЛЬКО С ОДНИМ ЗНАЧЕНИЕМ "ВНУТРИ", БЕЗ параметра, никаких "Section", "InstallPath", НЕ надо!
Только одно значение БЕЗ всего - в одну строчку, без кавычек, тире, двоеточий, типа открыл это файл, а там только:

htuifgvifgj4575489jgfkgfmgf765авроршгщ

и всё больше ничего нет!

R.i.m.s.k.y. 12-12-2011 20:46 1813973

TROY Diamond, функция SaveStringToFile или SaveStringsToFile

TROY Diamond 12-12-2011 22:13 1814022

Цитата:

Цитата R.i.m.s.k.y.
TROY Diamond, функция SaveStringToFile или SaveStringsToFile »

А куда её писать то?

R.i.m.s.k.y. 12-12-2011 22:21 1814031

TROY Diamond, паскалевские функции пишутся только в Code

TROY Diamond 12-12-2011 23:20 1814064

Как сделать, чтобы установка продолжалась, ТОЛЬКО после "прочтения" Лицензионного соглашения и/или какого-то сообщения.
Я видел, к примеру, кнопки не активные, пока не прокрутишь текст до самого низа...

mopsicus 13-12-2011 12:48 1814291

Подскажите как перед установкой программы, удалить какой либо ярлык? Можно это сделать средствами установщика или надо писать скрипт?

спасибо

R.i.m.s.k.y. 13-12-2011 15:54 1814434

Цитата:

Цитата TROY Diamond
Как с помощью [INI] или как-то по другому создать файл, текстовый и другие, НО ТОЛЬКО С ОДНИМ ЗНАЧЕНИЕМ "ВНУТРИ", БЕЗ параметра, никаких "Section", "InstallPath", НЕ надо!
Только одно значение БЕЗ всего - в одну строчку, без кавычек, тире, двоеточий, типа открыл это файл, а там только »

или досовская команда echo
Код:

echo www > c:\1.txt
в корне диска ЦЭ будет файлик 1.txt с содержимым www

TROY Diamond 13-12-2011 17:21 1814498

Цитата:

Цитата R.i.m.s.k.y.
в корне диска ЦЭ будет файлик 1.txt с содержимым www »

Мне нужно в папке установки и одним значением...

TROY Diamond 13-12-2011 18:54 1814563

Как задать в свойствах ярлыка или где, чтобы прога запускалась, только с правами Администратора? На Висте и 7-ке ярлык со "щитом." Или это только в Манифесте прописывается?

YURSHAT 13-12-2011 19:03 1814567

TROY Diamond
Цитата:

Цитата TROY Diamond
Как с помощью [INI] или как-то по другому создать файл, текстовый и другие, НО ТОЛЬКО С ОДНИМ ЗНАЧЕНИЕМ "ВНУТРИ", БЕЗ параметра, никаких "Section", "InstallPath", НЕ надо!
Только одно значение БЕЗ всего - в одну строчку, без кавычек, тире, двоеточий, типа открыл это файл, а там только:
htuifgvifgj4575489jgfkgfmgf765авроршгщ
и всё больше ничего нет! »

Можно так

TROY Diamond,
Цитата:

Цитата TROY Diamond
Как сделать, чтобы установка продолжалась, ТОЛЬКО после "прочтения" Лицензионного соглашения и/или какого-то сообщения.
Я видел, к примеру, кнопки не активные, пока не прокрутишь текст до самого низа... »

Держите
примерчик
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
LicenseFile=compiler:License.txt

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy

[Code_]
type
  TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
const
  EM_GETFIRSTVISIBLELINE = $CE; TestLine = 5;
var
  TimerID: LongWord;

function WrapTimerProc(callback:TProc; paramcount:integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
var
  CurrLine: integer;
begin
  CurrLine:= SendMessage(WizardForm.LicenseMemo.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
  If CurrLine >= TestLine then
    begin
      WizardForm.LicenseAcceptedRadio.Enabled:= True;
      KillTimer(0, TimerID);
    end;
  //WizardForm.Caption:= IntToStr(CurrLine);
end;

procedure InitializeWizard();
begin
  WizardForm.LicenseAcceptedRadio.Enabled:= False;
end;

procedure CurPageChanged(CurPageID: Integer);
var
  pfunc: LongWord;
begin
  if CurPageID = wpLicense then
    begin
      pfunc:= WrapTimerProc(@OnTimer, 4);
      TimerID:= SetTimer(0, 0, 500, pfunc);
    end else
      KillTimer(0, TimerID);
end;

procedure DeinitializeSetup();
begin
  KillTimer(0, TimerID);
end;



Цитата:

Цитата TROY Diamond
Как задать в свойствах ярлыка или где, чтобы прога запускалась, только с правами Администратора? »

О свойствах ярлыка - читаем справку к инно

semiono 13-12-2011 21:59 1814681

Мне нужен код чтобы разрешить установку части контента, но только при помощи ключа.
Например:
MyProg.exe /verysilent /x1 /x2 итд...
Чтобы из секции файлов копировались файлы с флагом Code: {x1} и Code: {x2} и остальные как обычно.
Просто не помню как к коду это привязать.
GUI диалог мне не нужен! Только средством ключей, и хотя бы пару покажите, ато я сам запутаюсь.
---
И ещё мне нужен ключ, чтобы указать путь установки: /PATH=... Как это в InnoSetup работает, есть ли ограничения?
Всмысле мне нужно чтобы путь указывался только посредством ключа коммандной строки,
а в GUI режиме не было возможности указать путь. Это возможно? Покажите пожалуйста?

boss911 13-12-2011 23:40 1814744

Цитата:

Цитата mopsicus
как перед установкой программы, удалить какой либо ярлык? »

Код:

[InstallDelete]
Name: {userdesktop}\shortcut.lnk; Type: files


semiono 14-12-2011 01:39 1814795

Помогите, пожалуйста!
Мне нужно чтобы

[Files]
... Components: a
... Components: b
...
чтобы компоненты a и b поумолчанию не устанавливались, и устанавливались только при явном их выборе. Причём нужен выбор этих компонентов из коммандной строки, например, /A /B и не зависимо друг от друга.
Графический (GUI) выбор компонентов совсем не нужен и лучше его скрыть, тем более что файлы
группы A и B по умолчанию исключены.

Проще говоря нужно такое
файл_1 установить = да
файл_2 установить = да
файл_3 установить = нет
файл_4 всегда установить
итп.

управление только с коммандной строки, хотя в худшем случае можно продублировать в GUI

R.i.m.s.k.y. 14-12-2011 07:43 1814858

Цитата:

Цитата semiono
Мне нужен код чтобы разрешить установку части контента, но только при помощи ключа. »

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

[Files]
Check: Check_X1; Source: x1files; DestDir: {app}\; Flags: ignoreversion noencryption
Check: Check_X2; Source: x2files; DestDir: {app}\; Flags: ignoreversion noencryption

[*C*ODE]
var x1, x2 : boolean;

Function Check_X1() : boolean;
begin
If x1 = true then Result := True else Result := False;
end;

Function Check_X2() : boolean;
begin
If x2 = true then Result := True else Result := False;
end;

Function InitializeSetup: Boolean;
var
i : integer; st : string;
Begin
  x1 := false; x2 := false;
  for i:=2 to ParamCount do begin
    st := Lowercase(ParamStr(i));
    Result := True;
    case st of
      Lowercase('/x1')  : x1 := true;
      Lowercase('/x2')  : x2 := true;
    end; //case
    Result := True;
  end;//for
end;//InitializeSetup

если параметров Х1/Х2 много, имеет смысл загнать проерку в одну спецфункцию Check_X где в цикле проверять какие из них назадавали в комстроке, но тут в моем мозгу происходит переполнение стека и родить такую я не могу, даже себе

по поводу компонентов - инно поддерживает сам параметр /COMPONENTS="a,b"
читай в справке Setup Command Line Parameters

semiono 14-12-2011 15:02 1815105

i is unknown parameter! я паскаль не знаю, как поправить? определил как i : integre, сразу последовало тоже самое с st
---
Цитата:

Цитата R.i.m.s.k.y.
если параметров Х1/Х2 много, имеет смысл загнать проерку в одну спецфункцию Check_X где в цикле проверять какие из них назадавали в комстроке »

не мне много не надо, разобью на группы контент, хотя бы пару ключей хватит :)

R.i.m.s.k.y. 14-12-2011 15:30 1815120

semiono,
поправил верхнее сообщение
Код:

Function InitializeSetup: Boolean;
var
i : integer; st : string;


Photon9 14-12-2011 15:30 1815121

мой вопрос наверное с большой бородой и не раз задавался, тем не менее немогу разобратся, суть проблемы такова - имеется игра и имеется дополнительный софт (GfWL, visual c++, directx и т.д.) собственно необходимо даный софт прописать в скрипте так чтобы в процессе установки в инсталятора были опции (снять-поставить галочку) с выбором устанавливать или нет даный софт, как ни ковыряю скрипт получается только прописать распаковывать при установке в папку с игрой софт или нет, а вот установку как запустить немогу понять.
З.Ы. Надеюсь понятно описал суть проблемы и не очень сумбурно

semiono 14-12-2011 15:37 1815128

Ура! Кажись работает как надо! Только end ещё один не хватало...
i: Integer;
st : String;

R.i.m.s.k.y. 14-12-2011 15:44 1815134

Photon9, скрипт скрасил бы твой сумбур :)
пока примерно так
Код:

[Tasks]
Name: vcredist; Description: "Установить visual c++"; GroupDescription: Дополнительные компоненты
...
[Run]
Tasks: vcredist; Filename: "vcredist.exe"; Parametrs: " /Q /norestart"; Description: Установка visual c++; Flags: RinHidden
//параметры установки vcredist.exe уточни


Цитата:

Цитата semiono
Только end ещё один не хватало »

поправил сообщение еще раз, расставил енды, одного не хватало

semiono 14-12-2011 16:16 1815152

R.i.m.s.k.y., у меня кажется всё ещё проблемма)
При пустом вводе без параметров не работает, когда я end сам добавил.
Сейчас перед end добавил Result := True; стало работать но боюсь что не корректно... пока проверяю..
Мне нужно чтобы работало как с параметрами /x1 /x2 так и без них,
причём могут быть дефолтные ключи, например /verysilent надеюсь это не должно конфликтовать?
Пока конкретная проблемма с пустым вводом получилась...

TROY Diamond 14-12-2011 16:18 1815154

YURSHAT

Спасибо всё работает, НО нужно чтобы файл создавался в процессе установки, как из "[INI]" и/или был пустым, а потом вводил моё значение?

Тоже работает, спасибо!
Это "надёжный" способ? Пользователь никак НЕ сможет продолжить установку БЕЗ прочтения?!

А, что вот это закомментированное "//WizardForm.Caption:= IntToStr(CurrLine);", такое,
если его раскомментировать и скомпилировать, то название приложения изчезает и в заголовке и появляется "27"

Как в процессе установки запустить, а потом автоматически его закрыть, не имеет значение из секции Run или Code?
Можно ведь, наверное и через "taskkill.exe" как-то это сделать?

Есть ли возможность при запуске установщика и/или в процессе установки, собрать необходимые сведения о компе, а потом их добавить в ветку реестра устанавливаемого приложения?
Или может какой-нибудь параметр есть? Есть же ведь имя компа, имя пользователя и т.п. Это ведь определяется?
Мне ,к примеру нужно, в реестре в ветке приложения создать ключ для видеокарты: "3D Device" со значение "Название видеокарты" и т.п.

А кнопка "Отмена" и сам установщик, должен не реагировать во время выполнения команд из секции Code? Это никак не исправить?
И когда его "отпускает" если нажать на кнопку "Отмена", можно ли "откатить" всё, чтобы в папке установки ничего не осталось или это действует только на "стандарт"?

semiono 14-12-2011 16:19 1815155

а ну всё! получилось, протестил варианты!

R.i.m.s.k.y. 14-12-2011 16:20 1815157

semiono, /verysilent как видишь не учитывается и никак не влияет
какое второе условие на копирование в секции Files x1files? выбор из списка компонентов?
у тебя /х2 /х1 всегда идут вместе с /verysilent?
я ж не знал что у тебя еще условия, какие граничные условия обозначил - такие я тебе и сделал
естественно что можно в подчековую функцию напихать таким же макаром еще проверок для конкретизации

Цитата:

Цитата TROY Diamond
Можно ведь, наверное и через "taskkill.exe" как-то это сделать? »

я тоже сначала сделал через "taskkill.exe", но как оказалось не на всех редакциях венды он есть, хе-хе


TROY Diamond
почисть личку, ничего не отправляется

semiono 14-12-2011 16:23 1815162

Код:

; ~
      Lowercase('/x1')  : x1 := true;
      Lowercase('/x2')  : x2 := true;
    end;
    Result := True;
end
    Result := True;
end;

Nautilus [Version 5.2.3790]
2001-2005 GmbH, Semiono

//setup.exe

//setup.exe /x1

//setup.exe /x2

//setup.exe /x2 /x1

//setup.exe /x2 /x1 /verysilent


это как в КП: "давим окурок левой ногой, потом правой а потом обееми сразу" :laugh:

Цитата:

Цитата R.i.m.s.k.y.
я тоже сначала сделал через "taskkill.exe", но как оказалось не на всех редакциях венды он есть, хе-хе »

taskkill не годиться, он просто напросто может не работать из-за твиков причём даже если файл taskkill.exe имеется

semiono 14-12-2011 16:34 1815172

Вложений: 1
Вот мой файл который можно использовать так: killsys.exe calc.exe.
Код 32-битный, но он может закрывать 64-битные приложения.
Работает рекурсивно, то-есть закроет все процессы.

Исходник:
Код:

include '%fasm%/win32ax.inc'
section '.code' executable
start:
        invoke GetCommandLine
        invoke CommandLineToArgv,eax,a
        cmp dword [a],1
        push eax
        jbe exit
        push dword [eax+4]
        call AdjustMyToken
        stdcall findProcessID
        test eax,eax
        jz exit
        invoke OpenProcess,PROCESS_TERMINATE,FALSE,eax
        push eax
        invoke TerminateProcess,eax,1
        invoke CloseHandle,[b]
        jmp start
exit:
        invoke ExitProcess,NULL

        SE_PRIVILEGE_ENABLED = 2
        TOKEN_ADJUST_PRIVILEGES = 32
        TOKEN_QUERY = 8
        TH32CS_SNAPPROCESS = 2

AdjustMyToken:

        invoke LookupPrivilegeValue,NULL,NULL,tokenPriv.LUID1
        mov dword [tokenPriv.PrivilegeCount],1
        mov dword [tokenPriv.Attributes],SE_PRIVILEGE_ENABLED
        invoke OpenProcessToken,-1,TOKEN_ADJUST_PRIVILEGES OR TOKEN_QUERY,b
        invoke AdjustTokenPrivileges,[b],FALSE,tokenPriv,NULL,NULL,NULL
        invoke CloseHandle,[b]
ret

findProcessID:

        push ebp
        invoke CreateToolhelp32Snapshot,TH32CS_SNAPPROCESS,NULL
        mov ebp,eax
        mov dword [procEntry.dwSize],sizeof.PROCESSENTRY32W
        invoke Process32First,eax,procEntry
@@:
        invoke Process32Next,ebp,procEntry
        test eax,eax
        jz @f
        invoke lstrcmpi,procEntry.szExeFile,dword [esp+8]
        test eax,eax
        jnz @r
        mov eax,dword [procEntry.th32ProcessID]
@@:
        pop ebp
ret

section '.data' readable writeable

        a rd MAX_PATH
        b rd MAX_PATH

struct TOKEN_PRIVILEGES

        PrivilegeCount dd NULL
        LUID1 dd NULL
        LUID2 dd NULL
        Attributes dd NULL
ends
        tokenPriv TOKEN_PRIVILEGES

struct PROCESSENTRY32W

        dwSize dd NULL
        cntUsage dd NULL
        th32ProcessID dd NULL
        th32DefaultHeapID dd NULL
        th32ModuleID dd NULL
        cntThreads dd NULL
        th32ParentProcessID dd NULL
        pcPriClassBase dd NULL
        dwFlags dd NULL
        szExeFile dw MAX_PATH dup NULL
ends
        procEntry PROCESSENTRY32W

section '.idata' import readable

        library advapi32,'ADVAPI32.DLL',kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL'
        include '%fasm%/api/advapi32.inc'
        import kernel32,CloseHandle,'CloseHandle',CreateToolhelp32Snapshot,'CreateToolhelp32Snapshot',\
              ExitProcess,'ExitProcess',GetCommandLine,'GetCommandLineW',lstrcmpi,'lstrcmpiW',\
              OpenProcess,'OpenProcess',Process32First,'Process32FirstW',Process32Next,'Process32NextW',\
              TerminateProcess,'TerminateProcess'
        import shell32,CommandLineToArgv,'CommandLineToArgvW'


R.i.m.s.k.y. 14-12-2011 16:39 1815176

Цитата:

Цитата semiono
taskkill не годиться, он просто напросто может не работать из-за твиков »

если тасккилл не работает из-за твиков, то винда уже не твикнутая, а убитая
а это уже к ветеринару, а не к нам

Photon9 14-12-2011 17:26 1815200

Вложений: 1
Вот скрипт, не уверен что я правильно вставил данные, жду совета

sergey3695 14-12-2011 17:42 1815210

semiono,
как использовать killsys.exe
Exec(ExpandConstant('{tmp}\killsys.exe'), 'setup.tmp', '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
так не работает. как надо?

R.i.m.s.k.y. 14-12-2011 17:43 1815211

Photon9, инно не кусается, запусти и сам все увидишь

Photon9 14-12-2011 17:43 1815212

По ходу прощёлкал момент с кодировкой и русские надписи знаками вопроса отмечены, но это чепуха исправить не сложно, главное чтобы скрипт работал

R.i.m.s.k.y., если ты обращался ко мне то проверить можно конечно, но размер дистрибутива 9 гигов, неохота по нескольку раз компилить

R.i.m.s.k.y. 14-12-2011 17:49 1815216

Photon9, делай в секции Files пустышки, легкие файлы чтобы только отследить копирование
по факту в Tasks GroupDescription - это описание группы, писать надо по русски, а ты по английски чего-то нагромозекал
Код:

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: vcredist2005; Description: "MS Visual c++ 2005 SP1"; GroupDescription: "MS Visual c++ "
Name: vcredist2008; Description: "MS Visual c++ 2008"; GroupDescription: "MS Visual c++ "
Name: vcredistDirectX; Description: "Установить DirectX"; GroupDescription: "Прочее"
Name: Net Framework 4.0; Description: "Установить  Net Framework 4.0"; GroupDescription: "Прочее"

и что за фак - имена задач одинаковые, для каждой задачи - свое имя, это же имя используешь в Run

Photon9 14-12-2011 17:58 1815219

Боюсь показатся тупым, но как под соответствующие пункты подставится требуемый софт если в разделе [Tasks] путь к дистрибутивам не указан?

Photon9 14-12-2011 18:00 1815221

Немного переделал скрипт

semiono 14-12-2011 18:00 1815222

sergey3695, нужно указать в качестве параметра имя процесса который надо закрыть, например, notepad.exe.
тебе нужен ShellExec(), а не WinExec(), чтобы указать параметры.

как-то так..
ShellExec('', ExpandConstant('{tmp}\killsys.exe', 'notepad.exe', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode)

Попробуй без InnoSetup запустить killsys notepad.exe и увидешь как это работает.

No4noylis 14-12-2011 22:09 1815368

Photon9, Если я тебя правильно понял, то через секцию [Run] устанавливай свой софт только дописывай
Tasks: "имя софта в секции таск";

Photon9 14-12-2011 23:31 1815409

Вложений: 1
С секцией tack я вроде разобрался, но вот на секции run скрипт стопорится :( матерится на Parametrs: " /Q /norestart"

И ещё вопросец как в ярлыке прописать рабочую папку, делал так но почему то не прописывается:

[Icons]
Name: {group}\FalloutNV; Filename: {app}\FalloutNVLauncher.exe; WorkingDir: {app}

valyok666 15-12-2011 13:03 1815743

Photon9,
В твоём скрипте
читать дальше »

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: vcredist_x86; Description: "Óñòàíîâèòü MS Visual c++ 2005 SP1"; GroupDescription: "Äîïîëíèòåëüíûé ñîôò"
Name: vcredist_x86; Description: "Óñòàíîâèòü MS Visual c++ 2008"; GroupDescription: "Äîïîëíèòåëüíûé ñîôò"
Name: dotNetFx40_Full_x86_x64; Description: "Óñòàíîâèòü Net Framework 4.0"; GroupDescription: "Äîïîëíèòåëüíûé ñîôò"
Name: DXSETUP; Description: "Óñòàíîâèòü DirectX"; GroupDescription: "Äîïîëíèòåëüíûé ñîôò"


[Run]
Filename: {app}\FalloutNVLauncher.exe; Description: {cm:LaunchProgram,Fallout New Vegas}; Flags: nowait postinstall skipifsilent
Tasks: vcredist_x86; Filename: "Redists\vcredist_x86.exe"; Parametrs: /Q /norestart; Description: Óñòàíîâêà MS Visual c++; Flags: RinHidden
Tasks: vcredist_x86; Filename: "Redists\vc2008\vcredist_x86.exe"; Parametrs: " /Q /norestart"; Description: Óñòàíîâêà MS Visual c++; Flags: RinHidden
Tasks: dotNetFx40_Full_x86_x64; Filename: "Redists\dotNetFx40_Full_x86_x64.exe"; Parametrs: " /Q /norestart"; Description: Óñòàíîâêà Net Framework 4.0; Flags: RinHidden
Tasks: DXSETUP; Filename: "Redists\directx\DXSETUP.exe"; Parametrs: " /Q /norestart"; Description: Óñòàíîâêà DirectX; Flags: RinHidden


А надо-->
читать дальше »

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: Redist; Description: Дополнительное Пограммное Обеспечение:;
Name: Redist\directx; Description: Обновить Microsoft DirectX; Flags: unchecked;
Name: Redist\vcredist_x86_2005SP1; Description: "Установить MS Visual c++ 2005 SP1"; Flags: unchecked;
Name: Redist\vcredist_x86_2008; Description: "Установить MS Visual c++ 2008"; Flags: unchecked;
Name: Redist\dotNetFx40_Full_x86_x64; Description: "Установить Net Framework 4.0"; Flags: unchecked;

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, "&", "&&")}}"; Flags: nowait postinstall skipifsilent
Filename: {src}\Redist\directx.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\directx; Flags: waituntilterminated;
Filename: {src}\Redist\vcredist_x86_2005SP1.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\vcredist_x86_2005SP1; Flags: waituntilterminated;
Filename: {src}\Redist\vcredist_x86_2008.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\vcredist_x86_2008; Flags: waituntilterminated;
Filename: {src}\Redist\netframework.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\dotNetFx40_Full_x86_x64; Flags: waituntilterminated;


TROY Diamond 15-12-2011 19:02 1815987

1. Почему не работает этот код для удаления сохранений?

Код:

[_Code_]
procedure DeleteSavedGames(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep=usUninstall then
  if DirExists(ExpandConstant('{app}')+'\Profiles') then
  if MsgBox(ExpandConstant('{cm:DeleteSave}'), mbInformation, MB_YESNO) = idYes then
  DelTree(ExpandConstant('{app}')+'\Profiles', True, True, True)
end;

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

Или же просто использовать секцию [UninstallDelete]?

TROY Diamond 15-12-2011 21:55 1816101

Как в секции Files соединить: "AfterInstall: ExtLog()" и "AfterInstall: Pack('...')", как вместе поставить: ExtLog() и Pack('...')

Как в процессе установки запустить приложение, а потом автоматически его закрыть, не имеет значение из секции Run или Code?

Photon9 16-12-2011 01:08 1816195

Вложений: 1
Так как у меня не все файлы дополнительного по лежат в корневой папке, я немного переписал скрипт предложеный valyok666, под себя, и вроде всё получилось, до того момента когда завершается установка, при установке дополнительного по - выскакивает сообщение - неверно задано имя папки.

R.i.m.s.k.y. 16-12-2011 08:11 1816278

Photon9, значит неправильно задано имя папки
проверяй пути, смотри чтобы все запускаемое было на том месте, где его ждет инсталлер
можешь использовать "читерский" флаг skipifdoesntexist - если файла нет, инно продолжит без ошибки :)

R.i.m.s.k.y. 16-12-2011 10:21 1816332

Цитата:

Цитата Photon9
С секцией tack я вроде разобрался, но вот на секции run скрипт стопорится матерится на Parametrs: " /Q /norestart" »

Parameters

Photon9 16-12-2011 11:39 1816392

R.i.m.s.k.y., да вот как раз здесь то и стопорюсь вроде пути правильные, а не идёт. Подозреваю что просто что то лишнее в скрипте прописал, пути к файлам выглядят так:

Fallout New Vegas-->Redist-->directx-->DXSETUP.exe
Fallout New Vegas-->Redist-->vcredist_x86.exe (это 2005)
Fallout New Vegas-->Redist-->vc2008-->vcredist_x86.exe (это 2008)
Fallout New Vegas-->Redist-->dotNetFx40_Full_x86_x64.exe

В скрипте вроде прописал соответственно, так что х.з.

R.i.m.s.k.y. 16-12-2011 12:17 1816424

Photon9, я тоже криминала не вижу в путях, ну разве что вместо англ буквы ты написал похожую русскую, к примеру вместо c - с ;)
ты бы ошибку написал хоть, для определенности

и последнюю строчку лучше сделать так:
Код:

Check: IsWin64; Filename: {app}\Redist\dotNetFx40_Full_x86_x64.exe; WorkingDir: {app}\Redist\; Parameters: /silent; Tasks: Redist\dotNetFx40_Full_x86_x64; Flags: waituntilterminated;

Photon9 16-12-2011 18:18 1816467

Да но в таком случае скрипт валился бы при компиляции, а так при установке выдаёт сообщение - неверно задано имя папки - и код что то на 4 начинается

Хм, мде упущение моё надо писать не Redist, а Redists - попробую ещё раз скомпилить

R.i.m.s.k.y. 16-12-2011 22:40 1816595

Photon9, не должен валится скрипт, ты ставишь фреймворк х64 без проверки разрядности винды, Check: IsWin64; добавляет такую проверку и на х86 такой фреймворк пропустится

Photon9 17-12-2011 20:39 1817010

Вложений: 3
Вобщем почти получилось, однако есть несколько но:

1. Никак немогу в свойствах ярлыка прописать параметр "Рабочая папка"
2.Почему список дополнительного софта выглядит так коряво, и когда ставлю галку на Дополнительное ПО , отмечается только директ, зато когда ставлю на С++ 2005 то ставится и на 2008
3.Непонятно ставится ли директ, просто перед установкой c++2005 (которая как ни странно вылетает с ошибкой и не выполняется) происходит длительная пауза (минуты 3) если же установка идёт в фоновом режиме то это не вариант

R.i.m.s.k.y. 17-12-2011 21:21 1817034

Photon9, не стараешься

1. попробуй поставить кавыки в параметре WorkingDir

2. смотри в вике значение слова "иерархия", к тому же у тебя охрененный косяк - разные task под одним именем
И обрати внимание на флаг dontinheritcheck у task FrameWork4, запустишь инсталлер потыкай - увидишь чего делает, может ненадо

3. /silent - это параметр инно-инсталлеров, у МС это /Q, /quite, /passive. Поэтому и ругался vcredist2005
Хоть бы разобрался чего запускаешь, ведь он тебе явно писал "будь мужыгом, запусти с параметром /?" А ты какой то нелюбопытный :)

Код:

; Скрипт создан при помощи мастера создания скриптов.
; СМ. ДОКУМЕНТАЦИЮ ДЛЯ ИЗУЧЕНИЯ ДЕТАЛЕЙ ОТНОСИТЕЛЬНО СОЗДАНИЯ ФАЙЛОВ СКРИПТА INNO SETUP!

[Setup]
AppName=Fallout New Vegas
AppVerName=Fallout New Vegas
AppPublisher=Obsidian
AppPublisherURL=http://games.1c.ru/fallout_nv/
AppSupportURL=http://games.1c.ru/fallout_nv/
AppUpdatesURL=http://games.1c.ru/fallout_nv/
DefaultDirName={pf}\Fallout New Vegas
DefaultGroupName=Fallout New Vegas
InfoBeforeFile=C:\Users\Photon9\Desktop\Info.FalloutNV.txt
OutputDir=E:\FNV
OutputBaseFilename=setup
SetupIconFile=C:\Users\Photon9\Desktop\FalloutNV.ico
Compression=lzma/ultra
SolidCompression=true
DiskSpanning=true
DiskSliceSize=900000000
WizardImageFile=C:\Users\Photon9\Desktop\big.bmp
WizardSmallImageFile=C:\Users\Photon9\Desktop\small.bmp
InternalCompressLevel=ultra

[Languages]
Name: russian; MessagesFile: compiler:Default.isl

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: unchecked
Name: Redist; Description: Дополнительное Программное обеспечение:;
Name: Redists\directx; Description: Обновить M$ DirectX; Flags: unchecked;
Name: Redists\vc2005; Description: "Установить M$ Visual c++ 2005 SP1"; Flags: unchecked;
Name: Redists\vc2008; Description: "Установить M$ Visual c++ 2008"; Flags: unchecked;
Name: Redists\fw4; Description: "Установить M$ Net Framework 4.0"; Flags: unchecked dontinheritcheck;

[Files]
Source: E:\Program Files\Fallout New Vegas\FalloutNVLauncher.exe; DestDir: {app}; Flags: ignoreversion
Source: E:\Program Files\Fallout New Vegas\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; ОТМЕТЬТЕ: Не используйте "Флажки: Проигнорировать версию" на любых общедоступных системных файлах

[Icons]
Name: {group}\Fallout New Vegas; Filename: {app}\FalloutNVLauncher.exe; WorkingDir: "{app}"
Name: {group}\{cm:ProgramOnTheWeb,Fallout New Vegas}; Filename: "http://games.1c.ru/fallout_nv/"
Name: {group}\{cm:UninstallProgram,Fallout New Vegas}; Filename: {uninstallexe}
Name: {commondesktop}\Fallout New Vegas; Filename: {app}\FalloutNVLauncher.exe; Tasks: desktopicon

[Run]
Filename: {app}\FalloutNVLauncher.exe; Description: {cm:LaunchProgram,Fallout New Vegas}; Flags: nowait postinstall skipifsilent
Filename: {app}\Redists\directx\DXSETUP.exe; WorkingDir: {app}\Redists\directx\; Parameters: /silent; Tasks: Redists\directx; Flags: waituntilterminated;
Filename: {app}\Redists\vcredist_x86.exe; WorkingDir: {app}\Redists\; Parameters: /Q; Tasks: Redists\vc2005; Flags: waituntilterminated;
Filename: {app}\Redists\vc2008\vcredist_x86.exe; WorkingDir: {app}\Redists\vc2008\; Parameters: /Q; Tasks: Redists\vc2008; Flags: waituntilterminated;
Filename: {app}\Redists\dotNetFx40_Full_x86_x64.exe; WorkingDir: {app}\Redists\; Parameters: /Q /passive /norestart; Tasks: Redists\fw4; Flags: waituntilterminated;

[Registry]
Root: HKLM; SubKey: SOFTWARE\Bethesda Softworks\FalloutNV; ValueType: string; ValueName: Installed Path; ValueData: {app}\; Flags: uninsdeletevalue uninsdeletekeyifempty


Photon9 17-12-2011 22:32 1817069

С кавычками попробую
Касаемо корявого вида меню сделал немного по другому, каждую софтину пихнул в отдельную папку и всё пришло в норму, тоесть меню выровнялос, и выделяется каждый пункт по отдельности, а еслм выбрать "дополнительное по" то все вместе
А вот с этими дополнительными командами я запутался несколько, сейчас скрипт подправлю

valyok666 18-12-2011 04:52 1817209

Photon9, читай побольше справку)без неё никак

salat 18-12-2011 17:16 1817435

как сделать mesagebox при запуске инсталятора чтобы проверялось наличие ключа реестра и если ключ существует then "Программа уже установлена" и только кнопка ок?
чтобы без if CurPageID=wpWelcome

R.i.m.s.k.y. 18-12-2011 17:30 1817439

salat,

Код:

Function InitializeSetup: Boolean;
Begin
If RegValueExists(HKLM, 'SubKeyName', ValueName) then MsgBox('Программа уже установлена', mbInformation, mb_Ok)
End;


kenny_danger 18-12-2011 23:03 1817647

ув. пользователи возможно ли запихнуть картинки заместо текста в разделе компоненты
ну допусти чтоб за место
текста "Blue" из "- Style" было изображение не большого размера
http://s017.radikal.ru/i429/1112/b4/78e91b267ff3.png

Rikill 19-12-2011 01:24 1817702

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

R.i.m.s.k.y. 19-12-2011 10:03 1817806

kenny_danger, смотря на картинку а тебе не пофиг? :tongue:

Gugle 19-12-2011 10:52 1817831

Доброго времени суток!

Как сделать иконку на сервис?

Мне нужна иконка для запуска сервиса. Ручками это можно сделать легко, в свойствах иконки "Объект" надо прописать "net start имя_сервиса", но с помощью inno не получается.
Код:

Name: "{group}\Старт сервис имя_севиса";      Filename: "net start имя_севиса"

R.i.m.s.k.y. 19-12-2011 11:00 1817835

Gugle, я бы вот так попробовал
Код:

Name: "{group}\Старт сервис имя_севиса"; Filename: "{sys}\net.exe"; Parameters: " start имя_севиса"; WorkingDir: "{sys}"

Vamp1re 19-12-2011 18:21 1818092

Вообшем я добился того чего хотел (почти), через библиотеку isUtlits все работает в процессе, но когда открою окно сис требований, его невозможно закрыть. Я одного немогу понять как сделать так как написано дальше. Нужно для начала на странице сис требований (только на ней) удалить все кнопки (далее , назад, отмена), и на их место поставить одну под названием например: ок, выход. Хочеться добиться результата, чтоб при нажатии на ету кнопку можно было возвратиться к процессу установки....

Вот скрипт:

читать дальше »
[Setup] AppName=ProgressBar Demo AppVerName=ProgressBar Demo DefaultDirName={pf}\ProgressBar Demo [Languages] Name: "rus"; MessagesFile: "compiler:Languages\Russian.isl" [Files] Source: isutils.dll; DestDir: "{tmp}"; Flags: dontcopy Source: back2.bmp; DestDir: {tmp}; Flags: dontcopy [Icons] Name: "{group}\Удалить"; IconFilename: "{app}\unins000.exe"; Filename: "{app}\unins000.exe" [code] Function GetTotalRam: integer; external 'GetTotalRam@files:isutils.dll stdcall'; Function GetVideoName: PANSICHAR; external 'GetVideoName@files:isutils.dll stdcall'; Function GetVideoRam: integer; external 'GetVideoRam@files:isutils.dll stdcall'; Function GetProcessorName: PANSICHAR; external 'GetProcessorName@files:isutils.dll stdcall'; Function GetProcessorFreq: integer; external 'GetProcessorFreq@files:isutils.dll stdcall'; Function GetProcessorCoreCount: integer; external 'GetProcessorCoreCount@files:isutils.dll stdcall'; Function GetSoundCards: integer; external 'GetSoundCards@files:isutils.dll stdcall'; Function GetSoundCardName: PANSICHAR; external 'GetSoundCardName@files:isutils.dll stdcall'; Function GetOsName: PANSICHAR; external 'GetOsName@files:isutils.dll stdcall'; function GetOsNumber: integer; external 'GetOsNumber@files:isutils.dll stdcall'; function GetOsBit: integer; external 'GetOsBit@files:isutils.dll stdcall'; var Trebovaniya: TNewButton; Image: TBitmapImage; RequirementsLbl,ProcessorLbl, ProcessorNameLbl, VideoCardLbl, VideoCardNameLbl, SoundCardLbl, SoundCardNameLbl, RAMLbl, RAMTotalLbl, SystemLbl, SystemNameLbl: TLabel; Processor, coreCount, VideoRam, Ram, OpSystem, OpSystemBit:integer; procedure NewButton1Click(Sender: TObject); begin Processor:=2000; VideoRam:=9964; Ram:=500; OpSystem:=513; WizardForm.InnerNotebook.Hide; WizardForm.OuterNotebook.Hide; WizardForm.Bevel.Hide; ExtractTemporaryFile('back2.bmp'); Image:=TBitmapImage.Create(WizardForm); Image.Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\back2.bmp '); Image.setbounds(0, 0, ScaleX(497), ScaleY(360)); Image.Parent:=WizardForm; Image.Stretch:=True; RequirementsLbl := TLabel.Create(WizardForm); with RequirementsLbl do begin AutoSize:=False; SetBounds(ScaleX(10), ScaleY(45), ScaleX(487), ScaleY(67)); Transparent:=True; WordWrap:=True; Alignment := taCenter; Font.Color:=$FFFFFF; Font.size:=10; Font.Style:=[fsBold]; Caption := 'Программа установки обнаружила следующие компоненты'; Parent:=WizardForm; end; //================= Начало - Процессор =================// ProcessorLbl := TLabel.Create(WizardForm); with ProcessorLbl do begin AutoSize:=False; SetBounds(ScaleX(23), ScaleY(102), ScaleX(150), ScaleY(22)); Transparent:=True; Font.Name:= 'Arial'; Font.Size:= 9; Font.Color:=$FFFFFF; Font.Style:=[fsBold]; Caption := 'Процессор'; Parent := WizardForm; end; ProcessorNameLbl := TLabel.Create(WizardForm); with ProcessorNameLbl do begin AutoSize:=False; SetBounds(ScaleX(170), ScaleY(102), ScaleX(300), ScaleY(22)); Transparent:=True; Font.Name:= 'Arial'; Font.Size:= 9; Font.Color:=$FFFFFF; // Font.Style:=[fsBold]; Caption := GetProcessorName+' @' + IntToStr(GetProcessorFreq) + ' MHz'; Parent := WizardForm; end; if (GetProcessorFreq*GetProcessorCoreCount) < Processor then begin RequirementsLbl.Caption := 'Компоненты, выделенные красным, не удовлетворяют требованиям'; ProcessorNameLbl.font.color:=clred; end; //================= Конец - Процессор =================// //================= Начало - Видеоадаптер =================// VideoCardLbl := TLabel.Create(WizardForm); with VideoCardLbl do begin AutoSize:=False; SetBounds(ScaleX(23), ScaleY(127), ScaleX(150), ScaleY(22)); Transparent:=True; Font.Name:= 'Arial'; Font.Size:= 9; Font.Color:=$FFFFFF; Font.Style:=[fsBold]; Caption := 'Видеоадаптер'; Parent := WizardForm; end; VideoCardNameLbl := TLabel.Create(WizardForm); with VideoCardNameLbl do begin AutoSize:=False; SetBounds(ScaleX(170), ScaleY(127), ScaleX(300), ScaleY(22)); Transparent:=True; Font.Name:= 'Arial'; Font.Size:= 9; Font.Color:=$FFFFFF; // Font.Style:=[fsBold]; Caption := GetVideoName+' '+inttostr(GetVideoRam)+' Mb'; Parent := WizardForm; end; if GetVideoRam < VideoRam then begin RequirementsLbl.Caption:='Компоненты, выделенные красным, не удовлетворяют требованиям'; VideoCardNameLbl.font.color:=clred; end; //================= Конец - Видеоадаптер =================// //================= Начало - Звуковая карта =================// SoundCardLbl := TLabel.Create(WizardForm); with SoundCardLbl do begin AutoSize:=False; SetBounds(ScaleX(23), ScaleY(152), ScaleX(150), ScaleY(22)); Transparent:=True; Font.Name:= 'Arial'; Font.Size:= 9; Font.Color:=$FFFFFF; Font.Style:=[fsBold]; Caption := 'Звуковая карта'; Parent := WizardForm; end; SoundCardNameLbl := TLabel.Create(WizardForm); with SoundCardNameLbl do begin AutoSize:=False; SetBounds(ScaleX(170), ScaleY(152), ScaleX(300), ScaleY(22)); Transparent:=True; Font.Name:= 'Arial'; Font.Size:= 9; Font.Color:=$FFFFFF; // Font.Style:=[fsBold]; Caption := GetSoundCardName; Parent := WizardForm; end; if GetSoundCards=0 then begin RequirementsLbl.Caption:='Компоненты, выделенные красным, не удовлетворяют требованиям'; SoundCardNameLbl.font.color:=clred; SoundCardNameLbl.Caption := 'Звуковая карта отсутствует'; end; //================= Конец - Звуковая карта =================// //================= Начало - ОЗУ =================// RAMLbl := TLabel.Create(WizardForm); with RAMLbl do begin AutoSize:=False; SetBounds(ScaleX(23), ScaleY(177), ScaleX(150), ScaleY(22)); Transparent:=True; Font.Name:= 'Arial'; Font.Size:= 9; Font.Color:=$FFFFFF; Font.Style:=[fsBold]; Caption := 'ОЗУ'; Parent := WizardForm; end; RAMTotalLbl := TLabel.Create(WizardForm); with RAMTotalLbl do begin AutoSize:=False; SetBounds(ScaleX(170), ScaleY(177), ScaleX(300), ScaleY(22)); Transparent:=True; Font.Name:= 'Arial'; Font.Size:= 9; Font.Color:=$FFFFFF; //Font.Style:=[fsBold]; Caption := IntToStr(GetTotalRam + 1) + ' Mb'; Parent := WizardForm; end; if (GetTotalRam+1)<RAM then begin RequirementsLbl.Caption := 'Компоненты, выделенные красным, не удовлетворяют требованиям'; RAMTotalLbl.font.color:=clred; end; //================= Конец - ОЗУ =================// //================= Начало - Операционная система =================// SystemLbl := TLabel.Create(WizardForm); with SystemLbl do begin AutoSize:=False; SetBounds(ScaleX(23), ScaleY(202), ScaleX(150), ScaleY(22)); Transparent:=True; Font.Name:= 'Arial'; Font.Size:= 9; Font.Color:=$FFFFFF; Font.Style:=[fsBold]; Caption := 'Система'; Parent := WizardForm; end; SystemNameLbl := TLabel.Create(WizardForm); with SystemNameLbl do begin AutoSize:=False; SetBounds(ScaleX(170), ScaleY(202), ScaleX(400), ScaleY(22)); Transparent:=True; Font.Name:= 'Arial'; Font.Size:= 9; Font.Color:=$FFFFFF; // Font.Style:=[fsBold]; Caption := GetOsName+' '+inttostr(GetOsBit)+' Bit'; Parent := WizardForm; end; if OpSystem > GetOsNumber then begin RequirementsLbl.Caption := 'Компоненты, выделенные красным, не удовлетворяют требованиям'; SystemNameLbl.font.color:=clred; end; //================= Конец - Операционная система =================// end; procedure InitializeWizard(); begin Trebovaniya := TNewButton.Create(WizardForm); with Trebovaniya do begin Parent := WizardForm.SelectDirPage; SetBounds(0, 184, 115, 25); OnClick := @NewButton1Click; Caption:='Сис Требования' end; end;

TROY Diamond 19-12-2011 18:29 1818102

Задание всоего значения требуемого места на диске.
Есть ли противоположное параметру "ExtraDiskSpaceRequired"?

Тут уже 100 раз спрашивали подобное... НО ВЫ СНАЧАЛА ВНИМАТЕЛЬНО И ВДУМЧИВО ПРОЧИТАЙТЕ, У МЕНЯ НЕМНОГО ДРУГОЕ!!!

В секции "[Setup]" есть параметр "ExtraDiskSpaceRequired", который позволяет "накрутить" увеличить реально-требуемое свободное место на ЖД...
А если МНЕ НАОБОРОТ НУЖНО УМЕНЬШИТЬ... к примеру, во время установки у меня копируются/создаются "временные файлы", которые сразу же удаляются... и места требуется намного меньше.
Но установщик считает размер всего упакованного в него...
Или как задать своё значение требуемого места на ЖД в "стандарте"?

Есть много вариантов, но они только на увеличение: если места не хватает (в соответствии с заданным значением), то кнопка "Далее"/"Установить" не активна.
А если хватает (в соответствии с заданым значением), то "пропускает", НО ДАЛЬШЕ ПОЯВЛЯЕТСЯ "СТАНДАРТНОЕ ОКНО" с предупреждением, что места не хватает!
Это конечно, не страшно, установку можно продолжить, НО пользователя, это может смутить. Как его убрать и/или "подкорректировать стандарт"?!

Я ЗАДАЮ, ЧТО: Требуется, к примеру, 6 ГБ (а содержимое весит около 8 ГБ), если у пользователя есть 6 ГБ (а 8 ГБ, к примеру нет!), то кнопка "Далее" активна, но после нажатия выскакивает "стандартное" предупреждение!

Я даже не знаю как оно называются - обычное стандартное предупреждение выскакивает:
Недостаточно места на диске
"Установка требует не менее ... свободного места, а на выбранном Вами диске доступно только ... Вы желаете тем не менее продолжить установку?"

Можно его убрать?

sergey3695 19-12-2011 18:50 1818114

Цитата:

Цитата El Sanchez
Наложение изображений на стандартные кнопки - пример, показывающий как использовать свои изоброжения на кнопках, (ссылка на сообщение); »

Только заметил. =) (орфография).

TROY Diamond 19-12-2011 19:56 1818163

1. Как сделать, чтобы первая ("Вас приветствует....") и последняя ("Завершения мастера...") страницы инсталлятора, - остались БЕЗ изменения,
со стандартной картинкой (164x314), а на все остальные (включая, "Лицензионное соглашение", "Важную информацию" и т.п.) наложить картинку (или разные) на все окна?
НО с полным сохранением всего текста, его размера, цвета и местоположения, с "разделением", и кнопками, короче всё как в оригинале!

Если можно, то чтобы разные картинки на каждое окно... я сделал их полупрозрачными, поэтому всё будет прекрасно видно как текст, так и фон!

2. Как сделан этот установщик? По принципу NFS Undercover?




Почему возникают проблемы с нормальным отображением кириллицы? Дело в кодовой странице и/или использовались нестандартные шрифты?

TROY Diamond 19-12-2011 20:21 1818180

3. Как на странице "Выбор дополнительных задач", сделать возможным выбор только опередённых пунктов (задач).

К примеру, если пользователь ставит "галочку" в первом пункте: "Установить такое то ПО", то второй пункт должен быть НЕдоступен и наоборот!!!
У меня просто здесь не совсем "совместимые задачи", поэтому если пользователь НЕ знает, то лучше блокировать ему одновременный выбор...


4. Создание *.ini
Как перезаписывать добавлять, данные в уже существующий?
Как заменять/добавлять данные в файл если он имеет атрибуты: "Только чтение", и/или "Скрытый"?
Как добавлять несколько значений?

КАК СДЕЛАТЬ ИНТЕРВАЛ МЕЖДУ строчками [Key] и [String], например:

[...]
Тут "пусто" (отсуп, пробел между строчками)
А дальше значение

valyok666 19-12-2011 21:34 1818235

TROY Diamond, тот скрипт Q3 картинка затемнена в фотошопе,тема tiger а остальное похоже на закос под Fenixxa

valyok666 20-12-2011 05:51 1818454

TROY Diamond, у тебя стоко вопросов читай справку!!!

TROY Diamond 20-12-2011 16:56 1818833

Задание своего значения требуемого места на диске.

Есть ли противоположное параметру "ExtraDiskSpaceRequired" или как убрать стандартное предупреждение о нехватке места?

МНЕ НАОБОРОТ НУЖНО УМЕНЬШИТЬ размер... к примеру, во время установки у меня копируются/создаются "временные файлы",
которые сразу же удаляются... и места требуется намного меньше.
Но установщик считает размер всего упакованного в него...

Я вот так вот сделал:

1. Задал свое значение с помощью кода, с надпись "Требуется как минимум...", - скрыл.
Если места на ЖД меньше значения, чем я задал, то кнопка "Далее" не активна:



2. НО возникла другая проблема - Если размер свободного места, соответствует заданному мной значению,
но меньше, чем весит всё содержимое, то установку продолжить-то можно, НО ВЫЛЕЗЕТ СТАНДАРТНОЕ ПРЕДУПРЕЖДЕНИЕ!!!
ЭТО НЕ СТРАШНО, т.к. в процессе установки файлы перепакуются, а "хвосты и мусор" удалятся, -
и всё будет весить намного меньше. Поэтому мне не нужно стандартное предупреждение... чтобы не смущать пользователя!



МНЕ НУЖНО, ЧТОБЫ РАЗМЕР ВЫСЧИТЫВАЛСЯ НЕ ПО СОДЕРЖИМОМУ, А ПО МОЕМУ ЗНАЧЕНИЮ!!!
Что делать и/или как убрать стандартное предупреждение?

valyok666 20-12-2011 17:00 1818836

TROY Diamond, я видел что похожее но через ботву)стандартное не видел

ARS_23 20-12-2011 17:46 1818876

TROY Diamond,
читайте справку. там есть 3 примера как сделать свое значение требуемого места на диске.

TROY Diamond 20-12-2011 18:06 1818888

Цитата:

Цитата ARS_23
TROY Diamond,
читайте справку. там есть 3 примера как сделать свое значение требуемого места на диске.

Спасибо, я уже это сделал, смотрите скрины и внимательно читайте, пожалуйста... МНЕ НАДО УБРАТЬ "СТАНДАРТНОЕ ПРЕДУПРЕЖДЕНИЕ"!!!

valyok666 21-12-2011 03:44 1819176

TROY Diamond, хватить писать по пол страницы!чем меньше вопрос - тем быстрее получишь ответ

Devils Night 21-12-2011 10:09 1819286

Полистал справку, нашёл только три примера, но оно не то что нужно.
В общем нужно чтобы перед инсталяцией, бэкапилась (перемещалась в папку Backup) вся папка {app}\My Program со всеми под папками и файлами, и независимо от заменяемых файлов. Как это реализовать?
Цитата:

Цитата valyok666
хватить писать по пол страницы! »

Лучше бы так все следили за тем, чтоб коды и картинки под спойлер прятали.

valyok666 21-12-2011 13:28 1819398

Devils Night,
а такой код
читать дальше »

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg

[code]
var
MyTask: TCheckBox;

function MoveFile(const srcFile, destFile: PChar): Integer; external 'MoveFileA@kernel32.dll stdcall';

procedure CurStepChanged(CurStep: TSetupStep);
var
FindFiles: TFindRec;
i: integer;
MyFiles: array of string;
MyDir, BackDir: string;
begin
if CurStep=ssInstall then begin
if MyTask.Checked then begin
MyFiles:=['TS3.exe','gameplay.package','*.precomp','*.jpg']; // указать файлы или маски нужные для бакупа через запятую. при указании маски '*' бакупятся все файлы с вложенными папками
MyDir:=ExpandConstant('{app}'+'\Game\Bin\'); //папка откуда бакупить
BackDir:=ExpandConstant('{app}'+'\Backup\'); // папка куда бакупить
for i:=0 to GetArrayLength(MyFiles)-1 do
begin
if FindFirst(MyDir+MyFiles[i], FindFiles) then begin
repeat
if not DirExists(BackDir) then begin
CreateDir(BackDir);
end;
MoveFile(MyDir+ FindFiles.Name, BackDir+FindFiles.Name);
until not FindNext(FindFiles);
FindClose(FindFiles);
end;
end;
end;
end;
end;

procedure InitializeWizard();
begin
MyTask:=TCheckBox.Create(WizardForm);
with MyTask do
begin
Parent:=WizardForm.SelectDirPage;
Caption:='Сделать Бэкап';
Left:=ScaleX(0);
Top:=ScaleY(100);
Width:=ScaleX(400);
Height:=ScaleY(15);
TabOrder:=0;
Checked:=True;
end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
FindFiles: TFindRec;
MyDir, BackDir: string;
begin
if CurUninstallStep = usPostUninstall then begin
MyDir:=ExpandConstant('{app}'+'\Game\Bin\'); //папка куда возвращать файлы
BackDir:=ExpandConstant('{app}'+'\Backup\'); // папка откуда брать файлы
if DirExists(BackDir) then begin
if MsgBox('Восстановить данные из бэкапа?', mbConfirmation, MB_YESNO) = IDYES then begin
if FindFirst(BackDir+'*', FindFiles) then begin
repeat
MoveFile(BackDir+ FindFiles.Name, MyDir+FindFiles.Name);
until not FindNext(FindFiles);
FindClose(FindFiles);
RemoveDir(BackDir);
end;
end;
end;
end;
end;


EvilAlex 21-12-2011 21:26 1819730

Доброго времени суток форумчане...
Нуждаюсь в вашей помощи. А именно мне нужно добавить исдон 0.6ф в мой скрипт.
Пытался сам, перечитал справку раза на 3, все что впитал из нее и до чего додумался не помогло.

Если ктото может помочь то вот ссылка, в архиве оба скриптаи файлы...


Заранее благодарю.

EvilAlex 22-12-2011 10:16 1819973

Спасибо, но возникла продблема после того как скачал, немогу распаковать архи или просто войти, выдает:

valyok666 22-12-2011 10:26 1819978

EvilAlex,Держи
обращайся)

EvilAlex 22-12-2011 10:28 1819979

valyok666, все норм, спасибо огромное.

Akella2007 22-12-2011 14:25 1820101

Вопрос по выбору языка по умолчанию.
Установка на трех языках. Т.е. пользователю перед установкой показывается диалог выбора языка. Как указать, что по умолчанию должен быть украинский?

El Sanchez 22-12-2011 18:48 1820283

Цитата:

Цитата Akella2007
Вопрос по выбору языка по умолчанию.
Установка на трех языках »

Akella2007,
Код:

[Setup]
LanguageDetectionMethod=none

[Languages]
Name: ua; MessagesFile: compiler:Languages\Ukranian.isl
Name: ru; MessagesFile: compiler:Languages\Russian.isl
Name: en; MessagesFile: compiler:Default.isl


Akella2007 23-12-2011 10:43 1820695

Ага, я понял, первым должен быть желаемый язык по умолчанию + LanguageDetectionMethod=none

Спасибо

LinkOFF 23-12-2011 16:23 1820905

Здраствуйте!У меня такая проблема: есть игра Dead Space 2 и мне нужно чтоб при выборе языка игры распаковывался файл по пути AppData\Local\Electronic Arts\.Я не знаю как мне это сделать

R.i.m.s.k.y. 23-12-2011 16:32 1820909

LinkOFF, не знаешь потому что справку не читаешь
два способа
1.
Код:

[Files]
Languages: english; Source: english.file; DestDir: {app}\

2.
Код:

[Files]
Check: IsEng; Source: english.file; DestDir: {app}\

[*C*ODE]
function IsRus(): Boolean;
begin
if ( Lowercase(ActiveLanguage) = Lowercase('russian') ) then Result := True else Result := False;
end;

function IsEng(): Boolean;
begin
if ( Lowercase(ActiveLanguage) = Lowercase('english') ) then Result := True else Result := False;
end;


VASYAKRN 23-12-2011 19:24 1821008

дайте пожалста пример для использувания ISSideshow 1.02 на всех страницах инсталятора

valyok666 23-12-2011 19:33 1821011

VASYAKRN,
Типо такого?
читать дальше »

[Files]
//Папка со слайдами.
Source: Files\*; Flags: dontcopy noencryption nocompression

[code]
var
SlideImage: TBitmapImage; // Упоминаем картинку для кода
SlideTimer: TTimer; // Упоминаем таймер для кода
CloseButton: TButton; // Упоминаем кнопку WizardForm

procedure SlideTimerTimer(Sender: TObject); forward; // Задаем форвард процедуры таймера
procedure CloseButtonClick(Sender: TObject); forward; // Задаем форвард процедуры клика кнопки закрытия

procedure CloseButtonClick(Sender: TObject);
begin
WizardForm.Close;
end;

procedure SlideTimerTimer(Sender: TObject);// Начинаем процедуру таймера
var a:integer; // Задаем целочисленную переменную
begin // слайд-шоу
a:=random(10); // Задаем рандомное значения для переменной 'а' от 1 до 10
begin

if a=1 then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Slide1.bmp')); // Если а=1, то SlideImage загружает слайд 1
WizardForm.StatusLabel.Refresh; // Обновляем label статуса установки(Иначе остаются следы предыдущего слайда)
WizardForm.FileNameLabel.Refresh; // Обновляем label файлов(Иначе остаются следы предыдущего слайда)
WizardForm.NextButton.Refresh; // Обновляем кнопку "Далее"(Иначе остаются следы предыдущего слайда по краям кнопки)
CloseButton.Refresh; // Обновляем кнопку закрытия(Иначе остаются следы предыдущего слайда по краям кнопки)
end;

if a=2 then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Slide2.bmp')); // Если а=2, то SlideImage загружает слайд 2
WizardForm.StatusLabel.Refresh; // Обновляем label статуса установки(Иначе остаются следы предыдущего слайда)
WizardForm.FileNameLabel.Refresh; // Обновляем label файлов(Иначе остаются следы предыдущего слайда)
WizardForm.NextButton.Refresh; // Обновляем кнопку "Далее"(Иначе остаются следы предыдущего слайда по краям кнопки)
CloseButton.Refresh; // Обновляем кнопку закрытия(Иначе остаются следы предыдущего слайда по краям кнопки)
end;

if a=3 then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Slide3.bmp')); // Если а=3, то SlideImage загружает слайд 3
WizardForm.StatusLabel.Refresh; // Обновляем label статуса установки(Иначе остаются следы предыдущего слайда)
WizardForm.FileNameLabel.Refresh; // Обновляем label файлов(Иначе остаются следы предыдущего слайда)
WizardForm.NextButton.Refresh; // Обновляем кнопку "Далее"(Иначе остаются следы предыдущего слайда по краям кнопки)
CloseButton.Refresh; // Обновляем кнопку закрытия(Иначе остаются следы предыдущего слайда по краям кнопки)
end;

if a=4 then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Slide4.bmp')); // Если а=4, то SlideImage загружает слайд 4
WizardForm.StatusLabel.Refresh; // Обновляем label статуса установки(Иначе остаются следы предыдущего слайда)
WizardForm.FileNameLabel.Refresh; // Обновляем label файлов(Иначе остаются следы предыдущего слайда)
WizardForm.NextButton.Refresh; // Обновляем кнопку "Далее"(Иначе остаются следы предыдущего слайда по краям кнопки)
CloseButton.Refresh; // Обновляем кнопку закрытия(Иначе остаются следы предыдущего слайда по краям кнопки)
end;

if a=5 then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Slide5.bmp')); // Если а=5, то SlideImage загружает слайд 5
WizardForm.StatusLabel.Refresh; // Обновляем label статуса установки(Иначе остаются следы предыдущего слайда)
WizardForm.FileNameLabel.Refresh; // Обновляем label файлов(Иначе остаются следы предыдущего слайда)
WizardForm.NextButton.Refresh; // Обновляем кнопку "Далее"(Иначе остаются следы предыдущего слайда по краям кнопки)
CloseButton.Refresh; // Обновляем кнопку закрытия(Иначе остаются следы предыдущего слайда по краям кнопки)
end;

if a=6 then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Slide6.bmp')); // Если а=6, то SlideImage загружает слайд 6
WizardForm.StatusLabel.Refresh; // Обновляем label статуса установки(Иначе остаются следы предыдущего слайда)
WizardForm.FileNameLabel.Refresh; // Обновляем label файлов(Иначе остаются следы предыдущего слайда)
WizardForm.NextButton.Refresh; // Обновляем кнопку "Далее"(Иначе остаются следы предыдущего слайда по краям кнопки)
CloseButton.Refresh; // Обновляем кнопку закрытия(Иначе остаются следы предыдущего слайда по краям кнопки)
end;

if a=7 then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Slide7.bmp')); // Если а=7, то SlideImage загружает слайд 7
WizardForm.StatusLabel.Refresh; // Обновляем label статуса установки(Иначе остаются следы предыдущего слайда)
WizardForm.FileNameLabel.Refresh; // Обновляем label файлов(Иначе остаются следы предыдущего слайда)
WizardForm.NextButton.Refresh; // Обновляем кнопку "Далее"(Иначе остаются следы предыдущего слайда по краям кнопки)
CloseButton.Refresh; // Обновляем кнопку закрытия(Иначе остаются следы предыдущего слайда по краям кнопки)
end;

if a=8 then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Slide8.bmp')); // Если а=8, то SlideImage загружает слайд 8
WizardForm.StatusLabel.Refresh; // Обновляем label статуса установки(Иначе остаются следы предыдущего слайда)
WizardForm.FileNameLabel.Refresh; // Обновляем label файлов(Иначе остаются следы предыдущего слайда)
WizardForm.NextButton.Refresh; // Обновляем кнопку "Далее"(Иначе остаются следы предыдущего слайда по краям кнопки)
CloseButton.Refresh; // Обновляем кнопку закрытия(Иначе остаются следы предыдущего слайда по краям кнопки)
end;

if a=9 then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Slide9.bmp')); // Если а=9, то SlideImage загружает слайд 9
WizardForm.StatusLabel.Refresh; // Обновляем label статуса установки(Иначе остаются следы предыдущего слайда)
WizardForm.FileNameLabel.Refresh; // Обновляем label файлов(Иначе остаются следы предыдущего слайда)
WizardForm.NextButton.Refresh; // Обновляем кнопку "Далее"(Иначе остаются следы предыдущего слайда по краям кнопки)
CloseButton.Refresh; // Обновляем кнопку закрытия(Иначе остаются следы предыдущего слайда по краям кнопки)
end;

if a=10 then
begin
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Slide10.bmp')); // Если а=10, то SlideImage загружает слайд 10
WizardForm.StatusLabel.Refresh; // Обновляем label статуса установки(Иначе остаются следы предыдущего слайда)
WizardForm.FileNameLabel.Refresh; // Обновляем label файлов(Иначе остаются следы предыдущего слайда)
WizardForm.NextButton.Refresh; // Обновляем кнопку "Далее"(Иначе остаются следы предыдущего слайда по краям кнопки)
CloseButton.Refresh; // Обновляем кнопку закрытия(Иначе остаются следы предыдущего слайда по краям кнопки)
end;

end
end; // слайд-шоу

procedure InitializeWizard(); // Процедура инициализации
begin
DeleteFile('{tmp}\Slide1.bmp') // Удаляем слайд 1, во избежание ошибки Runtime
DeleteFile('{tmp}\Slide2.bmp') // Удаляем слайд 2, во избежание ошибки Runtime
DeleteFile('{tmp}\Slide3.bmp') // Удаляем слайд 3, во избежание ошибки Runtime
DeleteFile('{tmp}\Slide4.bmp') // Удаляем слайд 4, во избежание ошибки Runtime
DeleteFile('{tmp}\Slide5.bmp') // Удаляем слайд 5, во избежание ошибки Runtime
DeleteFile('{tmp}\Slide6.bmp') // Удаляем слайд 6, во избежание ошибки Runtime
DeleteFile('{tmp}\Slide7.bmp') // Удаляем слайд 7, во избежание ошибки Runtime
DeleteFile('{tmp}\Slide8.bmp') // Удаляем слайд 8, во избежание ошибки Runtime
DeleteFile('{tmp}\Slide9.bmp') // Удаляем слайд 9, во избежание ошибки Runtime
DeleteFile('{tmp}\Slide10.bmp') // Удаляем слайд 10, во избежание ошибки Runtime
DeleteFile('{tmp}\BackWelcome.bmp') // Удаляем картинку приветсвия, во избежание ошибки Runtime
DeleteFile('{tmp}\BackFinish.bmp') // Удаляем картинку финиша, во избежание ошибки Runtime
ExtractTemporaryFile('Slide1.bmp'); // Загружаем слайд 1
ExtractTemporaryFile('Slide2.bmp'); // Загружаем слайд 2
ExtractTemporaryFile('Slide3.bmp'); // Загружаем слайд 3
ExtractTemporaryFile('Slide4.bmp'); // Загружаем слайд 4
ExtractTemporaryFile('Slide5.bmp'); // Загружаем слайд 5
ExtractTemporaryFile('Slide6.bmp'); // Загружаем слайд 6
ExtractTemporaryFile('Slide7.bmp'); // Загружаем слайд 7
ExtractTemporaryFile('Slide8.bmp'); // Загружаем слайд 8
ExtractTemporaryFile('Slide9.bmp'); // Загружаем слайд 9
ExtractTemporaryFile('Slide10.bmp'); // Загружаем слайд 10
ExtractTemporaryFile('BackWelcome.bmp'); // Загружаем картинку приветстви
ExtractTemporaryFile('BackFinish.bmp'); // Загружаем картинку финиша


WizardForm.MainPanel.Hide; // Прячем главную панель, в которой содержится информация PageNameLabel(Лицензионное соглашение, Директория установки и т.д.) и WizardSmaillImage(Маленькая картинка)
WizardForm.BeveledLabel.Hide; // Прячем текст BeveledLabel
WizardForm.Bevel.Hide; // Прячем полоску Bevel
WizardForm.AutoScroll:=False; // Запрещаем изменение размера окна
WizardForm.ClientHeight:=450; // Изменяем высоту окна
WizardForm.ClientWidth:=797; // Изменяем ширину окна
WizardForm.BorderStyle:=bsNone; // Убираем границы окна, а так же системные кнопки [_] и [Х]
WizardForm.Center; // Центрируем окно инсталлятора


CloseButton := TButton.Create(WizardForm); // Создаем label закрытия формы вместо стандартной кнопки закрытия, т.к. убираем границы
with CloseButton do // С кнопкой делаем следующее:
begin
Name:='CloseButton'; // Задаем имя для кода
Parent:=WizardForm; // Делаем дочерним элементом WizardForm'ы
Caption:='х'; // Меняем текст на "Икс"
Font.Color:=clBlack; // Меняем цвет текста на чёрный
Font.Height:=-20; // Меняем ширину шрифта
Font.Name:='Tahoma'; // Меняем шрифт со стандартного 'Tahoma' на красивый 'Verdana'
// Font.Style:=[fsBold]; // Меняем стиль шрифта на "жирный". Стандартное значение: Font.Style:=[]
ParentFont:=False; // Делаем стиль шрифта индивидуальным, а не стандартным
Left:=771; // Задаем расстояние от левого края
Top:=2; // Задаем расстояние от верхнего края
Width:=24; // Задаем ширину
Height:=24; // Задаем высоту
OnClick:=@CloseButtonClick; // Задаем действие для клика
end;


WizardForm.CancelButton.Top:=798; // Прячем кнопку отмены, сдвигая ее за нижний край, т.к. WizardForm.CancelButton.Hide не работает
WizardForm.BackButton.Top:=798; // Прячем кнопку отмены, сдвигая ее за нижний край, т.к. WizardForm.BackButton.Hide не работает

WizardForm.NextButton.Left:=1; // Изменяем расстояние кнопки "Далее" от левого края, оставив расстояние в 1 пкс от границы
WizardForm.NextButton.Top:=399; // Изменяем расстояние кнопки "Далее" от верхнего края, оставив расстояние в 1 пкс от границы
WizardForm.NextButton.Width:=795; // Изменяем ширину кнопки "Далее", оставив расстояние в 2 пкс от границы
WizardForm.NextButton.Height:=50; // Изменяем высоты кнопки "Далее", оставив расстояние в 2 пкс от границы


WizardForm.OuterNotebook.Hide; // Прячем OuterNotebook. Можно,конечно, и не прятать. Но придется поколдовать с родительским элементом для изображения
WizardForm.InnerNotebook.Hide; // Прячем InnerNotebook. Обязательно при WizardForm.OuterNotebook.Hide


WizardForm.ProgressGauge.Parent:=WizardForm; // Делаем прогрессбар дочерним элементом не страницы InstallingPage, а WizardForm'ы
WizardForm.ProgressGauge.Left:=128; // Задаем расстояение от левого края для прогрессбара
WizardForm.ProgressGauge.Top:=310; // Задаем расстояние от верхнего края для прогрессбара
WizardForm.ProgressGauge.Height:=42; // Удваиваем высоту прогрессбара(Стандартное значение: 42)
WizardForm.StatusLabel.Parent:=WizardForm; // Делаем label статуса установки(Распаковка файлов... и т.д.) дочерним элементом не страницы InstallingPage, а WizardForm'ы
////WizardForm.StatusLabel.Transparent:=True; // Делаем label статуса установки без фона
WizardForm.StatusLabel.Left:=128; // Задаем расстояние от левого края для label'а статуса установки
WizardForm.StatusLabel.Top:=270; // Задаем расстояние от верхнего края для label'а статуса установки
WizardForm.StatusLabel.Font.Name:='Verdana'; // Меняем шрифт со стандартного 'Tahoma' на красивый 'Verdana' для label'а статуса установки
WizardForm.StatusLabel.Font.Style:=[fsBold]; // Меняем стиль шрифта на 'Жирный' для label'а статуса установки. Стандартное значение: ...Font.Style:=[]
WizardForm.FilenameLabel.Parent:=WizardForm; // Делаем label файлов(под label'ом статуса установки) дочерним элементом не страницы InstallingPage, а WizardForm'ы
///// WizardForm.FilenameLabel.Transparent:=True; // Делаем label файлов(под label'ом статуса установки) без фона
WizardForm.FileNameLabel.Left:=128; // Задаем расстояние от левого края для label'а файлов(под label'ом статуса установки)
WizardForm.FileNameLabel.Top:=290; // Задаем расстояние от верхнего края для label'а файлов(под label'ом статуса установки)
WizardForm.FileNameLabel.Font.Name:='Verdana'; // Меняем шрифт со стандартного 'Tahoma' на красивый 'Verdana' для label'а файлов(под label'ом статуса установки)
WizardForm.FileNameLabel.Font.Style:=[fsBold]; // Меняем стиль шрифта на 'Жирный' для label'а файлов(под label'ом статуса установки). Стандартное значение: ...Font.Style:=[]

SlideTimer:=TTimer.Create(WizardForm); // Создаем таймер
SlideTimer.Name:='SlideTimer'; // Задаем имя таймера для кода
SlideTimer.Interval:=2000; // Задаем интервал в миллисекундах (2000мсек=2сек)
SlideTimer.OnTimer:=@SlideTimerTimer; // Задаем процедуру для таймера
// SlideTimer.Enabled:=False; // Блокируем таймер, если хотим задать слайд-шоу для определенной страницы (см. конец кода: CurPageChanged)


SlideImage:=TBitmapImage.Create(WizardForm); // Создаем картинку
SlideImage.Name:='SlideImage'; // Задаем имя картинки для кода
SlideImage.Parent:=WizardForm; // Делаем картинку дочерним элементом WizardForm'ы
SlideImage.Left:=0; // Задаем расстояние от левого края для картинки
SlideImage.Top:=0; // Задаем расстояение от верхнего края для картинки
SlideImage.Width:=797; // Задаем ширину картинки, соответствующую самой картинке
SlideImage.Height:=450; // Задаем высоту картинки, соответствующую самой картинке
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\BackWelcome.bmp')); // Задаем начальное изображение
SlideImage.Stretch:=True; // Сжимаем/растягиваем картинку по размерам Width и Height. Нежелательно так делать, т.к. качество картинки ухудшается. Лучше нарисовать сразу по нужным размерам.
end;

procedure CurPageChanged(CurPageID: Integer); // Процедура контроля страниц
begin

if CurPageID=1 then
begin
WizardForm.StatusLabel.Hide; // Если ID страницы равен 1, то прячем label статуса установки (Иначе остается след на картинках)
WizardForm.FileNameLabel.Hide; // Если ID страницы равен 1, то прячем label файлов (под label'ом статуса установки)
WizardForm.ProgressGauge.Hide; // Если ID страницы равен 1, то прячем прогрессбар
end;


if CurPageID=12 then
begin
WizardForm.StatusLabel.Show; // Если ID страницы равен 12, то показываем label статуса установки
WizardForm.FileNameLabel.Show; // Если ID страницы равен 12, то показываем label файлов (под label'ом статуса установки)
WizardForm.ProgressGauge.Show; // Если ID страницы равен 12, то показываем прогрессбар
// SlideTimer.Enabled:=True; // Если ID страницы равен 12, то таймер включается (см. InitializeWizard: SlideTimerEnabled:=False)
end;

if CurPageID=14 then
begin
SlideTimer.Enabled:=False; // Если ID страницы равен 14, то выключаем таймер слайд-шоу
WizardForm.StatusLabel.Hide; // Если ID страницы равен 14, то прячем label статуса установки (Иначе остается след на картинках)
WizardForm.FileNameLabel.Hide; // Если ID страницы равен 14, то прячем label файлов (под label'ом статуса установки)
WizardForm.ProgressGauge.Hide; // Если ID страницы равен 14, то прячем прогрессбар
SlideImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\BackFinish.bmp')); // Если ID страницы равен 14, то задаем картинку финиша
WizardForm.NextButton.Show; // Если ID страницы равен 14, то показываем кнопку "Далее"
end;

end;


{-----------------------------------------------------------}
// ID'ы страниц:
// Страница приветствия - CurPageID=1
// Страница лицензионного соглашения - CurPageID=2
// Страница пароля инсталлятора - CurPageID=3
// Страница информации InfoBefore - CurPageID=4
// Страница регистрации(Пользователь, Организация, Серийный номер) - CurPageID=5
// Страница директории установки - CurPageID=6
// Страница компонентов установки - CurPageID=7
// Страница меню "Пуск" - CurPageID=8
// Страница дополнительных задач - CurPageID=9
// Страница готовности к установке - CurPageID=10
// Страница приготовления(Перезапуск перед установкой) - CurPageID=11
// Страница установки - CurPageID=12
// Страница информации InfoAfter - CurPageID=13
// Страница конца установки - CurPageID=14

{-----------------------------------------------------------}


кстати есть пример exempele2 это пример только на странице прогрессбара)если немного подумать можно понять как сделать на всех))

Spell1999 23-12-2011 19:38 1821014

Здравствуйте. Мне нужна ваша помощь.
У меня есть скрипт установщика и меня интересует 1 вопрос.
как сделать чтобы во время установки сначала распаковывались файлы записанные в [Files], а потом следом архивы фриарк??? а щя всё наоборот сначала архивы а потом файлы и иззаетова у меня постоянно идёт тестовый прогон и создаётся новый файл record.ini. библиотека ISdone.
Скрипт состоит из отдельных файлов через подключения модулей, поэтому так много скриптов. Всё облазил и незнаю что? где? потправить.
ПОМОГИТЕ ПЛИЗ 2 день МОЗГ парю, облазил много FAQ непомогло.

вот сам скрипт: тыкай сюда

valyok666 23-12-2011 19:41 1821017

Spell1999, не проще тогда сделать архив с "файлами записанные в [Files]" в исдоне прописать их на первое место потом всё остальное)
PS Файлы скрипта тоже надо кидать)

Spell1999 23-12-2011 19:44 1821019

а если архивы прописать в [Files] и начать установку, то сразу ничево нераспаковывая вылетает ошибка типо нет архива для распаковки.

Serega 23-12-2011 19:57 1821026

Здравствуйте
Цитата:

Цитата LinkOFF
У меня такая проблема: есть игра Dead Space 2 и мне нужно чтоб при выборе языка игры распаковывался файл по пути AppData\Local\Electronic Arts\ »

Как уже сказал R.i.m.s.k.y., используйте для проверки выбора языка Check
Цитата:

Цитата R.i.m.s.k.y.
два способа»

R.i.m.s.k.y., функци можно писать немного проще, т.е.:
Код:

function IsRus: Boolean;
begin
  Result := Lowercase(ActiveLanguage) = 'russian';
end;

function IsEng: Boolean;
begin
  Result := Lowercase(ActiveLanguage) = 'english';
end;

P.S.
Цитата:

Цитата R.i.m.s.k.y.
DestDir: {app}\ »

Скажу так сказать для вашего саморазвития, т.е. бэксеш здесь лишний, хотя это не является ошибкой и inno на это не ругается, но он здесь не нужен...

valyok666 23-12-2011 20:00 1821031

Spell1999, чёт вы путаетесь)создайте архив с файлами(если конечно файл не один) вроде проще всего потом всё равно идёт распаковки игровых)Архивы прописываются в скрипте исдоне зачем в [Files]??или тогда уж чекбокс создать)
Насколько я понял эти файлы?
читать дальше »

Source: D:\Games\Ex Machina\dbghelp.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\del.bat; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\dxrender9.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\ExMachina.exe; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\exmachina.log; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\fmod.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\game.pdb; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\input_di8.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\License.txt; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\manual.pdf; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\memlog.txt; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\mfc71.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\mfc71u.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\msvcp71.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\msvcr71.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\protect.xml; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\readme.txt; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\readme_1_02_full.txt; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\sound.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\sound.pdb; DestDir: {app}; Flags: ignoreversion

Так за что они отвечают кряк или что?

Spell1999 23-12-2011 20:13 1821042

игра состоит из этих файлов и 1 папки дата которая много весит. вот я мелкие файлы приписал в истановщик а архив фриарк с папкой дата в ISdone и получается так. сначала он распаковывает архив с папкой дата а следом вот эти файлы с библиотеками в {tmp} и постоянно тестовый прогон.

читать дальше »
Source: D:\Games\Ex Machina\dbghelp.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\del.bat; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\dxrender9.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\ExMachina.exe; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\exmachina.log; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\fmod.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\game.pdb; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\input_di8.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\License.txt; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\manual.pdf; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\memlog.txt; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\mfc71.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\mfc71u.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\msvcp71.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\msvcr71.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\protect.xml; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\readme.txt; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\readme_1_02_full.txt; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\sound.dll; DestDir: {app}; Flags: ignoreversion
Source: D:\Games\Ex Machina\sound.pdb; DestDir: {app}; Flags: ignoreversion


а мне нада наоборот чтобы сначала файлы распаковывал а потом архив.
помоги подправить плиз.

Spell1999 23-12-2011 20:39 1821053

Цитата:

Цитата valyok666
читай пм »


ARS_23 23-12-2011 21:22 1821078

Spell1999,
задачку конечно интересную вы поставили :)
но к чему такой головняк себе придумывать?

Spell1999 23-12-2011 22:13 1821117

Цитата:

Цитата ARS_23
задачку конечно интересную вы поставили
но к чему такой головняк себе придумывать? »

для того чтобы как можно сильнее сжать игру под самые нехочу.

R.i.m.s.k.y. 23-12-2011 22:16 1821120

Цитата:

Цитата Serega
Как уже сказал R.i.m.s.k.y., используйте для проверки выбора языка Check »

а первый способ не подходит? инно не ругается ;-)

Spell1999 23-12-2011 22:25 1821128

Цитата:

Цитата R.i.m.s.k.y.
а первый способ не подходит? инно не ругается ;-) »

как использовать Check??? я просто нерулю по этой проге. Дайте плиз более понятные примеры или кусок с примером.

Rikill 23-12-2011 22:42 1821145

Spell1999, Xenus 2 от nik1967. Там есть.

Serega 24-12-2011 12:08 1821353

Цитата:

Цитата R.i.m.s.k.y.
а первый способ не подходит? инно не ругается ;-) »

Всё у вас правильно, т.е. оба способа, но мы же не ищем лёгких путей... ;)

Arsi000 24-12-2011 12:56 1821378

правильно ли я понимаю что если исходный код inno считается открытым то любой кто в этом понимает может перекомпилить программу как ему нужно? то есть грубо говоря собрать свой вариант?

R.i.m.s.k.y. 24-12-2011 13:09 1821382

Arsi000, думаю нет
код инно шифруется на раз, в прошлой теме (часть3) я приводил пример. ищи по моему авторству и Encryption=yes
он склеен из двух примеров в шапке

Arsi000 24-12-2011 13:38 1821394

возможно мы друг друга не поняли я имел ввиду что возможно ли исходя из того что код открыт переписать саму программу inno setup по своему?
просто есть друг программист, и есть большое желание портировать её на 64 бита. а разрабы ничего не делают в этом направлении. реально ли это сделать самим?

R.i.m.s.k.y. 24-12-2011 13:41 1821397

Arsi000, это к авторам, но думаю проблем нет тк много развелось всяких надстроек над инно
а зачем инно64? он и так замечательно живет в х64 системах

Arsi000 24-12-2011 13:59 1821406

я понимаю что работает прекрасно но есть причины во первых и это главное иногда нужен именно нативный x64 setup сделать( а нельзя), во вторых
когда то поддержку 32 бит выпилит майкрософт на совсем и надо уже сейчас хотя бы начинать думать об этом, в третьих снимутся ограничения 2 гб да и просто две версии x64 и x86 лучше будет выбор кому нужно 32 бита или гибрид выберут x86 а кому нативная 64 то x64. вопрос сложный конечно но вон даже смотрю мелкие утилиты какие то переходят на 64 а inno не двигается обидно просто прога то хорошая и удобная.

YURSHAT 24-12-2011 14:47 1821428

Цитата:

Цитата Arsi000
когда то поддержку 32 бит выпилит майкрософт »

Но, это вы загнули ;) Пока это произойдет мы уж все состаримся :) Думаю, что полного перехода на x64 в светлом будущем можно не ждать.

ЗЫ. Serega, рад вас видеть ;) А то слух пошел, что вы нас покинули ;)

Serega 24-12-2011 19:05 1821552


Цитата:

Цитата YURSHAT
Serega, рад вас видеть»

И моё вам почтение :hi:
Цитата:

Цитата YURSHAT
А то слух пошел, что вы нас покинули »

Наговаривают... :)
На самом деле, просто времени свободного стало совсем мало, поэтому заглядываю сюда не так часто, как раньше...

valyok666 25-12-2011 16:41 1822080

Serega, Вас Всегда рады видеть :beer2: Кстати Всех с Наступающим :wink2:
Предупреждение, нарушение ОПК 3.9
Цитата:

Запрещается:
Вставлять в сообщение рисунок разрешением более 640x480 или размером более 40Кб. Такие рисунки разрешено указывать только в виде ссылки. Вы можете прикрепить рисунок к сообщению в расширенном режиме ответа.

Devils Night 26-12-2011 02:29 1822459

Подскажите, как изменить размер, а то что-то не меняется:


P.S
Цитата:

Цитата Rikill
Спылл1999, панимаыш када пешут так с ашыпкам ваще помогать на нихочица »

Да, с ником ты перегенул, а вообще, знаешь ли, всегда удобнее за чужими ошибками следить, до тех пор пока сам не допустишь.
Это просто второй VASYAKRN появился .

Gnom_aka_Lexander 26-12-2011 09:14 1822530

Devils Night, Както так
Serega, мое вам почтение :)

by_gangster 26-12-2011 11:09 1822571

здравствуйте, скажите как можно сделать такой вот мини-инсталятор как на картинке

Gnom_aka_Lexander 26-12-2011 11:45 1822585

by_gangster, поиск - великая вещь.
раз, два, три.
Все не соберусь никак переписать его с учетом новопоступивших знаний и опыта :)

R.i.m.s.k.y. 26-12-2011 12:44 1822616

у меня такой вопросик:
Инсталлер инно сам определяет о необходимости перезагрузки и в конце заменяет окно wpFinished на свое с предложением перезагрузиться. А оно, wpFinished, желательно очень.
RestartIfNeededByRun=no я конечно могу поставить , но тогда надо самому отлавливать и предупреждать. Проверку к isComponentSelected я прикрутил, но это не то. Вопрос знатокам: как самостоятельно узнать при RestartIfNeededByRun=no что инно определелил необходимость перезагрузки? NeedRestart по описанию не то.

Serega c возвращением, камрад!

Devils Night 26-12-2011 12:48 1822618

Лександер, Вот так, да, честно фиг бы догадался, да и я понимаю что уже был такой вопрос, но я не впёр нифига как и что, я с дуру тупо на панели искал, а OuterNotebook оказывается был рядом.
Лександер, тебе зачёт за скринкаст :up , спасибо ещё раз.

МИШАНЧИК 26-12-2011 15:13 1822716

Подскажите пожалуйста.
Пытался добавить в файл hosts нужные мне строки
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  HostFile: TStringList;
begin
  HostFile := TStringList.Create;
  try
    with HostFile do
    if CurStep = ssPostInstall then
    begin
      LoadFromFile(ExpandConstant('{sys}\drivers\etc\hosts'));
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    xxx');
      Add('127.0.0.1    xxx');
      Add('127.0.0.1    xxx');
      SaveToFile(ExpandConstant('{sys}\drivers\etc\hosts'));
    end;
  finally
    HostFile.free;
  end;
end;

При установке пишет, что не может создать файл {sys}\drivers\etc\hosts и подсвечивает строку
Код:

SaveToFile(ExpandConstant('{sys}\drivers\etc\hosts'));
Хотя если создать пустой текстовый файл hosts2, то внего всё записывает.
Может можно как-то сделать чтобы нормально вносилось в оригинальный hosts?

R.i.m.s.k.y. 26-12-2011 15:27 1822726

МИШАНЧИК, может потому что любые мало-мальски толковые антивири блокируют этот файл от изменений?

МИШАНЧИК 26-12-2011 15:34 1822733

Цитата:

Цитата R.i.m.s.k.y.
может потому что любые мало-мальски толковые антивири блокируют этот файл от изменений? »

Вы правы. Отключил Касперского и всё нормально добавилось в файл. А нельзя это как-то обойти?

R.i.m.s.k.y. 26-12-2011 15:36 1822734

МИШАНЧИК, я думаю нужно копать в сторону системных функций, их каспер блокировать не станет
но тут я не знаю, может El Sanchez подскажет?

El Sanchez 26-12-2011 16:57 1822805


Цитата:

Цитата R.i.m.s.k.y.
я думаю нужно копать в сторону системных функций, их каспер блокировать не станет
но тут я не знаю, может El Sanchez подскажет? »

El Sanchez говорит, что инсталлятору бестолку соваться в защищенный каспером системный файл, а надо этот самый каспер и настроить, например:
http://forum.kaspersky.com/index.php?showtopic=185494
http://forum.kaspersky.com/index.php?showtopic=169424
и т.д.

Gnom_aka_Lexander 26-12-2011 17:25 1822832

А у меня вот так прокатило:
читать дальше »
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  HostFile: TStringList;
  HostFileName: String;
begin
  HostFile := TStringList.Create;
  HostFileName:=ExpandConstant('{sys}\drivers\etc\hosts');
  try
    with HostFile do
    if CurStep = ssPostInstall then
    begin
      LoadFromFile(HostFileName);
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    xxx');
      Add('127.0.0.1    xxx');
      Add('127.0.0.1    xxx');
      DeleteFile(HostFileName);
      SaveToFile(HostFileName);
    end;
  finally
    HostFile.free;
  end;
end;

По принципу - чего нельзя изменить, то сперва удалим :)
Единственное - Для удаления лучше взять системную функцию DeleteFile, для надежности. Или волшебный смд-скрипт товарища R.i.m.s.k.y..

Цитата:

Цитата El Sanchez
а надо этот самый каспер и настроить, например: »

Беда в том, что не понимают юзеры в большинстве своем, что что компьютером нужно уметь пользоваться. Многие считают, что уметь запускать игру с ярлыка - это максимом, что от пользователя требуется. И для таких пользователей мы с вами и стараемся, автоматизируя то, что испокон веков руками делалось. Потому и не объяснить людям, что программа установки правильно написана. А не ставится она - от кривых рук пользователя, которому лень лишний раз антивирус настроить.

Devils Night 26-12-2011 17:58 1822855

Цитата:

Цитата Лександер
По принципу - чего нельзя изменить, то сперва удалим »

А если там какие другие важные данные храняться? Ну например я добавил что-то на некоторые программы, для того чтоб не просились в интернет, а тут бац, и всё тихо сносится.
А что если поступить как нибудь проще, ну например до инсталяции, сам инсталятор сначала переименовывает hosts в hosts1, потом добавляет строки которые нужны, типа
читать дальше »
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  HostFile: TStringList;
  HostFileName: String;
begin
  HostFile := TStringList.Create;
  HostFileName:=ExpandConstant('{sys}\drivers\etc\hosts1');
  try
    with HostFile do
    if CurStep = ssPostInstall then
    begin
      LoadFromFile(HostFileName);
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    xxx');
      Add('127.0.0.1    xxx');
      Add('127.0.0.1    xxx');
      DeleteFile(HostFileName);
      SaveToFile(HostFileName);
    end;
  finally
    HostFile.free;
  end;
end;

и в завершении переименовывает обратно, т.е из hosts1 в hosts, ведь ничего не мешает переименовыванию, как то так можно будет реализовать, не?

Gnom_aka_Lexander 26-12-2011 18:27 1822875

Цитата:

Цитата Devils Night
А если там какие другие важные данные храняться? »

Читай внимательно:
Цитата:

Цитата Devils Night
LoadFromFile(HostFileName); »

Тоесть сперва мы грузим стринглист из файла, тобиш получаем содержимое хоста,
Цитата:

Цитата Devils Night
Add('127.0.0.1 www.xxx'); »

и т.д. - потом добавляем свои строки к тому. что есть. Только после этого удаляем старый хост, и создаем новый со старым содержимым+ наши строки.

Цитата:

Цитата Devils Night
А что если поступить как нибудь проще, ну например до инсталяции, сам инсталятор сначала переименовывает hosts в hosts1, »

Врядли. если нельзя изменить, то и переименовать тоже нельзя будет. Правда, есть у меня подозрение. что и удалить его тоже будет нельзя :)

Devils Night 26-12-2011 19:19 1822907

Цитата:

Цитата Лександер
Читай внимательно »

Что читать, если я не разбираюсь.
Цитата:

Цитата Лександер
LoadFromFile(HostFileName); »

, а точнее что прочитаю, что нет, один фиг я в этом не шарю.
Цитата:

Цитата Лександер
Врядли. если нельзя изменить, то и переименовать тоже нельзя будет. »

Ну а как по твоему при включенном Каспере мне приходилось вписывать хосты для программ? Естественно путём переименовывания, да и на тот момент я не знал что это каспер блокирует, думал виндовые штучки, но это под XP, а под Win7 вообще приходилось из под админа лезть.

МИШАНЧИК 27-12-2011 01:07 1823042

Лександер,
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  HostFile: TStringList;
  HostFileName: String;
begin
  HostFile := TStringList.Create;
  HostFileName:=ExpandConstant('{sys}\drivers\etc\hosts');
  try
    with HostFile do
    if CurStep = ssPostInstall then
    begin
      LoadFromFile(HostFileName);
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    www.xxx');
      Add('127.0.0.1    xxx');
      Add('127.0.0.1    xxx');
      Add('127.0.0.1    xxx');
      DeleteFile(HostFileName);
      SaveToFile(HostFileName);
    end;
  finally
    HostFile.free;
  end;
end;

Так у меня тоже не получилось. Ошибка та-же "Не могу создать..." и подсвечивается строка "SaveToFile..."

by_gangster 27-12-2011 12:31 1823278

здравствуйте, скажите как можно отредактировать окно приветствия ??? (цвет, смещение в другую сторону, удаление)

Edison007 27-12-2011 13:31 1823330

Лександер, На файле хостс, может стоять атрибут "только чтение" и тогда с ним ничего не сделаешь, сам с этим сталкивался...

Devils Night 27-12-2011 13:38 1823335

Цитата:

Цитата Лександер
LoadFromFile(HostFileName); »

И что даёт это? В переводе с английского звучит так "Загрузка из файла", и куда оно загружает, в буфер, так что-ли?

Цитата:

Цитата Лександер
SaveToFile(HostFileName); »

Так же не понятно, это что делает? Куда он сохраняет, это типа бекап или что?

R.i.m.s.k.y. 27-12-2011 13:40 1823338

Цитата:

Цитата Devils Night
"Загрузка из файла", и куда оно загружает, в буфер, так что-ли? »

в HostFile: TStringList, оттуда же и записывает обратно

by_gangster 27-12-2011 13:41 1823340

помогите создал инсталятор при расспаковке выдаёт ошибку Неверно задан входной файл для ISArcExtract!

МИШАНЧИК 27-12-2011 13:42 1823341

Цитата:

Цитата Edison007
На файле хостс, может стоять атрибут "только чтение" и тогда с ним ничего не сделаешь, сам с этим сталкивался... »

На моём нету. Проблема всё-таки в касперском.
Цитата:

Цитата МИШАНЧИК
Отключил Касперского и всё нормально добавилось в файл »


valyok666 27-12-2011 13:43 1823343

Devils Night, насколько я понял он загружает файл который есть вносит изменения и сохраняет полученный файл как то так

TROY Diamond 27-12-2011 13:48 1823348

Задание своего значения требуемого места на диске.
Есть ли противоположное параметру "ExtraDiskSpaceRequired"?

В секции "[Setup]" есть параметр "ExtraDiskSpaceRequired", который позволяет "накрутить" увеличить реально-требуемое свободное место на ЖД...
А если МНЕ НАОБОРОТ НУЖНО УМЕНЬШИТЬ... к примеру, во время установки у меня копируются/создаются "временные файлы", которые сразу же удаляются... и места требуется намного меньше.
Но установщик считает размер всего упакованного в него...
Или как задать своё значение требуемого места на ЖД в "стандарте"?

Есть много вариантов, но они только на увеличение: если места не хватает (в соответствии с заданным значением), то кнопка "Далее"/"Установить" не активна.
А если хватает (в соответствии с заданым значением), то "пропускает", НО ДАЛЬШЕ ПОЯВЛЯЕТСЯ "СТАНДАРТНОЕ ОКНО" с предупреждением, что места не хватает!
Это конечно, не страшно, установку можно продолжить, НО пользователя, это может смутить. Как его убрать и/или "подкорректировать стандарт"?!

Я ЗАДАЮ, ЧТО: Требуется, к примеру, 6 ГБ (а содержимое весит около 8 ГБ), если у пользователя есть 6 ГБ (а 8 ГБ, к примеру нет!), то кнопка "Далее" активна, но после нажатия выскакивает "стандартное" предупреждение!

Я даже не знаю как оно называются - обычное стандартное предупреждение выскакивает:
Недостаточно места на диске
"Установка требует не менее ... свободного места, а на выбранном Вами диске доступно только ... Вы желаете тем не менее продолжить установку?"

Можно его убрать?

valyok666 27-12-2011 13:49 1823349

by_gangster, ты справочку видно не читал)

TROY Diamond, там надо к системным функциям вроде обращаться

TROY Diamond 27-12-2011 13:55 1823354

Цитата:

Цитата valyok666
TROY Diamond, там надо к системным функциям вроде обращаться »

Ну так помогите, мне нужно только "стандартное сообщение" о нехватке места убрать!

TROY Diamond 27-12-2011 14:12 1823374

1. Почему не работает этот код для удаления сохранений?

Код:

[_Code_]
procedure DeleteSavedGames(CurUninstallStep: TUninstallStep);
begin
  if CurUninstallStep=usUninstall then
  if DirExists(ExpandConstant('{app}')+'\Profiles') then
  if MsgBox(ExpandConstant('{cm:DeleteSave}'), mbInformation, MB_YESNO) = idYes then
  DelTree(ExpandConstant('{app}')+'\Profiles', True, True, True)
end;

2. Как в процессе установки запустить, а потом автоматически закрыть какое-нибудь приложение, находящееся в папке установки, но НЕ являющееся "основным" (т.е. это типа "утилита", а НЕ сама устанавливаемая программа), не имеет значение из секции Run или Code? Приложение очень маленькое и для того чтобы оно "сработало", нужно всего пару секунд, поэтому и надо его потом автоматически закрыть?
Наверное, можно как-то "убить" процесс?!

3. Как с помощью [INI] или как-то по другому создать файл, текстовый и другие, НО ТОЛЬКО С ОДНИМ ЗНАЧЕНИЕМ "ВНУТРИ", БЕЗ параметра, никаких "Section", "InstallPath", НЕ надо!
Только одно значение БЕЗ всего - в одну строчку, без кавычек, тире, двоеточий, типа открыл это файл, а там только:

5478549547hutjtiure84509fdjrereire943ukifju894390tgk4t984ij43m

и всё больше ничего нет!

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

Или же просто использовать секцию [UninstallDelete]?

Edison007 27-12-2011 15:03 1823406

by_gangster, рекомендую прочитать справку к IsDone

Devils Night 27-12-2011 15:15 1823415

А переименовать как нибудь можно, ну, на примере SaveToFile(HostFileName);?
Ну что то вроде:
читать дальше »
Код:

RenFile(HostFileName); или
RenameFile(HostFileName);
незнаю как там идёт



TROY Diamond, Ты вот это вот своё стихотворение хотя бы под спойлер спряч, а!

Serega 27-12-2011 19:02 1823566

Цитата:

Цитата МИШАНЧИК
Так у меня тоже не получилось. Ошибка та-же "Не могу создать..." и подсвечивается строка "SaveToFile..." »

Честно говоря каспером не пользуюсь и не могу поэкспериментировать, но на сколько понимаю, инсталлятор должен быть запущен из под админа. Попробуйте поэкспериментировать с переименованиями файла с помощью функции:
Код:

function MoveFile(lpExistingFileName, lpNewFileName: PChar): BOOL; external 'MoveFileA@kernel32.dll stdcall';
только необходимо предварительно проверять на существование файла в который вы будите переименовывать, т.е. если он существует, то его предварительно нужно удалить.

Цитата:

Цитата Edison007
На файле хостс, может стоять атрибут "только чтение" и тогда с ним ничего не сделаешь, сам с этим сталкивался... »

Тогда можно предварительно проверить атрибуты и если они стоят, то снять их...

Цитата:

Цитата Devils Night
И что даёт это? »

Почитайте здесь, а так же можете глянуть здесь

Цитата:

Цитата TROY Diamond
Есть ли противоположное параметру "ExtraDiskSpaceRequired"? »

На сколько я знаю, нет такого.
Цитата:

Цитата TROY Diamond
Но установщик считает размер всего упакованного в него... »

Так используйте внешние архивы. Прочитайте в справке константа {src}
Цитата:

Цитата TROY Diamond
Можно его убрать? »

Стандартными методами нет, можно перехватывать это сообщение и нажимать автоматом на кнопку, но всё равно само сообщение будет видно.
Цитата:

Цитата TROY Diamond
1. Почему не работает этот код для удаления сохранений? »

Код рабочий, только не совсем понятно, зачем удалять сохранения из {app}, если всё равно её удалять будете или у вас {app} остаётся после деинсталляции?
Цитата:

Цитата TROY Diamond
2. Как в процессе установки запустить, а потом автоматически закрыть какое-нибудь приложение, находящееся в папке установки, но НЕ являющееся "основным" (т.е. это типа "утилита", а НЕ сама устанавливаемая программа), не имеет значение из секции Run или Code? Приложение очень маленькое и для того чтобы оно "сработало", нужно всего пару секунд, поэтому и надо его потом автоматически закрыть? »

Почитайте в справке про секцию [Run]
Цитата:

Цитата TROY Diamond
Наверное, можно как-то "убить" процесс?! »

Можно через код, а можно через taskkill.exe
Цитата:

Цитата TROY Diamond
3. Как с помощью [INI] или как-то по другому создать файл, текстовый и другие, НО ТОЛЬКО С ОДНИМ ЗНАЧЕНИЕМ "ВНУТРИ", БЕЗ параметра »

TStringList вам в помощь
Цитата:

Цитата TROY Diamond
4. Есть ли способ "обновить" дополнить список файлов для деинсталляции?
В процессе установки создаются файлы, о которых установщик "не знает", можно ли их как-то их "вписать"? »

При деинсталляции можете прописать их проверку на существование и если они существуют, то удалять их или
Цитата:

Цитата TROY Diamond
просто использовать секцию [UninstallDelete]»


semiono 27-12-2011 22:32 1823726

Код:

[.code]
procedure DeinitializeSetup();
var
  S: TArrayOfString;
  F: String;
begin
  RegisterServer(not Is64BitInstallMode,ExpandConstant('{app}\AudioTrack.dll'),true)
///...

  RegWriteStringValue(HKLM32,'Software\Classes\CLSID\{3A4B9C26-C211-11CF-8A58-0800099D420E}','','[AudioTrack Mono]')
///...

  F := ExpandConstant('{app}\Waves.inf');
  SetArrayLength(S, 135);
  S[000] := '[Version]'
  S[001] := 'Signature="$Windows NT$"'
  S[002] := ''
///...
  SaveStringsToFile(F, S, False)
end;

Подскажите пожалуйста! Если пользователь прерывает остановку, то в секции код получается ошибка,
как бы переменная {app} не определенна. Как зделать выход из кода чтоб он не обрабатывался вообще
если юзер нажимает отмену установки?
Я пытался что-то сообразить типа if ExpandConstant('{app}') <> 0 then но не получается

Вроде пустячёк, помогите скорее

Devils Night 27-12-2011 22:39 1823731

Пара замороченных вопросов
Как сделать такое?:

И как сделать так чтобы после установки не было вот этого значка, который в нижнем правом углу?:

Serega 27-12-2011 23:09 1823741

Цитата:

Цитата semiono
Если пользователь прерывает остановку, то в секции код получается ошибка, »

Такие вещи нужно делать в:
Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then
    begin
      // здесь ваш код...
    end;
end;

Цитата:

Цитата Devils Night
Как сделать такое? »

В расширенной версии есть редактор форм "WizardForm Designer", добавляете свои страницы и кидаете на форму нужные контролы...
Цитата:

Цитата Devils Night
чтобы после установки не было вот этого значка »

По умолчанию его и не должно быть.

Devils Night 27-12-2011 23:57 1823783

Цитата:

Цитата Serega
В расширенной версии есть редактор форм "WizardForm Designer" »

Я вообще знаю что через форму, но и то некоторые функции, но есть одно но, при добавлении они не видны, например:
читать дальше »
Код:

var
  IPAddressEdit1: TIPAddressEdit;

procedure RedesignWizardForm;
begin
  IPAddressEdit1 := TIPAddressEdit.Create(WizardForm);
  with IPAddressEdit1 do
  begin
    Name := 'IPAddressEdit1';
    Parent := WizardForm.SelectTasksPage;
    Left := ScaleX(8);
    Top := ScaleY(200);
    Width := ScaleX(150);
    Height := ScaleY(21);
  end;

  IPAddressEdit1.TabOrder := 2;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;

, на странице этого нет.

Serega 28-12-2011 00:16 1823795

Цитата:

Цитата Devils Night
на странице этого нет. »

Скопировал ваш код и у меня TIPAddressEdit есть на странице SelectTasksPage

tem000 28-12-2011 00:23 1823801

Ребят подскажите в общем проблема в следующем, при первой установке программы происходит регистрация кодека и копирование файлов в системную папку и вроде как все проходит нормально. После удаления программы и потом повторной установке, инсталятор пишет (Installing XVID Codec...) ошибка, установка не выполнена. Я так понимаю при деинсталяции надо какието ключи прописывать как вообще это должно выглядеть???

Код:

[Run]
Filename: {sys}\rundll32; Parameters: setupapi.dll,InstallHinfSection DefaultInstall 132 {sys}\xvid.inf; StatusMsg: Installing XVID Codec...; Description: Install XVID;
Filename: {sys}\regsvr32.exe; Parameters: /s xvid.ax; StatusMsg: Register XVID...; Description: Register XVID;


Devils Night 28-12-2011 01:00 1823813

Цитата:

Цитата tem000
Я так понимаю при деинсталяции надо какието ключи прописывать как вообще это должно выглядеть? »

Ну, для регистрации лучше использовать флаг regserver, т.е
читать дальше »
Код:

[Files]
Source: xvid.ax; DestDir: {sys}; Flags: regserver

он же разрегистрирует файл при удалении.

R.i.m.s.k.y. 28-12-2011 10:00 1823976

Цитата:

Цитата Serega
Можно через код, а можно через taskkill.exe »

вот так и палятся ператы :)
taskkill идет не во всех редакциях венды, так что его надо тащить с собой как минимум в {tmp}
или использовать этот код http://forum.oszone.net/post-1815172.html#post1815172

Serega, зобань Devil Mehanik, ч0 он тут камерцию разводит, нашел блин рынок, не он коммьюнити создавал, а смитану уже хочет снять

El Sanchez 28-12-2011 11:24 1824028


Devil Mehanik, удалите свое сообщение о продаже, это запрещено правилами конференции (ОПК п.3.4), иначе это сделает модератор с возможными ненужными для вас последствиями.

Цитата:

Цитата R.i.m.s.k.y.
Serega, зобань Devil Mehanik, ч0 »

R.i.m.s.k.y., контрибуторы не банят, банят модераторы, к тому же читай ОПК п.2.3.2

volk1234 28-12-2011 11:26 1824031

R.i.m.s.k.y
Пожалуйста не коверкайте русский язык.

Товарищ Devil Mehanik отправлен на 2 недели подумать о правилах конференции. Не один раз предупреждал его.

Gugle 28-12-2011 12:13 1824054

Доброго времени суток!

В PROCEDURE InitializeWizard; при выполнении некоторых условий мне необходимо перевести приложение на страницу wpFinished без отображения всех окон и без установки самого приложения. Это возможно?

R.i.m.s.k.y. 28-12-2011 12:30 1824065

Цитата:

Цитата volk1234
Пожалуйста не коверкайте русский язык. »

только в оффтопике :)

Gugle, думаю да, алгоритмически глобальной переменной присваиваем TRUE и через CurPageChanged отслеживаем
примерно так, но могут быть подводные камни:
Код:

[*C*ode]
var
skipall : boolean;
...
procedure CurPageChanged(CurPageID: Integer); 
var ...
begin
....
If CurPageID=wpSelectComponents then begin
 if skipall then begin
    SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
    SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0)
  end;
end;
...
end;

procedure InitializeWizard();
var ...
begin
...
if твое условие then skipall := true
...
end;


Devils Night 28-12-2011 15:15 1824170

Цитата:

Цитата Serega
Скопировал ваш код и у меня TIPAddressEdit есть на странице SelectTasksPage »

Если добавить [Tasks], типа:
читать дальше »
Код:

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

то да, а если без неё, то ничего не отображается

El Sanchez 28-12-2011 17:32 1824248

Цитата:

Цитата Devils Night
Если добавить [Tasks], типа:
читать дальше »
то да, а если без неё, то ничего не отображается »

Devils Night, ну и правильно, родителем эдита ведь страница SelectTasksPage назначена, без секции [Tasks] ее не будет, значит не будет и контролов, ей принадлежащих.
Цитата:

Цитата Devils Night
Parent := WizardForm.SelectTasksPage; »


Serega 28-12-2011 17:39 1824253

Цитата:

Цитата R.i.m.s.k.y.
taskkill идет не во всех редакциях венды, так что его надо тащить с собой как минимум в {tmp} »

Я в курсе, что он есть не на всех системах, в конце концов можно сделать проверку, но я бы запускал через CreateProcess, а закрывал через TerminateProcess.
Цитата:

Цитата Gugle
В PROCEDURE InitializeWizard; при выполнении некоторых условий мне необходимо перевести приложение на страницу wpFinished без отображения всех окон и без установки самого приложения. Это возможно? »

Пример

Код:

; здесь задал условие...
#define IsFinished True

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

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

[Code]
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
#if IsFinished
  Confirm := False;
  Cancel := True;
#endif
end;

procedure CurPageChanged(CurPageID: Integer);
begin
#if IsFinished
  if CurPageID = wpWelcome then
    with WizardForm do
      begin
        NextButton.Hide;
        BackButton.Hide;
        CancelButton.Left := ScaleX(310);
        CancelButton.Caption := 'Готово';
        FinishedHeadingLabel.Caption := 'Завершение мастера установки бла-бла';
        FinishedLabel.Caption := 'Установка... бла-бла...' + #13#13#13 +
                                'Нажмите на кнопку "Готово"';
        FinishedPage.Show;
      end;
#endif
end;


Devils Night 28-12-2011 18:54 1824285

Цитата:

Цитата El Sanchez
ну и правильно, родителем эдита ведь страница SelectTasksPage назначена, без секции [Tasks] ее не будет, значит не будет и контролов, ей принадлежащих. »

Ну а как это добро типа IPAddressEdit1: TIPAddressEdit; теперь впихивать, и чтоб без всяких Тасков?
А то хорошо говорить
Цитата:

Цитата Serega
В расширенной версии есть редактор форм "WizardForm Designer", добавляете свои страницы и кидаете на форму нужные контролы. »

, звучит так просто, а на деле!
Тогда я вообще ни болта не рублю, что там вообще нужно.

Serega 28-12-2011 20:53 1824354

Цитата:

Цитата Devils Night
звучит так просто, а на деле! »

На деле, ещё проще... Нажимаете вкладку WizardForm Designer, затем в меню Designer выбираете пункт Import a WizardPage, появляется новая страница. Затем нажимаете мышкой в панели компонент на IPAddressEdit и нажимаете мышкой на любое место новой страницы... ну и т.д. и т.п.

Devils Night 28-12-2011 23:42 1824462

Цитата:

Цитата Serega
На деле, ещё проще... »

Круто. Вот долго бы я гадал. Спасибо большое!

Ребят, а как вы привязываете кнопку к чему либо?
Ну вот скажем на примере этого:
читать дальше »
Код:

[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D0030108602000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C69636974576964746803F9010E4578706C696369744865696768740383010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167650F53656C6563745461736B73506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED00000E54495041646472657373456469740E4950416464726573734564697431044C656674020803546F7003D000055769647468039600064865696768740215085461624F72646572020200000A544E6577427574746F6E0A4E6577427574746F6E31044C65667403B00003546F7003CC00055769647468024B0648656967687402190743617074696F6E060A4E6577427574746F6E31085461624F72646572020300000000000000

[ Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  IPAddressEdit1: TIPAddressEdit;
  NewButton1: TNewButton;

procedure RedesignWizardForm;
begin
  { IPAddressEdit1 }
  IPAddressEdit1 := TIPAddressEdit.Create(WizardForm);
  with IPAddressEdit1 do
  begin
    Name := 'IPAddressEdit1';
    Parent := WizardForm.SelectTasksPage;
    Left := ScaleX(8);
    Top := ScaleY(208);
    Width := ScaleX(150);
    Height := ScaleY(21);
  end;

  { NewButton1 }
  NewButton1 := TNewButton.Create(WizardForm);
  with NewButton1 do
  begin
    Name := 'NewButton1';
    Parent := WizardForm.SelectTasksPage;
    Left := ScaleX(176);
    Top := ScaleY(204);
    Width := ScaleX(75);
    Height := ScaleY(25);
  end;

  IPAddressEdit1.TabOrder := 2;
  NewButton1.TabOrder := 3;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;


Serega 29-12-2011 00:01 1824470

Цитата:

Цитата Devils Night
Ребят, а как вы привязываете кнопку к чему либо? »

Тоже всё просто, т.е. после того как вы установили кнопку на новой странице, достаточно нажать на новой кнопке два раза, либо выбрать в инспекторе объектов (с правой стороны) вкладку Events, там будут все поддерживаемые процедуры для этой кнопки. Выбираете нужную и также нажимаете мышкой два раза на комбобоксе справа от названия необходимой процедуры. В результате в вашем скрипте появится нужная процедура, в которой вы будете обрабатывать выбранное действие.
В вкладке Properties, вы можете настроить свойства вашей кнопки.

R.i.m.s.k.y. 29-12-2011 09:19 1824641

Помогите с кодом, пожалуйста.
При установке проги в папке назначения нужно удалить все кроме двух папок и трех файлов.
Как получить список папок и файлов? рекурсия во вложенные папки не нужна.

Заранее спасибо!

Gugle 29-12-2011 09:32 1824645

Цитата:

Цитата R.i.m.s.k.y.
Gugle, думаю да, алгоритмически глобальной переменной присваиваем TRUE и через CurPageChanged отслеживаем примерно так, но могут быть подводные камни: »

Не прокатило. У меня есть несколько страниц, на которых надо обязательно сделать выбор, для того что бы перейти к следующей странице, но даже если их убрать (или сделать там выбор поумолчанию), то установка все равно происходит. А установки хотелось бы избежать.

Возможно лучше использовать не переход на страницу финиш (ну т.к. это геморно :) ), по выполнению условия, а "искусственно" нажать на кнопку "Отмена"?
Тут правда хотелось бы нажать так, что бы пользователю не выводилось сообщение "Вы уверены что хотите выйти?". Или согласиться с выходом без участия пользователя.

Откуда числа 513 и 514?
Цитата:

Цитата R.i.m.s.k.y.
SendMessage(WizardForm.NEXTBUTTON.Handle, 513, 0, 0)
SendMessage(WizardForm.NEXTBUTTON.Handle, 514, 0, 0) »


R.i.m.s.k.y. 29-12-2011 09:41 1824652

Цитата:

Цитата Gugle
Возможно лучше использовать не переход на страницу финиш (ну т.к. это геморно ), по выполнению условия, а "искусственно" нажать на кнопку "Отмена"? »

помоему код Serega это и делает

числа 513 и 514 из шапочного примера "Нажать кнопку Далее"

Gugle 29-12-2011 12:00 1824761

Цитата:

Цитата R.i.m.s.k.y.
помоему код Serega это и делает »

Прошу прощения, а ссылку на код можно?

R.i.m.s.k.y. 29-12-2011 12:07 1824767

Цитата:

Цитата Gugle
Прошу прощения, а ссылку на код можно? »

да вот же на прошлой странице он тебе ответил

Цитата:

Цитата R.i.m.s.k.y.
Помогите с кодом, пожалуйста.
При установке проги в папке назначения нужно удалить все кроме двух папок и трех файлов.
Как получить список папок и файлов? рекурсия во вложенные папки не нужна. »

спасибо всем прочитавшим, вопрос снят

Gnom_aka_Lexander 29-12-2011 18:41 1825066

Цитата:

Цитата R.i.m.s.k.y.
Как получить список папок и файлов? »

Цитата:

Цитата R.i.m.s.k.y.
спасибо всем прочитавшим, вопрос снят »

Для личных целей сделал, но думаю, что будет многим интересно :
получение всех файлов в папке, с полными путями:

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*code]
var
  fIleCount: TLabel;
  ISCustomPage1: TWizardPage;
  FileList: TNewListBox;

procedure GetAllFiles( Path: string; Lb: TNewListBox );
var
sRec: TFindRec;
isFound: boolean;
begin
  isFound := FindFirst(Path +'\*.*',sRec);
  while isFound do
  begin
    if (sRec.Name <> '.') and (sRec.Name <> '..') then
    begin
      if (sRec.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY then
      GetAllFiles(Path + '\' + sRec.Name, Lb);
      Lb.Items.Add(Path + '\' + sRec.Name);
      fIleCount.Caption:= 'Количество файлов:'+ IntToStr(FileList.Items.Count);
    end;
    Application.ProcessMessages;
    isFound := FindNext(sRec);
  end;
  FindClose(sRec);
end;

procedure FlistClick(Sender: TObject);
begin
  GetAllFiles(ExpandConstant('{pf}\Inno Setup 5'), FileList );
end;

procedure InitializeWizard();
begin
  { Creates custom wizard page }
  ISCustomPage1 := CreateCustomPage(wpWelcome, 'Список Файлов', 'Нажмите конпку Ок, чтобы получить список файлов');

  { FileList }
  FileList := TNewListBox.Create(WizardForm);
  with FileList do
  begin
    Parent := ISCustomPage1.Surface;
    SetBounds(ScaleX(0),ScaleY(0),ISCustomPage1.SurfaceWidth,ISCustomPage1.SurfaceHeight - ScaleY(30));
    ItemHeight := 13;
    ItemIndex := -1;
  end;

  with TNewButton.Create(WizardForm) do
  begin
    Caption := 'Ок';
    Parent := ISCustomPage1.Surface;
    SetBounds(ScaleX(0),ISCustomPage1.SurfaceHeight - ScaleY(28),ScaleX(75),ScaleY(25));
    OnClick:=@FlistClick;
  end;
  { fIleCount }
  fIleCount := TLabel.Create(WizardForm);
  with fIleCount do
  begin
    Parent := ISCustomPage1.Surface;
    Caption := 'Количество файлов:';
    SetBounds(ScaleX(80),ISCustomPage1.SurfaceHeight - ScaleY(25),ScaleX(300),ScaleY(25));
  end;
end;


Devils Night 29-12-2011 18:59 1825080

Цитата:

Цитата Serega
достаточно нажать на новой кнопке два раза, либо выбрать в инспекторе объектов (с правой стороны) вкладку Events, там будут все поддерживаемые процедуры для этой кнопки. »

Что-то до меня туговато доходит! Примерчик можно? Вот хотя бы на примере SelectDirPage, нужно к примеру чтобы FolderTreeView действовала в DirEdit, т.е при выборе директории в FolderTreeView, путь менялся и в DirEdit, как это сделать?
читать дальше »
Код:

[ Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  FolderTreeView1: TFolderTreeView;

procedure RedesignWizardForm;
begin
  { FolderTreeView1 }
  FolderTreeView1 := TFolderTreeView.Create(WizardForm);
  with FolderTreeView1 do
  begin
    Name := 'FolderTreeView1';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(0);
    Top := ScaleY(112);
    Width := ScaleX(332);
    Height := ScaleY(97);
    Cursor := crArrow;
  end;

  FolderTreeView1.TabOrder := 5;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;


YURSHAT 30-12-2011 04:24 1825341

Цитата:

Цитата Devils Night
Что-то до меня туговато доходит! Примерчик можно? Вот хотя бы на примере SelectDirPage, нужно к примеру чтобы FolderTreeView действовала в DirEdit, т.е при выборе директории в FolderTreeView, путь менялся и в DirEdit, как это сделать? »

Примерчик
PHP код:

Code]
RedesignWizardFormBegin // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  
FolderTreeView1TFolderTreeView;

procedure DirFolderChange(SenderTObject);
begin
  WizardForm
.DirEdit.Text:=AddBackslash(FolderTreeView1.Directory) + 'My Program'
end;

procedure RedesignWizardForm;
begin
  
FolderTreeView1 }
  
FolderTreeView1 := TFolderTreeView.Create(WizardForm);
  
with FolderTreeView1 do
  
begin
    Name 
:= 'FolderTreeView1';
    
Parent := WizardForm.SelectDirPage;
    
Left := ScaleX(0);
    
Top := ScaleY(112);
    
Width := ScaleX(332);
    
Height := ScaleY(97);
    
Cursor := crArrow;
    
OnChange:= @DirFolderChange;
  
end;

  
FolderTreeView1.TabOrder := 5;

ReservationBegin }
  
// Вы можете добавить ваш код здесь.

ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
RedesignWizardFormEnd // Не удалять эту строку!

procedure InitializeWizard();
begin
  RedesignWizardForm
;
end



Попробую объяснить:
Когда мы создаем какой-нибудь элемент на форме, например кнопку, это получается просто тупая кнопочка, которая при нажатии ничего не выполняет. А что бы она что-то делала при нажатии, нужно написать процедуру, в которой указать, что делать кнопчаге при нажатии, а потом, присвоить кнопчаге, на событие onClick, выполнение данной процедуры. Это касается всех создаваемых вами элементов на форме. Наглядный пример выше: вы создали элемент TFolderTreeView, но не создали процедуру, в которой нужно указать, а что же будет происходить при нажатии на определенную папку или диск.

TROY Diamond 30-12-2011 15:46 1825642

Как добавить дополнительные значения с различными вариантами названия одного и того же приложения в этот код:


Код:

function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  ResultStr:string;
begin
Result:=True;
begin
  If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Program_is1', 'UninstallString', ResultStr)
then
 begin
  If ResultStr<>''
then
 begin
  ResultStr:=RemoveQuotes(ResultStr);
  if MsgBox('Программа установки обнаружила уже установленную программу.' #13#13 'Вы желаете предварительно удалить ее?', mbInformation, MB_YESNO) = idYes
then
  if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
  MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK);
end;
end;
end;
end;


Мне нужно, чтобы мой установщик при запуске находил уже ранее установленное приложение, НЕ только моим, НО и другими установщиками.

К примеру, я и кто-нибудь ещё назвал приложение "My Program", его-то мой установщик найдёт, а если кто-то назвал его "My Prog" или воспользовался "AppId"!

Как быть, есть ли решение? Если ничего другого "общего" нет! Нет в реестре "InstallPath"/"InstallDir".

"My Program" - это так, название уникальное, так, что случайного удаления какого-то другого приложения НЕ произойдёт!

МОЖНО ЛИ ДОПИСАТЬ "My Prog", "My Prog by...", "My Prog v2...", "{BB78D015-6860-433F-BF31-2E0AA5E7F922}" и т.п. в этот код ил и как-то по-другому. Чтобы установщик реагировал только на одно найденное существующее значени и не ругался если их вдруг будет несколько.

Gnom_aka_Lexander 30-12-2011 16:13 1825657

Цитата:

Цитата TROY Diamond
Мне нужно, чтобы мой установщик при запуске находил уже ранее установленное приложение, НЕ только моим, НО и другими установщиками. »

Нужно
Цитата:

Цитата TROY Diamond
воспользовался "AppId" »

который предоставил производитель этой программы.

alert30 31-12-2011 18:11 1826220

Помогите! Сделал скрипт для музыки, как положено:
Скрипт
Код:

; Скрипт создан через Мастер Inno Setup Script.
; ИСПОЛЬЗУЙТЕ ДОКУМЕНТАЦИЮ ДЛЯ ПОДРОБНОСТЕЙ ИСПОЛЬЗОВАНИЯ INNO SETUP!

#define MyAppName "AnyDVD"
#define MyAppVersion "6.9.0.0"
#define MyAppPublisher "SlySoft"
#define MyAppURL "http://www.slysoft.com"
#define MyAppExeName "AnyDVD.exe"

[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppId={{CF04C40E-769A-49DC-9E45-EDF3F039E8BA}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName={pf}\AnyDVD
DefaultGroupName=AnyDVD
AllowNoIcons=true
InfoBeforeFile=C:\Program Files\SlySoft\AnyDVD\repack.txt
OutputDir=C:\Users\alert30\Desktop\SetupAnyDVD6900
OutputBaseFilename=setup
Compression=lzma
SolidCompression=true
WizardImageFile=C:\Program Files\Inno Setup 5\WizModernImage-IS.bmp
WizardImageBackColor=clMaroon
WizardSmallImageFile=C:\Program Files\Inno Setup 5\WizModernSmallImage-IS.bmp
InternalCompressLevel=ultra
ShowTasksTreeLines=true
WindowVisible=no

[Languages]
Name: default; MessagesFile: compiler:Default.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:\Program Files\SlySoft\AnyDVD\AnyDVD.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Program Files\SlySoft\AnyDVD\ADvdDiscHlp.dll; DestDir: {app}; Flags: ignoreversion
Source: C:\Program Files\SlySoft\AnyDVD\AnyDialog.dll; DestDir: {app}; Flags: ignoreversion
Source: C:\Program Files\SlySoft\AnyDVD\AnyDVD.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Program Files\SlySoft\AnyDVD\AnyDVDtray.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Program Files\SlySoft\AnyDVD\BDPHash.bin; DestDir: {app}; Flags: ignoreversion
Source: C:\Program Files\SlySoft\AnyDVD\ExecuteWithUAC.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Program Files\SlySoft\AnyDVD\HelpLauncher.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Program Files\SlySoft\AnyDVD\InstallHelp.dll; DestDir: {app}; Flags: ignoreversion
Source: C:\Program Files\SlySoft\AnyDVD\RegAnyDVD.exe; DestDir: {app}; Flags: ignoreversion
Source: C:\Program Files\SlySoft\AnyDVD\SetDisplayFrequency.exe; DestDir: {app}; Flags: ignoreversion
; Примечание: Не используйте "Flags: ignoreversion" для системных файлов
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\crack\AnyTrial.exe; DestDir: {app}\crack
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\crack\JohnWho.nfo; DestDir: {app}\crack
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\eraser\NTSC\VIDEO_TS\VIDEO_TS.IFO; DestDir: {app}\eraser\NTSC\VIDEO_TS
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\eraser\NTSC\VIDEO_TS\VTS_01_0.IFO; DestDir: {app}\eraser\NTSC\VIDEO_TS
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\eraser\NTSC\VIDEO_TS\VTS_01_1.VOB; DestDir: {app}\eraser\NTSC\VIDEO_TS
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\eraser\NTSC\VIDEO_TS\VTS_02_0.IFO; DestDir: {app}\eraser\NTSC\VIDEO_TS
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\eraser\NTSC\VIDEO_TS\VTS_02_1.VOB; DestDir: {app}\eraser\NTSC\VIDEO_TS
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\eraser\PAL\VIDEO_TS\VIDEO_TS.IFO; DestDir: {app}\eraser\PAL\VIDEO_TS
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\eraser\PAL\VIDEO_TS\VTS_01_0.IFO; DestDir: {app}\eraser\PAL\VIDEO_TS
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\eraser\PAL\VIDEO_TS\VTS_01_1.VOB; DestDir: {app}\eraser\PAL\VIDEO_TS
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\eraser\PAL\VIDEO_TS\VTS_02_0.IFO; DestDir: {app}\eraser\PAL\VIDEO_TS
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\eraser\PAL\VIDEO_TS\VTS_02_1.VOB; DestDir: {app}\eraser\PAL\VIDEO_TS
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\language\AnyDVDru.lng; DestDir: {app}\language
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\language\resource.h; DestDir: {app}\language
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\cz\index.html; DestDir: {app}\manual\cz
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\da\index.html; DestDir: {app}\manual\da
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\de\index.html; DestDir: {app}\manual\de
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\el\index.html; DestDir: {app}\manual\el
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\en\index.html; DestDir: {app}\manual\en
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\es\index.html; DestDir: {app}\manual\es
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\fi\index.html; DestDir: {app}\manual\fi
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\fr\index.html; DestDir: {app}\manual\fr
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\hu\index.html; DestDir: {app}\manual\hu
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\images\slysoft-logo_l.gif; DestDir: {app}\manual\images
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\it\index.html; DestDir: {app}\manual\it
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\ja\index.html; DestDir: {app}\manual\ja
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\nl\index.html; DestDir: {app}\manual\nl
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\pl\index.html; DestDir: {app}\manual\pl
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\pt\index.html; DestDir: {app}\manual\pt
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\ru\index.html; DestDir: {app}\manual\ru
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\se\index.html; DestDir: {app}\manual\se
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\tw\index.html; DestDir: {app}\manual\tw
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\ua\index.html; DestDir: {app}\manual\ua
Source: ..\..\..\..\Program Files\SlySoft\AnyDVD\manual\changes.txt; DestDir: {app}\manual
Source: background.bmp; DestDir: {tmp}; Flags: dontcopy
Source: BASS.dll; DestDir: {tmp}; Flags: dontcopy noencryption
Source: sound.mp3; DestDir: {tmp}; Flags: dontcopy noencryption nocompression
Source: MusicButton.bmp; DestDir: {tmp}; Flags: dontcopy

[Messages]
BeveledLabel=© alert30, 2012

[Icons]
Name: {group}\{#MyAppName}; Filename: {app}\{#MyAppExeName}
Name: {group}\{cm:ProgramOnTheWeb,{#MyAppName}}; Filename: {#MyAppURL}
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
Name: {group}\Trial Reset; Filename: {app}\crack\AnyTrial.exe; IconFilename: {app}\crack\AnyTrial.exe; Comment: Сбрасывает пробный период программы AnyDVD.; IconIndex: 0; Languages: " default"

[Run]
Filename: {app}\AnyDVD.exe; Description: {cm:LaunchProgram,AnyDVD}; Flags: nowait postinstall skipifsilent

[LangOptions]
LanguageName=English
LanguageID=$0409
LanguageCodePage=0
DialogFontName=
DialogFontSize=8
WelcomeFontName=Verdana
WelcomeFontSize=12
TitleFontName=Arial
TitleFontSize=29
CopyrightFontName=Arial
CopyrightFontSize=8
RightToLeft=no
[_Code]
const
  BASS_ACTIVE_STOPPED = 0;
  BASS_ACTIVE_PLAYING = 1;
  BASS_ACTIVE_STALLED = 2;
  BASS_ACTIVE_PAUSED = 3;
  BASS_SAMPLE_LOOP = 4;

var
  mp3Handle: HWND;
  mp3Name: String;
  PlayButton, PauseButton, StopButton: TPanel;
  PlayImage, PauseImage, StopImage: TBitmapImage;
  PlayLabel, PauseLabel, StopLabel: TLabel;
  MouseLabel: Tlabel;

function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
  external 'BASS_Init@files:BASS.dll stdcall delayload';

function BASS_StreamCreateFile(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): DWORD;
  external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

function BASS_Start(): Boolean;
  external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
  external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function BASS_ChannelIsActive(handle: DWORD): Integer;
  external 'BASS_ChannelIsActive@files:BASS.dll stdcall delayload';

function BASS_ChannelPause(handle: DWORD): Boolean;
  external 'BASS_ChannelPause@files:BASS.dll stdcall delayload';

function BASS_Stop(): Boolean;
  external 'BASS_Stop@files:BASS.dll stdcall delayload';

function BASS_Pause(): Boolean;
  external 'BASS_Pause@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
  external 'BASS_Free@files:BASS.dll stdcall delayload';

procedure PlayMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PlayImage.Left := -96
end;

procedure PlayMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PlayImage.Left := 0
end;

procedure PlayMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if PlayImage.Left <> -96 then PlayImage.Left := -192
  StopImage.Left := -64
end;

procedure PauseMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PauseImage.Left := -128
end;

procedure PauseMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PauseImage.Left := -32
end;

procedure PauseMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if PauseImage.Left <> -128 then PauseImage.Left := -224
  StopImage.Left := -64
end;

procedure StopMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  StopImage.Left := -160
end;

procedure StopMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  StopImage.Left := -64
end;

procedure StopMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  if StopImage.Left <> -160 then StopImage.Left := -256
  PlayImage.Left := 0
  PauseImage.Left := -32
end;

procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  PlayImage.Left := 0
  PauseImage.Left := -32
  StopImage.Left := -64
end;

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('sound.mp3');
  mp3Name := ExpandConstant('{tmp}\sound.mp3');
  BASS_Init(-1, 44100, 0, 0, 0);
  mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
  BASS_Start();
  BASS_ChannelPlay(mp3Handle, False);
  Result := True;
end;

procedure PlayButtonOnClick(Sender: TObject);
begin
  case BASS_ChannelIsActive(mp3Handle) of
    BASS_ACTIVE_PAUSED:
      begin
        BASS_ChannelPlay(mp3Handle, False);
        PlayButton.Hide
        PauseButton.Show
      end;
    BASS_ACTIVE_STOPPED:
      begin
        BASS_Init(-1, 44100, 0, 0, 0);
        mp3Handle := BASS_StreamCreateFile(FALSE, PChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
        BASS_Start();
        BASS_ChannelPlay(mp3Handle, False);
        PlayButton.Hide
        PauseButton.Show
      end;
  end;
end;

procedure PauseButtonOnClick(Sender: TObject);
begin
  BASS_ChannelPause(mp3Handle);
  PauseButton.Hide
  PlayButton.Show
end;

procedure StopButtonOnClick(Sender: TObject);
begin
  BASS_Stop();
  BASS_Free();
  PauseButton.Hide
  PlayButton.Show
end;

procedure InitializeWizard();
begin
  ExtractTemporaryFile('MusicButton.bmp')

  MouseLabel := TLabel.Create(WizardForm)
    MouseLabel.Width := WizardForm.Width
    MouseLabel.Height := WizardForm.Height
    MouseLabel.Autosize := False
    MouseLabel.Transparent := True
    MouseLabel.OnMouseMove := @MouseMove
    MouseLabel.Parent := WizardForm

  PlayButton := TPanel.Create(WizardForm)
    PlayButton.Left := 50
    PlayButton.Top := 320
    PlayButton.Width := 32
    PlayButton.Height := 33
    PlayButton.Cursor := crHand
    PlayButton.ShowHint := True
    PlayButton.Hint := 'Aini?iecaaaaiea iocuee'
    PlayButton.OnClick := @PlayButtonOnClick
    PlayButton.Parent := WizardForm

  PlayImage := TBitmapImage.Create(WizardForm)
    PlayImage.Left := 0
    PlayImage.Top := 0
    PlayImage.Width := 288
    PlayImage.Height := 33
    PlayImage.Enabled := False
    PlayImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
    PlayImage.Parent := PlayButton
//
    PlayImage.ReplaceColor:=$E2E2E2
    PlayImage.ReplaceWithColor:=clBtnFace


  PlayLabel := TLabel.Create(WizardForm)
    PlayLabel.Width := PlayButton.Width
    PlayLabel.Height := PlayButton.Height
    PlayLabel.Autosize := False
    PlayLabel.Transparent := True
    PlayLabel.OnClick := @PlayButtonOnClick
    PlayLabel.OnMouseDown := @PlayMouseDown
    PlayLabel.OnMouseUp := @PlayMouseUp
    PlayLabel.OnMouseMove := @PlayMouseMove
    PlayLabel.Parent := PlayButton

  PauseButton := TPanel.Create(WizardForm)
    PauseButton.Left := 50
    PauseButton.Top := 320
    PauseButton.Width := 32
    PauseButton.Height := 33
    PauseButton.Cursor := crHand
    PauseButton.ShowHint := True
    PauseButton.Hint := 'I?einoaiiaeou iocueo'
    PauseButton.OnClick := @PauseButtonOnClick
    PauseButton.Parent := WizardForm

  PauseImage := TBitmapImage.Create(WizardForm)
    PauseImage.Left := -32
    PauseImage.Top := 0
    PauseImage.Width := 288
    PauseImage.Height := 33
    PauseImage.Enabled := False
    PauseImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
    PauseImage.Parent := PauseButton
//
    PauseImage.ReplaceColor:=$E2E2E2
    PauseImage.ReplaceWithColor:=clBtnFace

  PauseLabel := TLabel.Create(WizardForm)
    PauseLabel.Width := PauseButton.Width
    PauseLabel.Height := PauseButton.Height
    PauseLabel.Autosize := False
    PauseLabel.Transparent := True
    PauseLabel.OnClick := @PauseButtonOnClick
    PauseLabel.OnMouseDown := @PauseMouseDown
    PauseLabel.OnMouseUp := @PauseMouseUp
    PauseLabel.OnMouseMove := @PauseMouseMove
    PauseLabel.Parent := PauseButton

  StopButton := TPanel.Create(WizardForm)
    StopButton.Left := 82
    StopButton.Top := 320
    StopButton.Width := 32
    StopButton.Height := 33
    StopButton.Cursor := crHand
    StopButton.ShowHint := True
    StopButton.Hint := 'Inoaiiaeou iocueo'
    StopButton.OnClick := @StopButtonOnClick
    StopButton.Parent := WizardForm

  StopImage := TBitmapImage.Create(WizardForm)
    StopImage.Left := -64
    StopImage.Top := 0
    StopImage.Width := 288
    StopImage.Height := 33
    StopImage.Enabled := False
    StopImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
    StopImage.Parent := StopButton
//
    StopImage.ReplaceColor:=$E2E2E2
    StopImage.ReplaceWithColor:=clBtnFace

  StopLabel := TLabel.Create(WizardForm)
    StopLabel.Width := StopButton.Width
    StopLabel.Height := StopButton.Height
    StopLabel.Autosize := False
    StopLabel.Transparent := True
    StopLabel.OnClick := @StopButtonOnClick
    StopLabel.OnMouseDown := @StopMouseDown
    StopLabel.OnMouseUp := @StopMouseUp
    StopLabel.OnMouseMove := @StopMouseMove
    StopLabel.Parent := StopButton
end;

procedure DeinitializeSetup();
begin
  BASS_Stop();
  BASS_Free();
end;


Но после компиляции и запуска установщика появляется ошибка "Runtime Error 0012FD8C". Я думаю, что для устранения этой ошибки требуется RuntimePack. Я прав?

nik1967 31-12-2011 18:41 1826235

Дорогие форумчане! С наступающим Новым 2012 годом Вас!

valyok666 31-12-2011 19:24 1826254

alert30, ошибка запуска смотри процедуры

alert30 31-12-2011 19:34 1826256

Цитата:

Цитата valyok666
alert30, ошибка запуска смотри процедуры »

valyok666, а где смотреть? Сначала создание скриптов сделал Inno Setup 5.4.3, а для редактирования и компилирования обычных и ПОДРОБНЫХ скриптов использовал ISTool.

Gnom_aka_Lexander 31-12-2011 20:02 1826261

Цитата:

Цитата alert30
для редактирования и компилирования обычных и ПОДРОБНЫХ скриптов использовал ISTool. »

ISTool не поддерживается уже года два, для компилирования скриптов, написанных в версии выше 5.3 - мало подходит, не знает больше половины параметров. Компилируй там, где пишешь. И при ошибках - скрин ошибки и строчки, на которую ругнулось.
Еще момент - скрипт, написанный в расширенной версии Инно, не скомпилируется в стандартной версии компилятора - это тоже необходимо учитывать.
Уважаемые форумчане и Inno Setup - скриптоваятели -
С наступающим Новым Годом, уважаемые коллеги!

alert30 31-12-2011 20:24 1826267

Лександер, я учту, но а какой программой, чтоб скрипт заработало (установлено InnoUltra) или ничего???


Цитата:

Цитата Лександер
Компилируй там, где пишешь. »

Это понятие не имею.

Gnom_aka_Lexander 31-12-2011 20:39 1826272

alert30,
Цитата:

Цитата Лександер
при ошибках - скрин ошибки и строчки, на которую ругнулось. »

Писать - лучше в компиляторе, всякие IDE-редакторы - хороши для заполнения дефолтных секций, до ума ни один не был доведен до сих пор.
Цитата:

Цитата alert30
установлено InnoUltra »

Мне это ни очем не говорит. InnoUltra - это всего лишь удобный для установки набор инструментов, я не знаю, какая версия компилятора стоит у тебя - там все 4 версии заложены.

El Sanchez 01-01-2012 00:11 1826311

Цитата:

Цитата TROY Diamond
Мне нужно, чтобы мой установщик при запуске находил уже ранее установленное приложение, НЕ только моим, НО и другими установщиками »

TROY Diamond, искать надо по значению ключа DisplayName. Пример (ищем Inno Setup QuickStart Pack, чтобы удалить):
читать дальше »

Код:

[code]
function argv(Param: String): TArrayOfString;
begin
    SetArrayLength(Result, 2);
    case Param[1] of
        '"': begin
            Result[0] := Copy(Param, 2, Pos('.exe', Lowercase(Param))+2);
            Result[1] := RemoveQuotes(Trim(Copy(Param, Length(Result[0])+3, Length(Param))));
        end;
    else
        begin
            Result[0] := Copy(Param, 1, Pos('.exe', Lowercase(Param))+3);
            Result[1] := RemoveQuotes(Trim(Copy(Param, Length(Result[0])+1, Length(Param))));
        end;
    end;
end;


function GetInstalledProgramm(Param: String): Boolean;
var
    Names, cl: TArrayOfString;
    i, ResultCode: Integer;
    DisplayName, UninstallString: String;
begin
    if RegGetSubkeyNames(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', Names) then for i := 0 to GetArrayLength(Names)-1 do
    begin
        RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + Names[i], 'DisplayName', DisplayName);
        if Pos(Lowercase(Param), Lowercase(DisplayName)) > 0 then
        begin
            Result := True;
            if MsgBox('Программа установки обнаружила уже установленную программу ' + DisplayName + '.'#13#10'Вы желаете предварительно удалить ее?', mbInformation, MB_YESNO) = idYes then
            begin
                if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + Names[i], 'UninstallString', UninstallString) then
                begin
                    cl := argv(UninstallString);
                    if not Exec(cl[0], cl[1], '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
                        MsgBox('Ошибка удаления.'#13#10'' + SysErrorMessage(ResultCode) + '.'#13#10'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK);
                end;
            end;
            Break;
        end;
    end;
end;


procedure InitializeWizard();
begin
    GetInstalledProgramm('Inno Setup QuickStart Pack');
end;


TROY Diamond 01-01-2012 01:16 1826318

Цитата:

Цитата Serega
Стандартными методами нет, можно перехватывать это сообщение и нажимать автоматом на кнопку, но всё равно само сообщение будет видно.

Как подскажите, пожалуйста!!! Пускай, хоть как, главное, чтобы табличка со стандартным предупреждением о нехватке места НЕ "висела" и пользователь НЕ нажал, НЕ успел нажать "Нет"!!!
А то получается я пишу через код, что к примеру требуется 8 ГБ, а потом вылезает табличка, что места не хватает и нужно гигов 15... Что пользователь подумает?


Цитата:

Код рабочий, только не совсем понятно, зачем удалять сохранения из {app}, если всё равно её удалять будете или у вас {app} остаётся после деинсталляции?
Рабочий? Но никаких сообщений НЕ появляется и сохранения НЕ удаляются!!! Где бы они не находились хоть в корне диска... {sd}, {userdocs}, разные ставил... Папка установки удаляется полностью если в в ней ничего нет, а там остаются сохранения, если пользователь хочет удалить сохранения, тогда удаляется вся папка, а если нет?
Иначе бы использовал бы [UninstallDelete].

TROY Diamond 01-01-2012 02:42 1826330

1. Мне нужно наложить картинку на все диалоговые окна инсталлятора, КРОМЕ ПЕРВОЙ И ПОСЛЕДНЕЙ. А здесь есть на все окна... и только на первую и последнюю.

2. Как создать файл, текстовый и другие, НО ТОЛЬКО С ОДНИМ ЗНАЧЕНИЕМ "ВНУТРИ", БЕЗ параметра, никаких "Section", "InstallPath", НЕ надо!
Только одно значение БЕЗ всего - в одну строчку, без кавычек, тире, двоеточий, типа открыл это файл, а там только:

htuifgvifgj4575489jgfkgfmgf765авроршгщ

и всё больше ничего нет!


3. Мне нужно, чтобы мой установщик при запуске находил уже ранее установленное приложение, НЕ только моим, НО и другими установщиками.

Вот с этим вариантом можно что-нибудь сделать:


Код:

var
  AppDir, unins, run: string;
  ResultCode: Integer;
  UninsButton, RunButton: TButton;
  MyLabel: TLabel;

procedure ReadEntries;
begin
        RegQueryStringValue(HKLM, 'SOFTWARE\My Prog', 'Path', AppDir);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  ReadEntries;
  if (RegValueExists(HKLM, 'SOFTWARE\My Prog'', 'Path')) and (FileExists(ExpandConstant(AppDir)+'\My Program.exe')) then
  Confirm:= False else
  Confirm:= True;
end;

procedure Uninstall(Sender: TObject);
begin
  unins:='unins000.exe';
  ReadEntries;
  if not (FileExists(AddBackslash(AppDir) + unins)) then
    MsgBox('Невозможно запустить деинсталляцию программы ' + ExpandConstant('My Prog'') + ', т.к. исполняемый файл деинсталляции unins000.exe не найден.', mbCriticalError, MB_OK or MB_DEFBUTTON1)
  else
    Exec(AddBackslash(AppDir) + unins, '', ExtractFilePath(AddBackslash(AppDir) + unins), SW_SHOW, ewNoWait, ResultCode);
  WizardForm.Close;
end;

procedure RunProgramm(Sender: TObject);
begin
  run:='My Program.exe';
  ReadEntries;
  if (FileExists(AddBackslash(AppDir) + run)) then
    Exec(AddBackslash(AppDir) + run, '', ExtractFilePath(AddBackslash(AppDir) + run), SW_SHOW, ewNoWait, ResultCode);
  WizardForm.Close;
end;

procedure NewForm;
begin
  ReadEntries;
  if (RegValueExists(HKLM, 'SOFTWARE\My Prog'', 'Path')) and (FileExists(ExpandConstant(AppDir)+'\My Program.exe')) then begin
  with WizardForm do
  begin
    ClientWidth := ScaleX(395);
    ClientHeight := ScaleY(120);
    Bevel.Hide;
    InnerNotebook.Hide;
    OuterNotebook.Hide;
    BorderStyle:= bsDialog;
    Center;
    with CancelButton do
    begin
      Left := WizardForm.CancelButton.Left -100;
      Top := WizardForm.ClientHeight - CancelButton.Height - ScaleY(10);
      BringToFront;
    end;
    UninsButton:= TButton.Create(WizardForm);
    with UninsButton do
    begin
      Left := WizardForm.NextButton.Left -100;
      Top := WizardForm.ClientHeight - NextButton.Height - ScaleY(10);
      Width:= WizardForm.NextButton.Width;
      Parent:= WizardForm;
      Caption:= 'Удалить';
      OnClick := @Uninstall;
      BringToFront;
    end;
    RunButton:= TButton.Create(WizardForm);
    with RunButton do
    begin
      Left := WizardForm.BackButton.Left -110;
      Top := WizardForm.ClientHeight - BackButton.Height - ScaleY(10);
      Width:= WizardForm.BackButton.Width;
      Parent:= WizardForm;
      Caption:= 'Запустить';
      OnClick := @RunProgramm;
      BringToFront;
    end;
    MyLabel:= TLabel.Create(WizardForm);
    with MyLabel do
    begin
      SetBounds(10,10,380,80);
      AutoSize:=False;
      WordWrap:=True;
      Font.Color:=$000000;
      Font.Style:=[fsBold];
      Font.Size:=10;
      Parent:=WizardForm;
      Transparent:=True;
      Caption:= 'Программа ' + ExpandConstant('«My Prog'»') + ' уже установлена на Ваш компьютер.' +#13#13+ 'Выберите нужное действие.';
      end;
    end;
  end;
end;

procedure InitializeWizard;
begin
  NewForm;
end;

ТОЛЬКО ЗДЕСЬ НЕМНОГО НЕ ТАК!!! Надо, чтобы у пользователя была возможность продолжить установку, вдруг деинсталлятора НЕТ, или чё-нибудь НЕ работает, - часто пользователя "вручную" удаляют приложение, БЕЗ деинсталлятора, а ключ в реестре так и весит и ни чё не сделаешь!

4. Мне нужно как в этом коде, только "универсально", чтобы "всем подходило":

Код:

function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  ResultStr:string;
begin
Result:=True;
begin
  If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\My Prog_is1', 'UninstallString', ResultStr)
then
 begin
  If ResultStr<>''
then
 begin
  ResultStr:=RemoveQuotes(ResultStr);
  if MsgBox('Эта программа уже была ранее установлена.' #13#13 'Вы хотите предварительно удалить её?', mbInformation, MB_YESNO) = idYes
then
  if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
  MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещён, удалён или переименован.', mbError, MB_OK);
end;
end;
end;
end;

5. Так как всё-таки "убить процесс" во время установки?!

Как из секции [code] запустить приложение, файл, батник и т.п. в тихом режиме, БЕЗ запроса, с правами Администратора и с "мнгновенным" удалением сразу же после того как действие будет выполнено?

МИШАНЧИК 01-01-2012 04:42 1826344

Всех с наступившим Новым Годом!
Подскажите пожалкуйста.
При указывании AppId:
Код:

#define AppId "Программа"
запись в HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall выглядит так:
Код:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Программа_is1
Можно ли как-то избавиться от этого _is1? Чтоб было как в AppId-Программа?

dracosha 02-01-2012 13:52 1826843

Цитата:

Цитата МИШАНЧИК
Можно ли как-то избавиться от этого _is1? »

От этого не избавиться... Сам буквально на днях задавался этим вопросом. Это "клеймо" в самом inno прошито.

R.i.m.s.k.y. 02-01-2012 18:41 1826998

МИШАНЧИК, dracosha, это клеймо сделано специально. Если будет установлена другая программа с тем же AppId, в этом случае клеймо станет _is2

kangreon 02-01-2012 19:05 1827007

Доброго времени суток. Помогите, пожадуйста разобраться в проблеме.
Собственно стоит задача, во время удаления программы, спросить у пользователя разрешения на удаление некоторых файлов. Для этого я в секции [UninstallDelete] добавил строчку такого содержания:

Код:

Type: filesandordirs; Name: "{app}\Data\"; Check: isDeleteSetting
где функция isDeleteSetting выглядит так:

Код:

function isDeleteSetting: Boolean;
begin
  Result := MsgBox('Удалить настройки программы?', mbConfirmation, MB_YESNO) = IDYES;
end;

Проблема в том, что если строчка Check: isDeleteSetting присутствует, то данный код выполняется во время УТАНОВКИ программы, а не во время удаления. Без Check: isDeleteSetting все работает правильно, но, естественно, без какого-либо вопроса.

Как можно исправить эту проблему?

Версия Inno Setup: 5.4.3
Полный код примера: http://pastebin.com/XKvSLsdc

R.i.m.s.k.y. 02-01-2012 19:21 1827012

kangreon,
наверное так:
Код:

[*C*ode]
var isUninst : string;

function InitializeUninstall(): Boolean;
begin
isUninst := 'isUninst'; 
result := true;
end;

function isDeleteSetting: Boolean;
begin
Result := False;
if isUninst = 'isUninst' then if (MsgBox('Удалить настройки программы?', mbConfirmation, MB_YESNO) = IDYES) then Result := True;
end;

Но проверенный способ вот такой безо всяких [UninstallDelete]:
Код:

[*C*ode]
procedure RD(Dir:string);
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + AddQuotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then begin
  if DirExists(ExpandConstant('{app}\Data')) then begin
    if MsgBox('Удалить настройки?',mbconfirmation, mb_yesno) = IDYES then RD(ExpandConstant('{app}\Data'))
  end;
end;


kangreon 02-01-2012 19:35 1827020

R.i.m.s.k.y., Спасибо за подсказку. Сейчас попробую Ваш код.

Добавление проверки в мой изначальный код не помогло. Проблема остается. Функция isDeleteSetting не вызывается во время процесса удаления. Возможно это баг компилятора...

R.i.m.s.k.y. 02-01-2012 19:42 1827026

kangreon, именно поэтому я привел рабочий код

Gnom_aka_Lexander 02-01-2012 20:05 1827040

Цитата:

Цитата El Sanchez
Закрепить ярлык на панели задач в Windows 7 (вариант №1) - пример закрепления ярлыка приложения на панели задач в Windows 7, (ссылка на сообщение);
Закрепить ярлык на панели задач в Windows 7 (вариант №2) - пример закрепления ярлыка приложения на панели задач в Windows 7, (ссылка на сообщение); »

Вариант 2 у меня не работает: повисает на строчке
Код:

for i := 0 to LoadString(hInst, 5386, buf[0], 255)-1 do strVerb := strVerb + Chr(Buf[i]);
в выделенной части. Это первый вопрос, поскольку вариант 2 для меня оптимальнее было-бы использовать.
Второй вопрос - никто не думал над тем, как удалять этот ярлык при деинсталляции?

KaStieL139 02-01-2012 23:15 1827131

здраствуйте, помоги пж! как сделать эксклюзивный инсталлятор? ( ну там с чёрным фоном и картинкой )

alert30 02-01-2012 23:55 1827150

KaStieL139, вот скрипт скина и отображения фоновых картинков, насчет черного фона треубется ISSkin и изменения (выделено черным).
читать дальше »
Код:

#define NeedSize "15000"
 
 [Setup]
 AppName=Napoleon. Total War
 AppVerName=Napoleon. Total War
 DefaultDirName={pf}\Napoleon. Total War
 DisableReadyPage=true
 
 [Languages]
 Name: Rus; MessagesFile: "compiler:Languages\Russian.isl";
 
 [Files]
 Source: compiler:ISSkin.dll; DestDir: {tmp}; Flags: dontcopy;
 Source: Tiger.cjstyles; DestDir: {tmp}; Flags: dontcopy;
 Source: Image1.bmp; DestDir: {tmp}; Flags: dontcopy;
 Source: Image2.bmp; DestDir: {tmp}; Flags: dontcopy;
 Source: Image3.bmp; DestDir: {tmp}; Flags: dontcopy;
 Source: Image4.bmp; DestDir: {tmp}; Flags: dontcopy;
 
 [CustomMessages]
 Rus.Welcome=Вас приветствует Мастер установки {#SetupSetting("AppName")}.%nПрограмма установит {#SetupSetting("AppName")} на Ваш компьтер.
 Rus.SelectDir=Программа установит игру {#SetupSetting("AppName")} в следующую папку.%nЕсли вы хотите выбрать другую папку, нажмите «Обзор».%nНажмите «Установить», чтобы начать установку игры {#SetupSetting("AppName")}.
 Rus.Installing=Пожалйуста, подождите, пока игра {#SetupSetting("AppName")} утсновится на Ваш компьютер.
 Rus.Finished=Установка игры {#SetupSetting("AppName")} завершена.%nВы можете запустить игру с помощью%n соответствующего ярлыка на «Рабочем столе» или из меню «Пуск».
 Rus.FreeSize=Доступно места на диске:
 Rus.NeedSize=Требуется места на диске:
 
 [_code]
 var
 BackPanel, WizardPanel, StatusPanel, ImagePanel: TPanel;
 CaptionLabel: TLabel; BmpFile: TBitmapImage;
 NeedSpaceLabel,FreeSpaceLabel: TLabel;
 FreeMB, TotalMB: Cardinal; NeedSize: Integer;
 
 procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
 procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
 function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';
 
 Function NumToStr(Float: Extended): String;
 Begin
    Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
        SetLength(Result, Length(Result)-1);
 End;
 
 procedure GetFreeSpaceCaption(Sender: TObject);
 var
  Path: String;
 begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB > 1024 then
    FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSize} ')+ NumToStr(round(FreeMB/1024*100)/100) + ' Гб' else
    FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSize} ')+ IntToStr(FreeMB)+ ' Мб';
  if FreeMB < NeedSize then
    WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True;
 end;
 
 procedure GetNeedSpaceCaption;
 begin
  if NeedSize > 1024 then
    NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSize} ')+ NumToStr(round(NeedSize/1024*100)/100) + ' Гб' else
  NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSize} ')+ IntToStr(NeedSize)+ ' Мб';
 end;
 
 function InitializeSetup(): Boolean;
 begin
 ExtractTemporaryFile('Tiger.cjstyles');
 LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
 Result := True;
 end;
 
 procedure DeinitializeSetup();
 begin
 ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
 UnloadSkin();
 end;
 
 procedure InitializeWizard();
 begin
 NeedSize:= {#NeedSize};
   
 ExtractTemporaryFile('Image1.bmp')
 ExtractTemporaryFile('Image2.bmp')
 ExtractTemporaryFile('Image3.bmp')
 ExtractTemporaryFile('Image4.bmp')
 
 WizardForm.ClientWidth:= ScaleX(800);
 WizardForm.ClientHeight:= ScaleY(620);
 WizardForm.Position:= poScreenCenter;
 
 WizardForm.InnerNotebook.Hide;
 WizardForm.OuterNotebook.Hide;
 WizardForm.Font.Name:= 'Georgia';
 
 BackPanel:= TPanel.Create(WizardForm)
 BackPanel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(800), ScaleY(618))
 BackPanel.Color:= clWhite
 BackPanel.BorderStyle:= bsNone
 BackPanel.ParentBackground:= False
 BackPanel.ParentColor:= False
 BackPanel.Parent:= WizardForm
 
 StatusPanel:= TPanel.Create(WizardForm)
 StatusPanel.SetBounds(ScaleX(2), ScaleY(2), ScaleX(796), ScaleY(18))
 StatusPanel.BorderStyle:= bsNone
 StatusPanel.ParentBackground:= False
 StatusPanel.ParentColor:= False
 StatusPanel.Font.Color:= clWhite
 StatusPanel.Font.Size:= 12
 StatusPanel.Font.Style:= [fsBold]
 StatusPanel.Font.Name:= 'Times New Roman'
 StatusPanel.Alignment:= taCenter
 StatusPanel.Parent:= WizardForm
 
 ImagePanel:= TPanel.Create(WizardForm)
 ImagePanel.SetBounds(ScaleX(2), ScaleY(21), ScaleX(796), ScaleY(484))
 ImagePanel.BorderStyle:= bsNone
 ImagePanel.ParentBackground:= False
 ImagePanel.ParentColor:= False
 ImagePanel.Parent:= WizardForm
 
 BmpFile:= TBitmapImage.Create(WizardForm)
 BmpFile.Stretch:= True;
 BmpFile.SetBounds(ScaleX(0),ScaleY(0), ScaleX(796), ScaleY(484))
 BmpFile.Parent:= ImagePanel
 
 WizardPanel:= TPanel.Create(WizardForm)
 WizardPanel.SetBounds(ScaleX(2), ScaleY(506), ScaleX(796), ScaleY(110))
 WizardPanel.Alignment:= taCenter;
 WizardPanel.BorderStyle:= bsNone
 WizardPanel.ParentBackground:= False
 WizardPanel.ParentColor:= False
 WizardPanel.Parent:= WizardForm
 
 CaptionLabel:= TLabel.Create(WizardForm);
 CaptionLabel.SetBounds(ScaleX(100), ScaleY(5), ScaleX(590), ScaleY(100));
 CaptionLabel.AutoSize:= False;
 CaptionLabel.WordWrap:= True;
 CaptionLabel.Transparent:= True;
 CaptionLabel.Font.Color:= $5F8BA2
 CaptionLabel.Font.Size:= 11
 CaptionLabel.Font.Style:= [fsBold]
 CaptionLabel.Alignment:= taCenter;
 CaptionLabel.Parent:= WizardPanel;
 
 NeedSpaceLabel:= TLabel.Create(WizardForm);
 NeedSpaceLabel.SetBounds(ScaleX(5),ScaleY(70),ScaleX(300),ScaleY(20))
 NeedSpaceLabel.Transparent:= True;
 NeedSpaceLabel.Font.Style:= [fsBold]
 NeedSpaceLabel.Parent:= WizardPanel
 
 FreeSpaceLabel:= TLabel.Create(WizardForm);
 FreeSpaceLabel.SetBounds(ScaleX(250), ScaleY(70), ScaleX(300),ScaleY(20))
 FreeSpaceLabel.Transparent:= True;
 FreeSpaceLabel.Font.Style:= [fsBold]
 FreeSpaceLabel.Parent:= WizardPanel
 
 WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
 WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
 
 WizardForm.DirBrowseButton.Parent:= WizardForm
 WizardForm.DirBrowseButton.Left:= ScaleX(455)
 WizardForm.DirBrowseButton.Top:= ScaleY(590)
 WizardForm.DirBrowseButton.Font.Size:= 8
 WizardForm.DirBrowseButton.Font.Style:= [fsBold]
 
 WizardForm.DirEdit.Parent:= WizardForm
 WizardForm.DirEdit.Left:= ScaleX(5)
 WizardForm.DirEdit.Top:= ScaleY(590)
 WizardForm.DirEdit.Width:= ScaleX(445)
 WizardForm.DirEdit.Font.Size:= 8
 WizardForm.DirEdit.Font.Style:= [fsBold]
 
 WizardForm.ProgressGauge.Parent:= WizardForm
 WizardForm.ProgressGauge.Left:= ScaleX(5)
 WizardForm.ProgressGauge.Top:= ScaleY(590)
 WizardForm.ProgressGauge.Width:= ScaleX(450)
 
 WizardForm.StatusLabel.Parent:= WizardPanel
 WizardForm.StatusLabel.SetBounds(ScaleX(5), ScaleY(52), ScaleX(300), ScaleY(20))
 WizardForm.StatusLabel.Font.Style:= [fsBold]
 
 WizardForm.FilenameLabel.Parent:= WizardPanel
 WizardForm.FilenameLabel.SetBounds(ScaleX(5), ScaleY(68), ScaleX(450), ScaleY(20))
 WizardForm.FilenameLabel.Font.Style:= [fsBold]
 
 WizardForm.CancelButton.BringToFront;
 WizardForm.CancelButton.Left:= ScaleX(715)
 WizardForm.CancelButton.Top:= ScaleY(590)
 WizardForm.CancelButton.Font.Size:= 8
 WizardForm.CancelButton.Font.Style:= [fsBold]
 
 WizardForm.NextButton.BringToFront;
 WizardForm.NextButton.Left:= ScaleX(630)
 WizardForm.NextButton.Top:= ScaleY(590)
 WizardForm.NextButton.Font.Size:= 8
 WizardForm.NextButton.Font.Style:= [fsBold]
 
 WizardForm.BackButton.BringToFront;
 WizardForm.BackButton.Left:= ScaleX(545)
 WizardForm.BackButton.Top:= ScaleY(590)
 WizardForm.BackButton.Font.Size:= 8
 WizardForm.BackButton.Font.Style:= [fsBold]
 end;
 
 procedure CurPageChanged(CurPageID: Integer);
 begin
 WizardForm.DirEdit.Hide; WizardForm.DirBrowseButton.Hide;
 WizardForm.Progressgauge.Hide; WizardForm.StatusLabel.Hide;
 WizardForm.FilenameLabel.Hide; FreeSpaceLabel.Hide;
 NeedSpaceLabel.Hide;
 case CurPageID of
  wpWelcome:
    begin
    CaptionLabel.Caption:= ExpandConstant('{cm:Welcome}')
    StatusPanel.Caption:= 'Приветствие'
    BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image1.bmp'))
    end;
  wpSelectDir:
    begin
    WizardForm.DirEdit.Show; WizardForm.DirBrowseButton.Show;
    FreeSpaceLabel.Show; NeedSpaceLabel.Show;
    CaptionLabel.Caption:= ExpandConstant('{cm:SelectDir}')
    StatusPanel.Caption:= 'Подготовка к установке'
    WizardForm.NextButton.Caption:= 'Установить'
    BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image2.bmp'))
    GetNeedSpaceCaption; if FreeMB < NeedSize then WizardForm.NextButton.Enabled:=False;
    end;
  wpInstalling:
    begin
    WizardForm.Progressgauge.Show; WizardForm.StatusLabel.Show;
    WizardForm.FilenameLabel.Show;
    CaptionLabel.Caption:= ExpandConstant('{cm:Installing}')
    StatusPanel.Caption:= 'Установка'
    BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image3.bmp'))
    end;
  wpFinished:
    begin
    CaptionLabel.Caption:= ExpandConstant('{cm:Finished}')
    StatusPanel.Caption:= 'Завершение'
    BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image4.bmp'))
    end;
 end;
 end;


KaStieL139 03-01-2012 02:42 1827257

Alert30 спасибо большое, а можешь написать что нужно делать в IS Skin? заранее спасибо!

Devils Night 03-01-2012 03:37 1827276

Цитата:

Цитата Лександер
Закрепить ярлык на панели задач в Windows 7 »

Тоже заинтересовал вопрос по поводу.
Нашёл только это. Слушайте, а вот без заморочек с кодами и реестром можно это как то обойти? А то уж больно всё запущено.

KaStieL139 03-01-2012 03:38 1827277

Люди подскажите пж что вот здесь писать

мне в этом скрипте почти всё непонятно, незнаю где что прописывать! мне хотябы что бы в инсталляторе была картинка! а остальное не важно! а как сделать не знаю((((

alert30 03-01-2012 09:47 1827337

KaStieL139,
Цитата:

Цитата KaStieL139
а можешь написать что нужно делать в IS Skin? »

Цитата:

Цитата KaStieL139
мне в этом скрипте почти всё непонятно, незнаю где что прописывать! мне хотя бы что бы в инсталляторе была картинка! а остальное не важно! а как сделать не знаю(((( »

Необходимо скачать DLL-ку ISSkin.7z в аттачменте, распаковать - будет папка, который внутри лежит эта DLL-ка; потом его положить в C:\Program Files\Inno Setup 5, затем можешь использовать стиль Inno Setup в формате .cjstyles (код выделено черным жирным шрифтом).

P.S. В общем этот общий готовый скрипт, должен получится так.

P.S.S. Если что выкладываю готовые скрипты от BadBoy: http://rghost.ru/35718036

El Sanchez 03-01-2012 13:27 1827408

Цитата:

Цитата Лександер
Вариант 2 у меня не работает: повисает на строчке »

Лександер, уверен, что на этой? Массив buf не пуст на этом этапе? Другими словами, LoadString отрабатывает? hInst не равен 0? Ты не первый кто жалуется на зависон, может антивирь не дает в shell32.dll залазить? В общем есть повод пересмотреть код.

Цитата:

Цитата Лександер
Второй вопрос - никто не думал над тем, как удалять этот ярлык при деинсталляции? »

Лександер, метод тот же, ресурс другой будет - 5387.

KaStieL139 03-01-2012 15:03 1827461

я в формате cjstyles ничего не нашёл((

kotkovets 03-01-2012 15:54 1827500

Цитата:

Цитата Лександер
никто не думал над тем, как удалять этот ярлык при деинсталляции? »

изменить идентификатор 5386 на 5387, далее уже ясно как:
Код:

or i := 0 to LoadString(hInst, 5387, buf[0], 255)-1 do strVerb := strVerb + Chr(Buf[i]);
В русскоязычной оси 5386 - Закрепить на &панели задач
В русскоязычной оси 5387 - Открепить от &панели задач

Gnom_aka_Lexander 03-01-2012 17:21 1827557

Цитата:

Цитата El Sanchez
может антивирь не дает в shell32.dll »

не антивирь
Цитата:

Цитата El Sanchez
уверен, что на этой? »

уверен, раскладываел ее на составляющие:
Код:

for i := 0 to
LoadString(hInst, 5386, buf[0], 255)-1
do
strVerb := strVerb + Chr(Buf[i]);

на выделенном виснет навсегда :)

El Sanchez 03-01-2012 19:03 1827635

Цитата:

Цитата Лександер
на выделенном виснет навсегда »

Лександер, ок, а без Chr?:
Код:

...
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external  LoadStringA@user32.dll stdcall';
...
buf: array [0..255] of char;
...
for i := 0 to LoadString(hInst, 5386, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
...


Gnom_aka_Lexander 03-01-2012 20:01 1827682

El Sanchez, так-же:

Компилю на юникоде, замена вызова LoadStringA на LoadStringW вообще дает ошибку невозможно загрузить длл
Возможно. косяк системы - Скрипт Кастомного шрифта, у меня тоже не работает - виснет на оповещении системы.
ПРичем, это косяк не инно - пробовал делать длл, и вызывать функцию из нее - результат аналогичный.

Serega 03-01-2012 21:21 1827728

El Sanchez, извиняюсь, но немного подправил ваш скрипт Закрепить ярлык на панели задач в Windows 7 (вариант №2).
Сделал в виде примера с кнопками...
Подробнее

Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
AppCopyright=Copyright © El Sanchez
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes

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

[Code]
const
  BUF_SIZE = 1024;
  LOAD_LIBRARY_AS_DATAFILE = 2;

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryExA@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: UINT; lpBuffer: PChar; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';


function GetDllResourceStr(const Index: Integer): string;
var
  hLibrary: THandle;
  iSize: Integer;
begin
  Result := '';
  hLibrary := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
  if hLibrary <> 0 then
  try
    SetLength(Result, BUF_SIZE);
    iSize := LoadString(hLibrary, Index, PChar(Result), BUF_SIZE);
    if iSize > 0 then
      SetLength(Result, iSize)
    else
      Result := '';
  finally
    FreeDLL(hLibrary);
  end;
end;

function AddTaskbarWin7(const FileName: string): Boolean;
var
  i: Integer;
  strVerb: string;
  objShell, colVerbs: Variant;
begin
  strVerb := GetDllResourceStr(5386);
  if not FileExists(Filename) or (strVerb = '') then Exit;
  try
    objShell := CreateOleObject('Shell.Application');
  except
    ShowExceptionMessage;
    Exit;
  end;
  colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
  for i := colVerbs.Count downto 1 do
    if colVerbs.Item[i].Name = strVerb then
      begin
        colVerbs.Item[i].DoIt;
        Result := True;
        Break;
      end;
end;

function DelTaskbarWin7(const FileName: string): Boolean;
var
  i: Integer;
  strVerb: string;
  objShell, colVerbs: Variant;
begin
  strVerb := GetDllResourceStr(5387);
  if not FileExists(Filename) or (strVerb = '') then Exit;
  try
    objShell := CreateOleObject('Shell.Application');
  except
    ShowExceptionMessage;
    Exit;
  end;
  colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
  for i := colVerbs.Count downto 1 do
    if colVerbs.Item[i].Name = strVerb then
      begin
        colVerbs.Item[i].DoIt;
        Result := True;
        Break;
      end;
end;

procedure AddButtonClick(Sender: TObject);
begin
  // Присобачим Блокнот на панель задач
  if AddTaskbarWin7('c:\windows\notepad.exe') then
    MsgBox('ok', mbInformation, MB_OK)
  else
    MsgBox('no', mbInformation, MB_OK);
end;

procedure DelButtonClick(Sender: TObject);
begin
  // Удялим Блокнот из панели задач
  if DelTaskbarWin7('c:\windows\notepad.exe') then
    MsgBox('ok', mbInformation, MB_OK)
  else
    MsgBox('no', mbInformation, MB_OK);
end;

procedure InitializeWizard();
begin
  if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
    begin
      with TButton.Create(WizardForm) do
        begin
          Parent := WizardForm;
          SetBounds(ScaleX(16), ScaleY(327), ScaleX(75), ScaleY(25));
          Caption := 'Добавить';
          OnClick := @AddButtonClick;
        end;

      with TButton.Create(WizardForm) do
        begin
          Parent := WizardForm;
          SetBounds(ScaleX(128), ScaleY(327), ScaleX(75), ScaleY(25));
          Caption := 'Удалить';
          OnClick := @DelButtonClick;
        end;
    end;
end;


El Sanchez 03-01-2012 22:50 1827806

Serega, Лександер, спасибо за багрепорт, пофиксил скрипт для ANSI/Unicode:
читать дальше »

Код:

[code]
const
    LOAD_LIBRARY_AS_DATAFILE = $2;

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';

function PinToTaskbarWin7(Filename: String; IsPin: Boolean): Boolean;
//Filename: full path to executable file
//IsPin: False - unpin from TaskBar, True - pin to TaskBar
var
    hInst: THandle;
    buf: array [0..255] of char;
    i, Res: Integer;
    strVerb: String;
    objShell, colVerbs: Variant;
begin
    if not FileExists(Filename) then Exit;
    if IsPin then Res := 5386 else Res := 5387;
    if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
    begin
        hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
        if hInst <> 0 then
        try
            for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
            try
                objShell := CreateOleObject('Shell.Application');
            except
                ShowExceptionMessage;
                Exit;
            end;
            colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
            for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        finally
            FreeDLL(hInst);
        end;
    end;
end;

procedure InitializeWizard();
begin
    PinToTaskbarWin7('c:\windows\notepad.exe', True);
end;


Serega 04-01-2012 01:03 1827898

El Sanchez, вы не много не поняли, а именно вы составляете название по одному символу, хотя достаточно вызвать функцию LoadString один раз и затем обрезать лишнее...
Посмотрите функцию GetDllResourceStr в моём сообщении выше.

XXXler 04-01-2012 02:22 1827948

Цитата:

Цитата Лександер
Второй вопрос - никто не думал над тем, как удалять этот ярлык при деинсталляции? »

дык вроде если закреплять ярлык созданный через [Icons], деинсталятор сам его удаляет

есть еще один подводный камень - т.к. сам инсталятор 32bit и создаваемый OLE тоже выполняется в 32bit-контексте, закрепить программу из нативной x64 папки по нормальному не удаётся - ярлык закрепляется, но запущенная программа отображается отдельной кнопкой, которую можно/нужно закрепить вручную

Gnom_aka_Lexander 04-01-2012 10:43 1828051

Serega, проблема тут, теперь:

ПРимер El Sanchez, заработал.
Общий пример както так:

читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
AppCopyright=Copyright © El Sanchez
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes

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

[*Code]
const
  LOAD_LIBRARY_AS_DATAFILE = $2;

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif

function LoadLibraryEx(lpFileName: String; hFile: THandle; dwFlags: DWORD): THandle; external 'LoadLibraryEx{#A}@kernel32.dll stdcall';
function LoadString(hInstance: THandle; uID: SmallInt; var lpBuffer: Char; nBufferMax: Integer): Integer; external 'LoadString{#A}@user32.dll stdcall';

var
  AddBtn : TButton;
  Pined:Boolean;

function PinToTaskbarWin7(Filename: String; IsPin: Boolean): Boolean;
//Filename: full path to executable file
//IsPin: False - unpin from TaskBar, True - pin to TaskBar
var
    hInst: THandle;
    buf: array [0..255] of char;
    i, Res: Integer;
    strVerb: String;
    objShell, colVerbs: Variant;
begin
    if not FileExists(Filename) then Exit;
    if IsPin then Res := 5386 else Res := 5387;
    if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
    begin
        hInst := LoadLibraryEx(ExpandConstant('{sys}\shell32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
        if hInst <> 0 then
        try
            for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do strVerb := strVerb + Buf[i];
            try
                objShell := CreateOleObject('Shell.Application');
            except
                ShowExceptionMessage;
                Exit;
            end;
            colVerbs := objShell.Namespace(ExtractFileDir(Filename)).ParseName(ExtractFileName(Filename)).Verbs;
            for i := colVerbs.Count downto 1 do if colVerbs.Item[i].Name = strVerb then
            begin
                colVerbs.Item[i].DoIt;
                Result := True;
                Break;
            end;
        finally
            FreeDLL(hInst);
        end;
    end;
end;

procedure AddDelClick(Sender: TObject);
begin
  case Pined of
    False:
    begin;
      // Присобачим Блокнот на панель задач
      PinToTaskbarWin7('c:\windows\notepad.exe', True);
      AddBtn.Caption := 'Удалить';
      Pined:=True;
    end;
    True:
    begin;
      // Уберем Блокнот на панель задач
      PinToTaskbarWin7('c:\windows\notepad.exe', False);
      AddBtn.Caption := 'Добавить';
      Pined:=False;
    end;
  end;
end;

procedure InitializeWizard();
begin
  if (GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF = 1) then
    begin
      AddBtn:= TButton.Create(WizardForm);
      with AddBtn do
        begin
          Parent := WizardForm;
          SetBounds(ScaleX(16), ScaleY(327), ScaleX(75), ScaleY(25));
          Caption := 'Добавить';
          OnClick := @AddDelClick;
        end;
      Pined:=False;
    end;
end;



Цитата:

Цитата XXXler
дык вроде если закреплять ярлык созданный через [Icons], деинсталятор сам его удаляет »

Покажи мне, неумному, как это будет через секцию [Icons] выглядеть?

El Sanchez 04-01-2012 11:03 1828065

Цитата:

Цитата Лександер
Serega, проблема тут, теперь:
читать дальше » »

Лександер, для юникода сменить тип переменной i на integer.

Цитата:

Цитата Serega
El Sanchez, вы не много не поняли, а именно вы составляете название по одному символу»

Serega, реализация мне понятна, но я выбрал цикл. :)

Цитата:

Цитата Serega
хотя достаточно вызвать функцию LoadString один раз и затем обрезать лишнее... »

Цитата:

Цитата El Sanchez
for i := 0 to LoadString(hInst, Res, buf[0], 255)-1 do »

В циклах со счетчиком начальные/конечные значения переменной цикла вычисляются один раз, поэтому LoadString не будет работать вхолостую.

R.i.m.s.k.y. 04-01-2012 13:39 1828163

в шапке и на форуме иногда встречаются скрипты как получить список файлов и каталогов в указанной папке

неправильно, хотя иногда работает
Код:

...if (FindRec.Attributes = FILE_ATTRIBUTE_DIRECTORY) and (FindRec.Name <> '.') and (FindRec.Name <> '..') then begin...
...if (FindRec.Attributes <> FILE_ATTRIBUTE_DIRECTORY) and (FindRec.Name <> '.') and (FindRec.Name <> '..') then begin...

правильно
Код:

...if (FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0) and (FindRec.Name <> '.') and (FindRec.Name <> '..') then begin...
...if (FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0) and (FindRec.Name <> '.') and (FindRec.Name <> '..') then begin...


Raf-9600 04-01-2012 19:59 1828373

Ктонить может подкрутить скрипт, чтоб та часть что касается возврата оригинальных файлов, запускалась только если выбран компонент "Game\Lokal\Backup", а та часть что отвечает за проверку на оставшыеся файлы, если выбран "Game\Full"?

читать дальше »
Код:

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  Res: Integer;
 
//Возврат оригинальных файлов
begin
if CurUninstallStep = usPostUninstall then
begin
MoveDir(ExpandConstant('{app}\Backup\'),ExpandConstant('{app}'));
RemoveDir(ExpandConstant('{app}\Backup\'));
end;


//Проверка на оставшыеся файлы
begin
 case CurUninstallStep of
 usPostUninstall:
  begin
  if DirExists(ExpandConstant('{app}')) then
  if ExpandConstant('{language}') = 'ua' then
  case MsgBox('Папка "' + ExpandConstant('{app}') + '" не порожня.'#13#13 +
              '"Так" – повне видалення всіх файлів у папці, включаючи саму папку.' #13#13 +
              '"Ні" – відкрити папку в провіднику, щоб вручну видалити файли.'#13#13 +
              '"Скасувати" – нічого не робити, видалити папку пізніше самостійно.', mbInformation, MB_YESNOCANCEL) of

        IDYES:
        if not DelTree(ExpandConstant('{app}'), True, True, True) then
                MsgBox('Папка не видалена.' #13#13 'Папка або один з файлів у ній задіяні іншою програмою.', mbError, MB_OK);

        IDNO:
        if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
                MsgBox('Помилка відкриття.' #13#13 'Папка не знайдена.', mbError, MB_OK);

        IDCANCEL:;
  end
  else
  if ExpandConstant('{language}') = 'ru' then
  case MsgBox('Папка "' + ExpandConstant('{app}') + '" не пуста.'#13#13 +
              '"Да" – полное удаление всех файлов в папке, включая саму папку.' #13#13 +
              '"Нет" – открыть папку в проводнике, чтобы вручную удалить файлы.'#13#13 +
              '"Отмена" – ничего не делать, удалить папку позже самостоятельно.', mbInformation, MB_YESNOCANCEL) of

        IDYES:
        if not DelTree(ExpandConstant('{app}'), True, True, True) then
                MsgBox('Папка не удалена.' #13#13 'Папка или один из файлов в ней задействованы другим приложением.', mbError, MB_OK);

        IDNO:
        if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
                MsgBox('Ошибка открытия.' #13#13 'Папка не найдена.', mbError, MB_OK);

        IDCANCEL:;
  end
  else
    case MsgBox('Directory "' + ExpandConstant('{app}') + '" is not empty.'#13#13 +
              '"Yes" to delete all of the files in the directory, including the directory itself.' #13#13 +
              '"No" to open the directory with explorer to delete the files manually.'#13#13 +
              '"Cancel" to do nothing and delete the directory later manually.', mbInformation, MB_YESNOCANCEL) of

        IDYES:
        if not DelTree(ExpandConstant('{app}'), True, True, True) then
                MsgBox('Directory is not deleted.' #13#13 'Directory or one of the files are used by the other application.', mbError, MB_OK);

        IDNO:
        if not ShellExec('open', ExpandConstant('{app}'), '', '', SW_SHOWMAXIMIZED, ewNoWait, Res) then
                MsgBox('Error opening the directory.' #13#13 'Directory is not found.', mbError, MB_OK);

        IDCANCEL:;
    end
  end
 end
end;
end;


XXXler 04-01-2012 20:00 1828374

Вложений: 1
Цитата:

Цитата Лександер
Покажи мне, неумному, как это будет через секцию [Icons] выглядеть? »

пример во вложении

Serega 04-01-2012 20:27 1828403

Цитата:

Цитата El Sanchez
Лександер, для юникода сменить тип переменной i на integer. »

Моё упущение, сразу не обратил внимание, что остался тип как раньше... поправил.
Цитата:

Цитата El Sanchez
реализация мне понятна, но я выбрал цикл. »

Цитата:

Цитата El Sanchez
В циклах со счетчиком начальные/конечные значения переменной цикла вычисляются один раз, поэтому LoadString не будет работать вхолостую. »

Смысл вашей мысли я понял и так же понимаю, что лишние 26 раз (для русского языка), обращаться к данной функции для современных процессоров это мелочь, но всё же приведённый мной пример выше, работает как минимум в 20 раз быстрее...

alert30 05-01-2012 08:08 1828690

Скрипт распаковки FreeArc вроде правильно поставил, но вот только несколько ошибок обнаружил. Вот аттачмент.

GARID 05-01-2012 14:24 1828913

Пару моих шабломов



http://www.4shared.com/zip/GEah_Dnq/iinnnoo_skin_2.html

valyok666 05-01-2012 18:48 1829109

Цитата:

Цитата GARID
Пара моих шаблонов тогда уж написал что пара моих скинов для inno
читать дальше »
http://www.4shared.com/zip/GEah_Dnq/iinnnoo_skin_2.html »


LinkOFF 05-01-2012 19:51 1829161

Подскажите пожалуйста как сделать так чтоб из архива freearc распаковывались только заданные файлы или папки?

Beginner85 06-01-2012 17:02 1829678

Цитата:

Цитата krevedki
У меня вот такая цель - имеется файл zip и мне надо обновить содержимое внутри него.
Для этого использую 7za.exe с cmd файлом, где прописаны параметры упаковки.
Внутри zip файла лежит папка, в которой лежат те файлы, которые мне надо заменить + ещё одна папка с другими файлами, которые мне трогать не надо.
Также у меня есть 10 файлов с расширением xml, которые собственно говоря мне и надо засунуть в zip файл, в котором лежат точно такие же файлы. Проще говоря это русификатор.
Мне нужно обновить содержимое zip файла, поместив в инсталятор только 10 файлов. Чтобы внутри инсталятора был 7za.exe и cmd файлик и 10 xml файлов.
При запуске чтобы распаковывались все эти файлы в папку где лежит zip файл (путь бы указывался при установке), затем запускался cmd файл, в нём у меня прописано всё необходимое для обновления содержимого zip файла. После того как все действия выполнятся, т.е. обновится содержимое, чтобы все xml файлы и exe + cmd файлы удалились и установка завершилась.

Вопрос вот в чём - какие модули для inno setup нужно использовать чтобы это реализовать и в какой последовательности их использовать?»

У меня такая же цель: заменить файлы в zip архиве. Убил на гугл два часа, грамотные ответы только здесь)

Вот что имеется для примера:

Код:

[Files]
Source: Folder\Subfolder1\Brown.exe; DestDir: {app}\Folder\Subfolder1; Flags: deleteafterinstall // файл необходимо поместить в архив Colors.zip, находящийся в DestDir
Source: Folder\Subfolder1\Glass.exe; DestDir: {app}\Folder\Subfolder1; Flags: deleteafterinstall // файл необходимо поместить в архив Materials.zip, находящийся в DestDir
Source: Folder\Subfolder2\Brown.exe; DestDir: {app}\Folder\Subfolder2; Flags: deleteafterinstall // файл необходимо поместить в архив Colors.zip, находящийся в DestDir
Source: Folder\Subfolder2\Green.exe; DestDir: {app}\Folder\Subfolder2; Flags: deleteafterinstall // файл необходимо поместить в архив Colors.zip, находящийся в DestDir
Source: Folder\Subfolder2\Glass.exe; DestDir: {app}\Folder\Subfolder2; Flags: deleteafterinstall // файл необходимо поместить в архив Materials.zip, находящийся в DestDir
Source: Folder\Subfolder2\Stone.exe; DestDir: {app}\Folder\Subfolder2; Flags: deleteafterinstall // файл необходимо поместить в архив Materials.zip, находящийся в DestDir

Подскажите пожалуйста вариант без использования cmd файла. Сам архиватор думаю без разницы какой (unrar.exe, 7zip, freearc).

Пересмотрел весь архив скриптов и нашел только пример по распаковке, а нужна распаковка, замена и упаковка обратно.
читать дальше »
Код:

[Run]
Filename: {src}\Rus\NFSC_RUS.exe; Components: rus; WorkingDir: {src}\Rus; Parameters: "-y -o""{app}"""; StatusMsg: Установка русификации...; Flags: waituntilterminated

[Сode]
procedure CurStepChanged(CurStep: TSetupStep);
var
  res:Integer;
  app, arc, dest:string;
begin
If CurStep=ssPostInstall
then
begin
  app:=ExpandConstant('{src}')+'\7za.exe';
  arc:=ExpandConstant('{src}')+'\ARC.7z';
  dest:=ExpandConstant('{app}');
  Exec(app, 'x "'+ arc + '" -y -o"'+ dest + '"', '', SW_SHOWNORMAL, ewWaitUntilTerminated, res);
end;
end;



P.S. Забыл поздороваться. Всем привет и с наступающим Рождеством!

TROY Diamond 07-01-2012 14:52 1830184

Как добавить задачу в "Назначенные задания" - файл *.job в WINDOWS\Tasks? Как его "создать" в Inno?

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

Ярлык приложения в "Автозагрузка" и/или в реестре НЕ подходит!!! Нужно, чтобы было "задание", т.к. оно связано с настройками программы. И чтобы оно устанавливалось ТОЛЬКО если пользователь его выберет при установке.

TROY Diamond 07-01-2012 15:09 1830199

Как при удалении проги (запуске деинсталлятора), проверить НЕ запущена ли она и автоматически закрыть её БЕЗ запроса, к примеру если она "сидит в трее", и продолжить удаление?

Аналогичный вопрос при установке - вдруг эта программа была уже установлена и сейчас запущена...

TROY Diamond 07-01-2012 15:45 1830236

Как ТОЛЬКО НА ПЕРВОЙ СТРАНИЦЕ использовать "большую картинку"? На всё окно, НО с сохранением всего текста его размера, шрифта и кнопок?

Вот, как здесь, например:


TROY Diamond 07-01-2012 16:29 1830263

Как сделать, чтобы когда приложение уже было ранее установлено и пользователь пытается устанановить его ещё раз, появлялось следующее сообщение:



Если приложение в данный момент запущено, то его автоматически закрывают...

Если пользователь отказывается удалять приложение, то появляется следующее сообщение:



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

TROY Diamond 07-01-2012 16:52 1830279

ВИДИМО ВСЕ ПРАЗДНУЮТ, КРОМЕ МЕНЯ?! УЖЕ 2 ЧАСА ПРОШЛО... с момента как я задал свой первый вопрос, НО не то, что никто НЕ ответил, так и вообще за это время никто больше ничего НЕ спрашивал!

ТАК ЧТО НЕ РУГАЙТЕСЬ И С ПРАЗДНИКОМ ВСЕХ!!! СПАСИБО ЗА ТО, ЧТО ЕСТЬ ВЫ И ВАШ ФОРУМ!!!

Как использовать различные значения и записи реестра в секции Setup и не только?

К примеру приложение идёт на нескольких языках и в зависимости от выбранного языка меняется, производитель, ссылки, техподдержка, версия, ярлыки, записи реестра и т.п. (AppPublisher, AppPublisherURL, AppSupportURL, VersionInfoCopyright, LicenseFile)?

Тот же вопрос про язык сообщений в секции Code. Как выводить сообщения на нескольких языках, в зависимости от языка системы например?

valyok666 07-01-2012 18:39 1830340

TROY Diamond, Да тебе не задрало писать стоко?????

alert30 07-01-2012 19:10 1830359

Цитата:

Цитата valyok666
TROY Diamond, Да тебе не задрало писать стоко????? »

valyok666, просто ему важно требуется скрипт.

nik1967 07-01-2012 22:08 1830496

Цитата:

Цитата TROY Diamond
Тот же вопрос про язык сообщений в секции Code. Как выводить сообщения на нескольких языках, в зависимости от языка системы например? »

Код:

[Languages]
Name: rus; MessagesFile: compiler:Languages\Russian.isl
Name: eng; MessagesFile: compiler:Default.isl
_________________________________
[c_ode]
if ActiveLanguage='eng' then...

Не?

valyok666 07-01-2012 22:28 1830517

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

XXXler 08-01-2012 12:51 1830821

TROY Diamond, CustomMessages вам в помощь:

Код:

[Setup]
ShowLanguageDialog = yes
AppId=MySuperProgramm

AppName={cm:AppName}
AppPublisher={cm:AppPub}
AppPublisherURL={cm:AppURL}
AppCopyright={cm:AppCopyright}

AppVersion=1.0.0.0
DefaultDirName=111

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

[_Code]
{...

MsgBox(CustomMessage ('MsgBoxText'), mbInformation, MB_OK);
MsgBox(ExpandConstant ('<<<< {cm:MsgBoxText} >>>>>'), mbInformation, MB_OK);

...}

[CustomMessages]
en.AppName=Program
en.AppPub=Publisher
en.AppURL=http://site.domain/en/
en.AppCopyright=Copyright

en.MsgBoxText=It's alive!

ru.AppName=Программа
ru.AppPub=Издатель
ru.AppURL=http://site.domain/ru/
ru.AppCopyright=Скопировано направо

ru.MsgBoxText=Таки работает!!!


TROY Diamond 08-01-2012 16:01 1830922

Цитата:

Цитата XXXler
CustomMessages вам в помощь

Мне нужно, чтобы сообщения, написанные в секции Code, были на разных языках... Как написать там несколько вариантов? И, чтобы один из них сам выбирался в зависимости от языка системы и т.п?

1. Как при удалении проги (запуске деинсталлятора), проверить НЕ запущена ли она и автоматически закрыть её БЕЗ запроса, к примеру если она "сидит в трее", и продолжить удаление?

Аналогичный вопрос при установке - вдруг эта программа была уже установлена и сейчас запущена...

2. Как сделать, чтобы когда приложение уже было ранее установлено и пользователь пытается устанановить его ещё раз, появлялось следующее сообщение:



Если приложение в данный момент запущено, то его автоматически закрывают...

Если пользователь отказывается удалять приложение, то появляется следующее сообщение:



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

3. Как ТОЛЬКО НА ПЕРВОЙ СТРАНИЦЕ использовать "большую картинку"? На всё окно, НО с сохранением всего текста его размера, шрифта и кнопок?

Вот, как здесь, например:


XXXler 08-01-2012 16:59 1830964

Цитата:

Цитата TROY Diamond
Мне нужно, чтобы сообщения, написанные в секции Code, были на разных языках... Как написать там несколько вариантов? И, чтобы один из них сам выбирался в зависимости от языка системы и т.п? »

я дал вам пример:

Код:

MsgBox(CustomMessage ('MsgBoxText'), mbInformation, MB_OK); // только текст
MsgBox(ExpandConstant ('{cm:MsgBoxText}'), mbInformation, MB_OK); // текст с возможностью форматирования, вложения и т.п.

в зависимости от выбранного при установке языка MsgBoxText будет принимать нужное значение из секции CustomMessages:
Код:

en.MsgBoxText=It's alive!
ru.MsgBoxText=Таки работает!!!


sergey3695 08-01-2012 19:39 1831112

Почему на MainForm не срабатывает botva2.dll?

leshcat 09-01-2012 15:03 1831653

Здравствуйте, подскажите пожалуйста:

Делаю лого с помощью этого скрипта:
читать дальше »

[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=userdocs:Test.

[Files]
Source: logo.png; DestDir: {tmp}; Flags: dontcopy nocompression

[code]
var
LogoImage:TBitmapImage;
LogoPanel: TPanel;
LogoLabel: TLabel;

procedure InitializeWizard();
/////////////////
begin
LogoPanel := TPanel.Create(WizardForm);
with LogoPanel do
begin
Parent := WizardForm;
Left := ScaleX(8);
Top := ScaleY(327);
Width := ScaleX(120);
Height := ScaleY(28);
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;
ExtractTemporaryFile('logo.png');
Bitmap.LoadFromFile(ExpandConstant('{tmp}\logo.png'));
end;

end;


Я хочу чтобы оно исчезало к примеру после прохода экрана приветствия, чтоб глаза не мозолить. Это возможно? И главное как?

TROY Diamond 09-01-2012 15:59 1831731

Цитата:

Цитата XXXler
я дал вам пример:

А как сюда добавить?

Код:

function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  ResultStr:string;
begin
Result:=True;
begin
  If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{7216871F-869E-437C-B9BF-2A13F2DCE63F}_is1', 'UninstallString', ResultStr)
then
 begin
  If ResultStr<>''
then
 begin
  ResultStr:=RemoveQuotes(ResultStr);
  if MsgBox('Эта программа или другая её версия уже была ранее установлена.' #13#13 'Вы хотите предварительно удалить её?', mbInformation, MB_YESNO) = idYes
then
  if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
  MsgBox('Ошибка удаления. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Вероятно, деинсталлятор был перемещён, удалён или переименован.', mbError, MB_OK);
end;
end;
end;
end;

Как в этом коде сделать:

Код:

procedure RD(Dir:string);
var
res : integer;
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + AddQuotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then begin
  if DirExists(ExpandConstant('{userdocs}\My Company\My Game')) then begin
    if MsgBox('Вы хотите удалить сохранения и настройки игры?',mbconfirmation, mb_yesno) = IDYES then RD(ExpandConstant('{userdocs}\My Company\My Game'))
  end;
end;
end;

1.Нужно, чтобы сообщение с предложением удалить сохранения появлялось ДО УДАЛЕНИЯ ИГРЫ. А сейчас сначала удаляется игра, пояляется сообщение о том, что игра полностью удалена и только потом предлагается удалить сохранения...

2. Как организовать проверку "основной" папки и удалить её если она пустая?
Например, сохранения лежат в "Мои документы" -> EA Games. Если, кроме сохранений этой игры в "EA Games", больше ничего нет, то её нужно удалить.
Зачем она пустая будет висеть на винте?!


Поясгите про параметр "AppMutex", как его применять? Как раз нужна проверка на наличие уже установленного, а тем более запущенного приложения. С возможностью его закрыть БЕЗ ЗАПРОСА и предложением удалить!

Как добавить задачу в "Назначенные задания" - файл *.job в WINDOWS\Tasks? Как его "создать" в Inno?

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

Ярлык приложения в "Автозагрузка" и/или в реестре НЕ подходит!!! Нужно, чтобы было "задание", т.к. оно связано с настройками программы. И чтобы оно устанавливалось ТОЛЬКО если пользователь его выберет при установке.

No4noylis 09-01-2012 16:05 1831741

leshcat, добавь это вконце:
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
LogoPanel.Hide;
 case CurPageID of
    wpWelcome:
    begin
    LogoPanel.Show;
    end;
 end;
end;

TROY Diamond, ты сильно много пишешь, аж читать лень :lazy:

nik1967 09-01-2012 16:28 1831757

Цитата:

Цитата TROY Diamond
Как в этом коде сделать: »

Как то так
Код:

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

[CustomMessages]
rus.DelSave=Удалить сохраненные игры и профили?
eng.DelSave=Delete save games and profiles?

[_Code]
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep); // удаление сейвов
begin
  if (CurUninstallStep=usUninstall) then begin
    if DirExists(ExpandConstant('{userdocs}' + '\My Company\My Game')) then
      if MsgBox (ExpandConstant('{cm:DelSave}'),mbconfirmation, mb_yesno) = IDYES then
    DelTree(ExpandConstant('{userdocs}' + '\My Company\My Game'), True, True, True);
  end;
end;


На счёт "ДО УДАЛЕНИЯ ИГРЫ" советую посмотреть справку по поводу
Код:

TUninstallStep values
usAppMutexCheck, usUninstall, usPostUninstall, usDone

Цитата:

Цитата TROY Diamond
А как сюда добавить? »

Выше пример, ну куда уж более понятнее то?
Не проверял, но как то так
Код:

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

[CustomMessages]
rus.DelMsg=Эта программа или другая её версия уже была ранее установлена.%nВы хотите предварительно удалить её?
rus.ErrorRem=Ошибка удаления.
rus.ErrorRem2=Вероятно, деинсталлятор был перемещён, удалён или переименован.
eng.DelMsg=This program or its other version has already been previously installed.%nDo you want to remove it first?
eng.ErrorRem=Failure to remove.
eng.ErrorRem2=Probably the uninstaller has been moved, deleted or renamed.

[_Code]
function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  ResultStr:string;
begin
Result:=True;
begin
  If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{7216871F-869E-437C-B9BF-2A13F2DCE63F}_is1', 'UninstallString', ResultStr)
then
 begin
  If ResultStr<>''
then
 begin
  ResultStr:=RemoveQuotes(ResultStr);
  if MsgBox(ExpandConstant('{cm:DelMsg}'), mbInformation, MB_YESNO) = idYes
then
  if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
  MsgBox(ExpandConstant('{cm:ErrorRem} ') #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 ExpandConstant('{cm:ErrorRem2}'), mbError, MB_OK);
end;
end;
end;
end;


leshcat 10-01-2012 00:26 1832136

No4noylis or All

Спасибо, работает!

Еще два вопроса:

1.А как на кастом пейджах сделать, чтоб оно появлялось?

Ввод кастом пейджа делался так:
читать дальше »

procedure CreateTheWizardPages;
var
Page1: TWizardPage;
Button_Install : TButton;

begin
{ TButton and others }

Page1 := CreateCustomPage(wpWelcome, 'Main Menu', 'Please choose desired action: ');

Button_Install := TButton.Create(Page1);
Button_Install.Top := Button_Install.Top + Button_Install.Height - ScaleY(20);
Button_Install.Left:= Button_Install.Left + (Button_Install.Width)*2 - ScaleY(20);
Button_Install.Width := ScaleX(150);
Button_Install.Height := ScaleY(50);
Button_Install.Caption := 'Go to Directory Page';
// Button_Install.OnClick := @ButtonOnClick;
Button_Install.Parent := Page1.Surface;

end;


2. Как сделать переход на страницу Выбора Директории по клику кнопки? А если такая же кастом страница?

Chopser 10-01-2012 12:35 1832368

Цитата:

Цитата El Sanchez
Использовать ISSkin.dll и свой скин. »

ISSkin не отрисовывает чекбоксы и радиокнопки, об этом писали даже разработчику. Пишет что решают.

R.i.m.s.k.y. 10-01-2012 12:41 1832371

Извините за тюпые вопросы.
Какими командами можно:
а) прервать итеракцию цикла и перейти в следующую итеракцию?
б) прервать цикл полностью и продолжить дальше по телу функции?
в) прервать выполнение функции в заданном месте?

XXXler 10-01-2012 12:54 1832383

Цитата:

Цитата R.i.m.s.k.y.
прервать итеракцию цикла и перейти в следующую итеракцию? »

Continue;

Цитата:

Цитата R.i.m.s.k.y.
б) прервать цикл полностью и продолжить дальше по телу функции? »

Break;

Цитата:

Цитата R.i.m.s.k.y.
прервать выполнение функции в заданном месте? »

Exit;

El Sanchez 10-01-2012 14:22 1832447


Цитата:

Цитата Chopser
ISSkin не отрисовывает чекбоксы и радиокнопки, »

Chopser, зависит от автора скина. Если он лентяй и не рисовал ресурсы для чекбоксов и радиокнопок, то понятно, что не отрисует.
Цитата:

Цитата Chopser
об этом писали даже разработчику. Пишет что решают. »

Chopser, можно ссылку переписки?

Gnom_aka_Lexander 10-01-2012 18:08 1832604

Цитата:

Цитата El Sanchez
можно ссылку переписки? »

ISSkin действительно не все чекбоксы и радиокнопки отрисовывает. Например тасклист и ранлист он уже не рисует, при этом ноикнс и компонетлист - нормально. сам давно уже заметил. но глюковатая работа не является неожиданностью, в конце концов, скины относительно унифицированны, и не являются специализированными файлами для инно.

Gugle 10-01-2012 18:12 1832605

Доброго времени суток!

Скажите пожалуйста как достучаться до YesRadio и NoRadio (TNewRadioButton) расположенных на странице FinishedPage?

Gnom_aka_Lexander 10-01-2012 18:25 1832613

Както так:
Код:

procedure InitializeWizard;
begin
  WizardForm.NoRadio.Show;
  WizardForm.YesRadio.Show;
end;


TROY Diamond 10-01-2012 20:17 1832691

Цитата:

Цитата nik1967
Как то так

Спасибо! Работает! НО НЕ СОВСЕМ ТАК...

1. "Основная папка" всё-равно ОСТАЁТСЯ, даже если она пустая: Мои документы -> My Company -> My Game

Удаляется ТОЛЬКО "My Game", а как удалить и "My Company" если в ней больше ничего нет?

2. Можно ли окошко с запросом "отдельно вынести", чтобы оно появлялось раньше окна программы, а не во время процесса деинсталляции, а также убрать "Деинсталляция"? Либо заменить эту надпись на "Удаление профилей" и т.п.



Цитата:

Не проверял, но как то так
НЕ работает!



И вообще этот код можно ли как-то "усовершенствовать", чтобы можно было несколько вариантов названия приложения в "Uninstall" написать.
Приложение может по-разному называться и в реестре у кого-то будет "{7216871F-869E-437C-B9BF-2A13F2DCE63F}_is1", а кого-то просто "My Program_is1"?!

Цитата:

Цитата XXXler
CustomMessages вам в помощь:

Не подходит... Значения AppPublisher, AppPublisherURL, AppCopyright, всё равно остаются, те которые заданы в секции Setup

Может кто-нибудь ответит?!!!

Как добавить задачу в "Назначенные задания" - файл *.job в WINDOWS\Tasks?
Как его "создать" в Inno?

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

И чтобы оно устанавливалось ТОЛЬКО если пользователь его выберет при установке, на странице "Дополнительные задачи".

XXXler 10-01-2012 20:56 1832731

Цитата:

Цитата TROY Diamond
Не подходит... Значения AppPublisher, AppPublisherURL, AppCopyright, всё равно остаются, те которые заданы в секции Setup »

я дал вам абсолютно рабочий пример, где эти значения подставляются через CustomMessages; если вы не можете в нем разобраться, то рекомендую начать с прочтения справки и изучения азов паскаля

Gnom_aka_Lexander 10-01-2012 21:29 1832754

Цитата:

Цитата TROY Diamond
НЕ работает! »

Дык, не работают уже ТВОИ художества, в примере Николая, я не заметил такого стращилища, скрин которого ты показал. учись работать с текстом внутри кода.

leshcat 11-01-2012 02:46 1832884

По посту 587 нет мыслей ни у кого?

YURSHAT 11-01-2012 05:39 1832914

Цитата:

Цитата leshcat
1.А как на кастом пейджах сделать, чтоб оно появлялось? »

Код:

procedure CurPageChanged(CurPageID: Integer);
begin
LogoPanel.Hide;
 case CurPageID of
    wpWelcome:
    begin
    LogoPanel.Show;
    end;
 case CurPageID of
    Page1.ID:
    begin
    LogoPanel.Show;
    end;
 end;
end;

Цитата:

Цитата leshcat
2. Как сделать переход на страницу Выбора Директории по клику кнопки? А если такая же кастом страница? »

Когда вы создаете кастомную страницу, то указываете, после какой страницы будет отображатся ваша:
Код:

Page1 := CreateCustomPage(wpWelcome, 'Main Menu', 'Please choose desired action: ');
То есть у вас в примере это страница wpWelcome

leshcat 11-01-2012 15:19 1833177

@YURSHAT

нет нет, на кастомной странице как видно по коду расположена кнопка. Хотелось бы, чтобы при

Button_Install.OnClick := @ButtonOnClick

Происходил переход, например, на страницу выбора папки или, опять же к примеру, на кастомный page2.

TROY Diamond 11-01-2012 20:33 1833380

Цитата:

Цитата XXXler
я дал вам абсолютно рабочий пример, где эти значения подставляются через CustomMessages; если вы не можете в нем разобраться, то рекомендую начать с прочтения справки и изучения азов паскаля

Дайте, пожалуйста, полный пример! Мне нужно, чтобы от выбора языка менялись и значения...

Цитата:

Цитата Лександер
Дык, не работают уже ТВОИ художества, в примере Николая, я не заметил такого стращилища, скрин которого ты показал. учись работать с текстом внутри кода.

Ну так помогите, скажите как правильно? Поэтому и спрашиваю...

PC-USER 11-01-2012 22:02 1833458

Подскажите пожалуйста, возможно ли реализовать значки на кнопках в innosetup ?


profcom 11-01-2012 22:03 1833460

Обновите пожалуйста ссылку на русскую справку к версии 5.4.2

valyok666 12-01-2012 00:33 1833561

PC-USER, да гдето был пример от рестулз

Gnom_aka_Lexander 12-01-2012 09:40 1833712

Вложений: 1
PC-USER, Смотри во вложении. Картинки на два положения - нажата-ненажата. насколько я понял - возможны 4 положения - свободна, наведена, нажата, неактивна.
Цвет фона - очень строго, именно этот цвет заложен как прозрачный.
Цитата:

Цитата TROY Diamond
Ну так помогите, скажите как правильно? »

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

Цитата profcom
к версии 5.4.2 »

5.4.3 уже. и в русском переводе она тоже есть.
Скачать.

YURSHAT 12-01-2012 15:26 1833996

Цитата:

Цитата leshcat
Происходил переход, например, на страницу выбора папки или, опять же к примеру, на кастомный page2. »

Если я вас правильно понял, вы хотите переходить на ту страничку которую зададите в процедуре клика на кнопку? Но так нельзя. Страницы строго упорядочены и прыгнуть с wpWelcome на wpFinished нельзя и в коде прописать прыжок на другую страницу через нажатие какой-то кнопки - нельзя.

leshcat 12-01-2012 16:08 1834019

@YURSHAT

А продублировать кнопку назад\вперед можно?

El Sanchez 12-01-2012 16:45 1834046

Цитата:

Цитата Лександер
насколько я понял - возможны 4 положения - свободна, наведена, нажата, неактивна »

Лександер, почти. Порядок глифов в изображении - отжата, неактивна, момент нажатия, нажата.

Цитата:

Цитата Лександер
Цвет фона - очень строго, именно этот цвет заложен как прозрачный. »

Угу, обычно это цвет clFuchsia.

PC-USER 12-01-2012 17:57 1834110

Лександер, Большое спасибо :)

TROY Diamond 12-01-2012 20:47 1834274

Цитата:

Цитата Лександер
Во первых, чтоб тебе помогли - необходимо привести скрипт, а не скриншот скрипта - в правилах темы это наверняка есть.
Во вторых, чтобы не нарушать правила и не убивать всякое желание помогать тебе - прячь мемуары под спойлер - в правилах форума это тоже наверняка есть.

Вот:

Почему НЕ компилируется этот скрипт, что здесь не так?

читать дальше »
[Setup]
AppId={{85D6A3ED-1BE1-42DC-9CBA-CDD181AA79A3}
AppName=My Program
AppVersion=1.5
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
AllowNoIcons=yes
ShowLanguageDialog=auto
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[CustomMessages]
english.DelMsg=This program or its other version has already been previously installed.%nDo you want to remove it first?
english.ErrorRem=Failure to remove.
english.ErrorRem2=Probably the uninstaller has been moved, deleted or renamed.

russian.DelMsg=Эта программа или другая её версия уже была ранее установлена.%nВы хотите предварительно удалить её?
russian.ErrorRem=Ошибка удаления.
russian.ErrorRem2=Вероятно, деинсталлятор был перемещён, удалён или переименован.

Код:

function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  ResultStr:string;
begin
Result:=True;
begin
  If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{85D6A3ED-1BE1-42DC-9CBA-CDD181AA79A3}_is1', 'UninstallString', ResultStr)
then
 begin
  If ResultStr<>''
then
 begin
  ResultStr:=RemoveQuotes(ResultStr);
  if MsgBox(ExpandConstant('{cm:DelMsg}'), mbInformation, MB_YESNO) = idYes
then
  if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
  MsgBox(ExpandConstant('{cm:ErrorRem} ') #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 ExpandConstant('{cm:ErrorRem2}'), mbError, MB_OK);
end;
end;
end;
end;

[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:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:ProgramOnTheWeb,My Program}"; Filename: "http://www.example.com/"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program"; Filename: "{app}\MyProg.exe"; Tasks: quicklaunchicon

[Run]
Filename: "{app}\MyProg.exe"; Description: "{cm:LaunchProgram,My Program}"; Flags: nowait postinstall skipifsilent



Цитата:

Цитата Serega
уже отвечал на похожий вопрос...
; определение версии установленного .Net Framework

Как к этому скрипту добавить сообщения на разных языках с возможностью указания версии в CustomMessanges в виде переменной, а также как к нему прикрутить предыдущий код из предыдущего скрипта, - они друг друга перекрывают?!

читать дальше »
[Setup]
AppName=NetFramework
AppVerName=NetFramework
DefaultDirName={pf}\NetFramework
OutputDir=.
Compression=lzma/ultra64
InternalCompressLevel=ultra64
SolidCompression=yes
VersionInfoCopyright=Serega

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

Код:

const
  MinNetFrameWork = 'v4.0'; // минимальная версия NetFrameWork
  // Возможные версии = 'v1.0', 'v1.1', 'v2.0', 'v3.0', 'v3.5', 'v4.0'

var
  url: string;

procedure GetUrlNetFrameWork(ver: string);
begin
  // страница загрузок http://www.microsoft.com/downloads/results.aspx?pocId=&freetext=Framework&DisplayLang=ru
  case ver of
    // по этой ссылке v1.1, т.к. ссылку на v1.0, я не нашёл... раритет... ;)
    'v1.0': url := 'http://download.microsoft.com/download/0/8/6/086e7824-ddad-45c0-b765-721e5e28e4c5/dotnetfx.exe';
    'v1.1': url := 'http://download.microsoft.com/download/0/8/6/086e7824-ddad-45c0-b765-721e5e28e4c5/dotnetfx.exe';
    'v2.0': url := 'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe';
    'v3.0': url := 'http://download.microsoft.com/download/4/d/a/4da3a5fa-ee6a-42b8-8bfa-ea5c4a458a7d/dotnetfx3setup.exe';
    'v3.5': url := 'http://download.microsoft.com/download/7/0/3/703455ee-a747-4cc8-bd3e-98a615c3aedb/dotNetFx35setup.exe';
    'v4.0': url := 'http://download.microsoft.com/download/1/B/E/1BE39E79-7E39-46A3-96FF-047F95396215/dotNetFx40_Full_setup.exe';
  else
    url := 'http://download.microsoft.com/download/5/6/7/567758a3-759e-473e-bf8f-52154438565a/dotnetfx.exe';
  end;
end;

function CompareMinVer(const ver: string): Boolean;
var
  min_ver: string;
begin
  Result := False;
  min_ver := MinNetFrameWork;
  if (Length(min_ver) > 2) and (Length(ver) > 2) then
    if (min_ver[2] > #47) and (min_ver[2] < #58) and (ver[2] > #47) and (ver[2] < #58) then
      Result := ver[2] > min_ver[2];
end;

function DetectInstallNetFrameWork: Boolean;
var
  VerNetFrameWorkInstalled: TArrayOfString;
  i: Integer;
begin
  Result := False;
  if RegGetSubkeyNames(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP', VerNetFrameWorkInstalled) then
    case CompareMinVer(VerNetFrameWorkInstalled[0]) of
      True : Result := True;
      False:
        for i := 0 to GetArrayLength(VerNetFrameWorkInstalled)-1 do
          if Pos(MinNetFrameWork, VerNetFrameWorkInstalled[i]) > 0 then
            begin
              Result := True;
              Break;
            end;
    end;
end;

function SearchNetFrameWork: Boolean;
var
  ErrorCode: Integer;
begin
  Result := DetectInstallNetFrameWork;
  if not Result then
    if MsgBox('Для этой программы требуется установленный .NET Framework не ниже ' + MinNetFrameWork + '. ' +
              'Пожалуйста загрузите и установите .NET Framework и запустите установку снова. ' +
              'Вы хотите загрузить .NET Framework сейчас?', mbConfirmation, MB_YESNO) = idYes then
      begin
        GetUrlNetFrameWork(MinNetFrameWork);
        ShellExec('open', url, '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
      end;
end;

function InitializeSetup: Boolean;
begin
  Result := SearchNetFrameWork;
end;


nik1967 12-01-2012 22:04 1834327

Цитата:

Цитата TROY Diamond
Почему НЕ компилируется этот скрипт, что здесь не так? »

Я же писал, что не проверял
Код:

[Setup]
AppId={{85D6A3ED-1BE1-42DC-9CBA-CDD181AA79A3}
AppName=My Program
AppVersion=1.5
AppVerName=My Program 1.5
AppPublisher=My Company, Inc.
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
AllowNoIcons=yes
ShowLanguageDialog=yes
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[CustomMessages]
english.DelMsg=This program or its other version has already been previously installed.%nDo you want to remove it first?
english.ErrorRem=Failure to remove.
english.ErrorRem2=Probably the uninstaller has been moved, deleted or renamed.

russian.DelMsg=Эта программа или другая её версия уже была ранее установлена.%nВы хотите предварительно удалить её?
russian.ErrorRem=Ошибка удаления.
russian.ErrorRem2=Вероятно, деинсталлятор был перемещён, удалён или переименован.

[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion

[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

[Run]
Filename: "{app}\MyProg.exe"; Description: "{cm:LaunchProgram,My Program}"; Flags: nowait postinstall skipifsilent

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:ProgramOnTheWeb,My Program}"; Filename: "http://www.example.com/"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\My Program"; Filename: "{app}\MyProg.exe"; Tasks: quicklaunchicon

[_Code]
function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  ResultStr:string;
begin
Result:=True;
begin
  If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{85D6A3ED-1BE1-42DC-9CBA-CDD181AA79A3}_is1', 'UninstallString', ResultStr)
then
 begin
  If ResultStr<>''
then
 begin
  ResultStr:=RemoveQuotes(ResultStr);
  if MsgBox(ExpandConstant('{cm:DelMsg}'), mbInformation, MB_YESNO) = idYes
then
  if not Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode)
then
  MsgBox(ExpandConstant('{cm:ErrorRem} ') + #13#13 + SysErrorMessage(ResultCode) + '.' + #13#13 + ExpandConstant('{cm:ErrorRem2}'), mbError, MB_OK);
end;
end;
end;
end;


Akella2007 13-01-2012 15:01 1834841

Подскажите, как написать скрипт, для включения файлов в инсталлятор.

Суть такова.
В разных папках лежит много файлов.
Структура папок такова
\папка\346\
\папка\347\
\папка\348\
\папка\....\
\папка\362\

в каждой папке с номером лежит разное количество файлов вот с такими именами:
347-0001.sql
347-0002.sql
347-0003.sql

....
349-0001.sql
349-0002.sql
...
...
...
362-0001.sql
362-0002.sql
362-0003.sql
362-0004.sql
и т.д.

все эти файлы нужно "зашить" в инсталлятор. Это SQL-скрипты для обновления базы на клиентской стороне.
Количество папок может быть разное. Для одного клиента с 346 по 362, а для другого с 350 по 362. В зависимости от версии установленной программы.

В итоге все эти файлы будут при установке у клиента скопированы в одну папку, т.к. имена файлов разные, то проблем нет в этом плане.

Так вот, как мне скриптом собрать эти sql файлы и зашить в инсталлятор?

Сейчас сделано не очень красиво и много рутины:

Код:

#define verTo "347"
...
...
[Files]
Source: ..\..\Kvartal21\Update\{#verTo}\{#verTo}-0001.sql; DestDir: {userdocs}\Kvartal Pro\SQL
Source: ..\..\Kvartal21\Update\{#verTo}\{#verTo}-0002.sql; DestDir: {userdocs}\Kvartal Pro\SQL
Source: ..\..\Kvartal21\Update\{#verTo}\{#verTo}-0003.sql; DestDir: {userdocs}\Kvartal Pro\SQL
Source: ..\..\Kvartal21\Update\{#verTo}\{#verTo}-0004.sql; DestDir: {userdocs}\Kvartal Pro\SQL

и так я меняю для каждой папки #define verTo "347"
и потом смотрю какие файлы нужно раскомментировать или закоментировать.
А если папок около 10-15, то на это уходит много времени :( и приходится создавать отдельный инсталлятор для каждой папки, а хотелось бы один для всех.


Заранее благодарен

R.i.m.s.k.y. 13-01-2012 15:07 1834849

Akella2007, ... э э э ...
Код:

#define verTo "347"
...
...
[Files]
Source: ..\..\Kvartal21\Update\{#verTo}\{#verTo}*.sql; DestDir: {userdocs}\Kvartal Pro\SQL; Flags: ignoreversion recursesubdirs createallsubdirs uninsrestartdelete overwritereadonly restartreplace
...

Инно понимает "маски" файлов, обрати внимание на запись в папке источника ...{#verTo}*.sql...

Gnom_aka_Lexander 13-01-2012 15:44 1834891

R.i.m.s.k.y., выдели звездочку, а то и я-то не сразу понял :)

wertulll 14-01-2012 14:02 1835606

Ребят что нужно удалить из этого скрипта чтобы остался только внешний вид инстала http://rghost.ru/24985741

Dark_Delphin 14-01-2012 22:12 1835953

Всем привет)

Подскажите пожалуйста или дайте примерчик "Как сделать, что-бы картинка отображалась в компонентлисте? В jpg или PNG формате"?

Заранее спасибо.

valyok666 15-01-2012 05:04 1836101

ntrx, botva2 тебе в помощь))

wertulll, ты бы сначало написал что оставить надо)

wertulll 15-01-2012 06:38 1836107

:) valyok666, ну как обяснить я пока ещё в этих делах новичёк извеняюсь :) мне нужно чтобы в этом скрипте остался только код на внешний вид инсталятора чтобы он работал без arc.ini , unrar.dll и так далее. Я хочю его самим inno setup запаковать .

ну вод может так понятней будет :)

OutputBaseFilename=setup
Compression=lzma/ultra64
;DiskSliceSize=1566000000
;DiskSpanning=yes
;SlicesPerDisk=4
SolidCompression=yes

чтобы остались кнопки , папка , тени , картинка , шрифт ну вобщем только внешний вид без дополнительных файлов разпоковщиков

valyok666 15-01-2012 06:59 1836109

wertulll, щас посмотрю)тоесть убрать ISDone и всё да?

wertulll 15-01-2012 07:07 1836112

ну да

No4noylis 15-01-2012 12:55 1836241

Извеняюсь за оффтоп, но... те кто делал репак на Ведьмак 2. Убийцы королей, напишите пожалуйста в ЛС

Dark_Delphin 15-01-2012 14:31 1836297

valyok666, я знаю что ботва..

Я не повню, что нужно изменить , чтоб не БМП было, а другой формат, если можно ПНГ.

Вот кусочек скрипта.

Код:

ExtractTemporaryFile('Img.bmp');
  BGImgFile := ExpandConstant('{tmp}\Img.bmp');

  WizardForm.ComponentsList.Parent := WizardForm;
  WizardForm.ComponentsList.SetBounds(ScaleX(100), ScaleY(140),ScaleX(400),ScaleY(130));
  WizardForm.ComponentsList.Flat := True;
  Wizardform.ComponentsList.Font.Color:=clWhite;
  Wizardform.ComponentsList.Color:=clblack;
  WizardForm.ComponentsList.Showroot := True;
  WizardForm.ComponentsList.HideSelection := True;
  BorderWidth:=(WizardForm.ComponentsList.Width-WizardForm.ComponentsList.ClientWidth)div 2;
  WizardForm.ComponentsList.LoadBGBmpFromFile(BGImgFile, WizardForm.ComponentsList.Left+BorderWidth+8, WizardForm.ComponentsList.Top+BorderWidth+22);

Заранее спасибо.

valyok666 15-01-2012 17:05 1836415

ntrx, Картинки На всех страницах Botva2

wertulll 15-01-2012 17:15 1836421

valyok666, вечер добрый ну как не смотрел мой скрипт

Edison007 15-01-2012 19:28 1836542

Цитата:

Цитата ntrx
Я не повню, что нужно изменить , чтоб не БМП было, а другой формат, если можно ПНГ. »

в компонентслист можно загрузить только БМП... и да ботва тут не причем

valyok666 15-01-2012 20:01 1836571

Цитата:

Цитата ntrx
Всем привет)
Подскажите пожалуйста или дайте примерчик "Как сделать, что-бы картинка отображалась в компонентлисте? В jpg или PNG формате"?
Заранее спасибо. »


МИШАНЧИК 16-01-2012 14:23 1837072

Подскажите пожалуйста как установить .inf файл(т.е. как бы правой кнопкой на нём-Установить)? После установки он(.inf) находится в папке с программой и нужно его, я так понимаю запустить из секции [Run], чтоб он установился, а как не знаю.

R.i.m.s.k.y. 16-01-2012 14:32 1837081

МИШАНЧИК, первая же ссылка в яндексе
как-то так ну может с кавыками перемудрил только
Код:

[Run]
Filename: {sys}\rundll32.exe; Parameters: syssetup,SetupInfObjectInstallAction DefaultInstall 128 """{app}\Folder\file.inf"""


МИШАНЧИК 16-01-2012 14:47 1837088

R.i.m.s.k.y., большое спасибо, попробую.

TROY Diamond 16-01-2012 17:37 1837197

Цитата:

Цитата El Sanchez
TROY Diamond, искать надо по значению ключа DisplayName. Пример (ищем Inno Setup QuickStart Pack, чтобы удалить)

Спасибо Вам большое!!!

Подскажите, пожалуйста, а как добавить в этот код несколько вариантов названия приложения:

читать дальше »

Код:

function argv(Param: String): TArrayOfString;
begin
    SetArrayLength(Result, 2);
    case Param[1] of
        '"': begin
            Result[0] := Copy(Param, 2, Pos('.exe', Lowercase(Param))+2);
            Result[1] := RemoveQuotes(Trim(Copy(Param, Length(Result[0])+3, Length(Param))));
        end;
    else
        begin
            Result[0] := Copy(Param, 1, Pos('.exe', Lowercase(Param))+3);
            Result[1] := RemoveQuotes(Trim(Copy(Param, Length(Result[0])+1, Length(Param))));
        end;
    end;
end;


function GetInstalledProgramm(Param: String): Boolean;
var
    Names, cl: TArrayOfString;
    i, ResultCode: Integer;
    DisplayName, UninstallString: String;
begin
    if RegGetSubkeyNames(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall', Names) then for i := 0 to GetArrayLength(Names)-1 do
    begin
        RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + Names[i], 'DisplayName', DisplayName);
        if Pos(Lowercase(Param), Lowercase(DisplayName)) > 0 then
        begin
            Result := True;
            if MsgBox('Программа установки обнаружила уже установленную программу ' + DisplayName + '.'#13#10'Вы желаете предварительно удалить ее?', mbInformation, MB_YESNO) = idYes then
            begin
                if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + Names[i], 'UninstallString', UninstallString) then
                begin
                    cl := argv(UninstallString);
                    if not Exec(cl[0], cl[1], '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
                        MsgBox('Ошибка удаления.'#13#10'' + SysErrorMessage(ResultCode) + '.'#13#10'Вероятно, деинсталлятор был перемещен, удален или переименован.', mbError, MB_OK);
                end;
            end;
            Break;
        end;
    end;
end;


procedure InitializeWizard();
begin
    GetInstalledProgramm('Inno Setup QuickStart Pack');
end;



В Вашем примере ТОЛЬКО ОДИН ВАРИАНТ: "Inno Setup QuickStart Pack", а если приложение будет называться как-нибудь по-другому?

Например, "Inno Setup QuickStart Pack v." или "Inno Setup QuickStart Pack (Сборка такая-то...)" "Inno Setup QuickStart Pack от Васи Пупкина..." и т.п.

Куда и как записать все возможные варианты названия этого приложения?

Мне нужно, чтобы при запуске моего установщика, находилось это же приложение, - если оно было установлено, как чужими, так и моим инсталлятором. КАК БЫ ОНО НЕ НАЗЫВАЛОСЬ (Все варианты названий, я напишу... Вы главное скажите куда и как)!!!

Дайте, кто-нибудь полный скрипт с использованием значения "AppMutex", пожалуйста!

El Sanchez 16-01-2012 22:14 1837419

Цитата:

Цитата TROY Diamond
В Вашем примере ТОЛЬКО ОДИН ВАРИАНТ: "Inno Setup QuickStart Pack", а если приложение будет называться как-нибудь по-другому? »

TROY Diamond, отписал в личке. Здесь добавлю, что вхождение параметра функции в значение ключа DisplayName проверяется в условии Pos(Lowercase(Param), Lowercase(DisplayName)) > 0, так что ваши приведенные примеры найдутся.

Цитата:

Цитата TROY Diamond
Дайте, кто-нибудь полный скрипт с использованием значения "AppMutex", пожалуйста! »

Теория
Практика

wertulll 17-01-2012 05:32 1837596

Ребят подскажите пожалуйста как в этом скрипте поменять цвет прогресбара на цвет по умолчанию тоесть зелёный а не жолтый как сейчас. ДВА вечера на него уже убил но не как не выходит :( очень надо помогите пожалуйста Вот сам скрипт
читать дальше »
#define MyAppName "Deus Ex Human Revolution"
#define NeedSize "7168"
#include "Module\Components.iss"
#include "Module\PlayWith.Texture.iss"


[Setup]
SetupIconFile=1.ico
Diskspanning=yes
AppName=Deus Ex - Human Revolution
AppVerName=Deus Ex - Human Revolution
DefaultDirName={pf}\Deus Ex - Human Revolution
DefaultGroupName=Deus Ex - Human Revolution
DirExistsWarning=no
AppVersion=1.0
OutputBaseFilename=setup
OutputDir=.
VersionInfoCopyright=Me
AppPublisher=Square Enix
WizardImageFile=Files\WizardImage.bmp
WizardSmallImageFile=Files\WizardSmallImage.bmp
UninstallDisplayIcon=1.ico
ShowTasksTreeLines=true

[UninstallDelete]
Type: filesandordirs; Name: {app}


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

[Tasks]
Name: desktopicon; Description: Ñîçäàòü çíà÷îê íà Ðàáî÷åì ñòîëå; GroupDescription: Äîïîëíèòåëüíûå çíà÷êè:
Name: Redist; Description: Äîïîëíèòåëüíîå ïðîãðàììíîå îáåñïå÷åíèå:
Name: Redist\DirectXCheck; Description: Îáíîâèòü Microsoft DirectX; Flags: unchecked
Name: Redist\VCCheck; Description: Óñòàíîâèòü Microsoft Visual C++ Redist; Flags: unchecked


[CustomMessages]
rus.Welcome2=Ïðîãðàììà óñòàíîâèò èãðó {#MyAppName} íà Âàø êîìïüþòåð.%n%nÐåêîìåíäóåòñÿ çàêðûòü àíòèâèðóñíûå ïàêåòû, à òàêæå âñå ïðî÷èå ïðèëîæåíèÿ ïåðåä òåì, êàê ïðîäîëæèòü.
rus.Finished=Èãðà {#MyAppName} óñòàíîâëåíà íà Âàø êîìïüþòåð.%n%nÏðèëîæåíèå ìîæíî çàïóñòèòü ñ ïîìîùüþ ñîîòâåòñòâóþùåãî çíà÷êà.%n%nÍàæìèòå «Çàâåðøèòü», ÷òîáû âûéòè èç ïðîãðàììû óñòàíîâêè.

[Files]
Source: Files\bass.dll; DestDir: {tmp}; Flags: dontcopy
Source: Files\sound.mp3; DestDir: {tmp}; Flags: dontcopy
Source: Files\unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: Files\InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: Files\facompress.dll; DestDir: {tmp}; Flags: dontcopy
Source: Files\Logo.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\papka.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\Finishe.bmp; DestDir: {tmp}; Flags: dontcopy
Source: "Files\sound.mp3"; DestDir: "{tmp}"; Flags: dontcopy noencryption nocompression
Source: "Files\MusicButton.bmp"; DestDir: "{tmp}"; Flags: dontcopy
Source: "Files\bass.dll"; DestDir: "{tmp}"; Flags: dontcopy






[Run]
Filename: {src}\Redist\DirectX\DXSETUP.exe; StatusMsg: Îáíîâëåíèå êîìïîíåíòîâ DirectX...; Tasks: Redist\DirectXCheck; Flags: waituntilterminated; Parameters: "/silent";
Filename: "{src}\Redist\vcredist_x86.exe"; StatusMsg: "Óñòàíîâêà Microsoft Visual C++ Redist..."; Tasks: Redist\VCCheck; Flags: waituntilterminated; Parameters: "/Q";


[Registry]

Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "InstallPath"; ValueType: String; ValueData: "{app}";
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "Version"; ValueType: String; ValueData: "1.0";
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "Language"; ValueType: String; ValueData: "Russian";



[code]
var
WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;
PageNameLabel, PageDescriptionLabel: TLabel;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
end;

procedure Labels();
begin
WelcomeLabel1:= TLabel.Create(WizardForm);
WelcomeLabel1.AutoSize:= False;
with WizardForm.WelcomeLabel1 do
//êîîðäèíàòû WelcomeLabel1
WelcomeLabel1.SetBounds(ScaleX(30), ScaleY(10), ScaleX(200), ScaleY(220));
WelcomeLabel1.Font:= WizardForm.WelcomeLabel1.Font
WelcomeLabel1.Font.Color:= clWhite;
WizardForm.ProgressGauge.State:= npbsPaused;
WelcomeLabel1.Transparent:= True;
WelcomeLabel1.WordWrap:= true;
WelcomeLabel1.Caption:= WizardForm.WelcomeLabel1.Caption;
WelcomeLabel1.Parent:= WizardForm.WelcomePage

WelcomeLabel2:= TLabel.Create(WizardForm);
WelcomeLabel2.AutoSize:= False;
with WizardForm.WelcomeLabel2 do
//êîîðäèíàòû WelcomeLabel2
WelcomeLabel2.SetBounds(ScaleX(30), ScaleY(105), ScaleX(130), ScaleY(220));
WelcomeLabel2.Font:= WizardForm.WelcomeLabel2.Font
WelcomeLabel2.Font.Color:= clWhite;
WelcomeLabel2.Transparent:= True;
WelcomeLabel2.WordWrap:= true;
WelcomeLabel2.Caption:= ExpandConstant('{cm:Welcome2}');
WelcomeLabel2.Caption:= WizardForm.WelcomeLabel2.Caption;
WelcomeLabel2.Parent:= WizardForm.WelcomePage

WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);

PageNameLabel:= TLabel.Create(WizardForm)
with WizardForm.PageNameLabel do
PageNameLabel.SetBounds(Left, Top, Width, Height);
PageNameLabel.Transparent:= True;
PageNameLabel.Font:= WizardForm.PageNameLabel.Font;
PageNameLabel.Font.Color:= clWhite; //öâåò íàäïèñè
PageNameLabel.Parent:= WizardForm.MainPanel;

PageDescriptionLabel:= TLabel.Create(WizardForm)
with WizardForm.PageDescriptionLabel do
PageDescriptionLabel.SetBounds(Left, Top, Width, Height);
PageDescriptionLabel.Transparent:= True;
PageDescriptionLabel.Font:= WizardForm.PageDescriptionLabel.Font;
PageDescriptionLabel.Font.Color:= clWhite; //öâåò íàäïèñè
PageDescriptionLabel.Parent:= WizardForm.MainPanel;

FinishedHeadingLabel:= TLabel.Create(WizardForm);
FinishedHeadingLabel.AutoSize:= False;
with WizardForm.FinishedHeadingLabel do
//êîîðäèíàòû FinishedHeadingLabel
FinishedHeadingLabel.SetBounds(ScaleX(30), ScaleY(20), ScaleX(200), ScaleY(220));
FinishedHeadingLabel.Font:= WizardForm.FinishedHeadingLabel.Font
FinishedHeadingLabel.Font.Color:= clWhite;
FinishedHeadingLabel.Transparent:= True;
FinishedHeadingLabel.WordWrap:= true;
FinishedHeadingLabel.Parent:= WizardForm.FinishedPage

FinishedLabel:= TLabel.Create(WizardForm);
FinishedLabel.AutoSize:= False;
with WizardForm.FinishedLabel do
//êîîðäèíàòû FinishedLabel
FinishedLabel.SetBounds(ScaleX(30), ScaleY(120), ScaleX(130), ScaleY(220));
FinishedLabel.Font:= WizardForm.FinishedLabel.Font
FinishedLabel.Font.Color:= clWhite;
FinishedLabel.Transparent:= True;
FinishedLabel.WordWrap:= true;
FinishedLabel.Parent:= WizardForm.FinishedPage

WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.FilenameLabel.Hide;
WizardForm.StatusLabel.Caption:='Èäåò ðàñïàêîâêà äàííûõ, æäåì...'
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
end;


procedure InitializeWizard();
Begin
LabelSize();
ButtonTextures();
Labels();
music();
ExtractTemporaryFile('Finishe.bmp');
WizardForm.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Finishe.bmp'));
ExtractTemporaryFile('papka.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=true;
WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=true;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
UpdateButtons();
FinishedLabel.Caption:= ExpandConstant('{cm:Finished}');
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
//PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;

FinishedHeadingLabel.Caption:= WizardForm.FinishedHeadingLabel.Caption;

if BASS_ChannelIsActive(mp3Handle) = BASS_ACTIVE_PAUSED then
PlayButton.Show else
PauseButton.Show;

Case CurPageID of
wpWelcome:
begin
PlayButton.Hide;
PauseButton.Hide;
end;

wpSelectDir:
begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
begin
WizardForm.NextButton.Enabled := False;
ButtonLabel[bidNext].Enabled := False;
ButtonPanel[bidNext].Enabled := False;
end;
end;

wpFinished:
begin
PlayButton.Hide;
PauseButton.Hide;
end;
End;
end;


А вот Сomponets.iss к нему

читать дальше »
[CustomMessages]
rus.Space=Äîñòóïíî ìåñòà íà äèñêå:
rus.Space1=Òðåáóåòñÿ ìåñòà íà äèñêå:

[Files]
Source: Files\button2.bmp; DestDir: {tmp}; Flags: dontcopy

[code]
const
ButtonWidth = 80;
ButtonHeight = 23;
Color = clblack;

bidBack = 0;
bidNext = 1;
bidCancel = 2;
bidDirBrowse = 3;
bidGroupBrowse = 4;
bidbtnCancelUnpacking = 5;

var
WizardLabel: TLabel;
ButtonPanel: array of TPanel;
ButtonImage: array of TBitmapImage;
ButtonLabel: array of TLabel;
UsedButtons: array of TButton;
ButtonsCount: Integer;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ NumToStr(round(FreeMB/1024*100)/100) + ' Ãá' else
FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ IntToStr(FreeMB)+ ' Ìá';
if WizardForm.CurPageID = wpSelectDir then begin //×òîá íå áûëî ãëþêîâ íà äðóãèõ ñòðàíèöàõ
if FreeMB < NeedSize then begin
WizardForm.NextButton.Enabled := False;
ButtonPanel[bidNext].Enabled:= False;
ButtonLabel[bidNext].Enabled:= False;
end else begin
WizardForm.NextButton.Enabled := True;
ButtonPanel[bidNext].Enabled:= True;
ButtonLabel[bidNext].Enabled:= True; end;
end;
end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ NumToStr(round(NeedSize/1024*100)/100) + ' Ãá' else
NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ NumToStr(NeedSize)+ ' Ìá';
end;

procedure LabelSize();
begin
NeedSize:= {#NeedSize};
with WizardForm do
begin
DiskSpaceLabel.Hide;end;
////////////////////// SelectDirPage //////////////////////
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;

FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
end;

procedure ButtonLabelClick(Sender: TObject);
var Button: TButton; n, i: Integer;
begin
i:= TLabel(Sender).Tag; ButtonImage[i].Left:= 0
for n:=0 to (ButtonsCount-1) do begin
if i = n then Button:= UsedButtons[n];
end;
Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n, I: Integer;
begin
I:=TLabel(Sender).Tag;
//Ñíà÷àëà âîññòàíàâëèâàåì êàðòèíêó ó âñåõ êíîïîê, òàê íàäî èíà÷å ìîãóò áûòü ãëþêè
for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end;
//Òåïåðü ñîáñòâåííî ñòàâèì íóæíóþ êàðòèíêó
if (ButtonLabel[i].Enabled)and(ButtonImage[i].Left <> -ButtonWidth*2) then begin ButtonImage[i].Left:= -ButtonWidth; end;
end;

procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n: Integer;
begin
//Ò.ê Sender'îì âûñòóïàåò WizardLabel òî íå ïîëó÷èòñÿ èñïëüçîâàòü èíäåêñ êíîïêè
for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end;
end;

procedure LoadButtonImage(AButton: TButton);
var n: Integer;
begin
n:=ButtonsCount; SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1); SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1); UsedButtons[n]:= AButton;

ButtonPanel[n]:=TPanel.Create(WizardForm)
ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height)
ButtonPanel[n].Tag:= n
ButtonPanel[n].Enabled:= AButton.Enabled
ButtonPanel[n].Parent:=AButton.Parent

ButtonImage[n]:=TBitmapImage.Create(WizardForm)
ButtonImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(320), ScaleY(23))
ButtonImage[n].Enabled:=False
ButtonImage[n].Bitmap.LoadFromFile(ExpandConstant('{tmp}\Button2.bmp'))
ButtonImage[n].Parent:=ButtonPanel[n]

with TLabel.Create(WizardForm) do begin
Tag:=n
Parent:=ButtonPanel[n]
Width:=AButton.Width
Height:=AButton.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseMove:=@ButtonLabelMove
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end;

ButtonLabel[n]:=TLabel.Create(WizardForm)
ButtonLabel[n].Autosize:=True
ButtonLabel[n].Alignment:=taCenter
ButtonLabel[n].Tag:=n
ButtonLabel[n].Enabled:= AButton.Enabled
ButtonLabel[n].Transparent:=True
ButtonLabel[n].Font.Color:=clWhite
ButtonLabel[n].Caption:=AButton.Caption
ButtonLabel[n].OnClick:=@ButtonLabelClick
ButtonLabel[n].OnDblClick:=@ButtonLabelClick
ButtonLabel[n].OnMouseMove:=@ButtonLabelMove
ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown
ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp
ButtonLabel[n].Parent:=ButtonPanel[n]

ButtonsCount:= ButtonsCount+1
end;

procedure UpdateButtons();
var n: Integer;
begin
for n:=0 to ButtonsCount-1 do begin
ButtonLabel[n].Caption:=UsedButtons[n].Caption
ButtonPanel[n].Visible:=UsedButtons[n].Visible
if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0;
ButtonLabel[n].Enabled:= UsedButtons[n].Enabled;
ButtonPanel[n].Enabled:= UsedButtons[n].Enabled;
//Ñòàâèì Left è Top ëåéáëà ñîðàçìåðíî ðàçìåðó ëåéáëà
ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
//Äåëàåì êíîïêó àêòèâíîé
WizardForm.NextButton.Enabled:= True;
//Îáíîâëÿåì òåêñòóðèðîâàííóþ êíîïêó (îáíîâëÿåì àêòèâíîñòü è òåêñòóðó)
UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
//Äåëàåì êíîïêó íåàêòèâíîé
WizardForm.NextButton.Enabled:= False;
//Îáíîâëÿåì òåêñòóðèðîâàííóþ êíîïêó (îáíîâëÿåì àêòèâíîñòü è òåêñòóðó)
UpdateButtons()
end;

procedure ButtonTextures();
begin
WizardForm.Font.Color:=clWhite;
WizardForm.Color:=Color;
WizardForm.WelcomePage.Color:=Color;
WizardForm.InnerPage.Color:=Color;
WizardForm.FinishedPage.Color:=Color;
WizardForm.LicensePage.Color:=Color;
WizardForm.PasswordPage.Color:=Color;
WizardForm.InfoBeforePage.Color:=Color;
WizardForm.UserInfoPage.Color:=Color;
WizardForm.SelectDirPage.Color:=Color;
WizardForm.SelectComponentsPage.Color:=Color;
WizardForm.SelectProgramGroupPage.Color:=Color;
WizardForm.SelectTasksPage.Color:=Color;
WizardForm.ReadyPage.Color:=Color;
WizardForm.PreparingPage.Color:=Color;
WizardForm.InstallingPage.Color:=Color;
WizardForm.InfoAfterPage.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.DiskSpaceLabel.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.GroupEdit.Color:=Color;
WizardForm.PasswordLabel.Color:=Color;
WizardForm.PasswordEdit.Color:=Color;
WizardForm.PasswordEditLabel.Color:=Color;
WizardForm.ReadyMemo.Color:=Color;
WizardForm.TypesCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.YesRadio.Color:=Color;
WizardForm.NoRadio.Color:=Color;
WizardForm.WelcomeLabel2.Color:=Color;
WizardForm.LicenseLabel1.Color:=Color;
WizardForm.InfoAfterClickLabel.Color:=Color;
WizardForm.ComponentsList.Color:=Color;
WizardForm.ComponentsDiskSpaceLabel.Color:=Color;
WizardForm.BeveledLabel.Color:=Color;
WizardForm.StatusLabel.Color:=Color;
WizardForm.FilenameLabel.Color:=Color;
WizardForm.SelectDirLabel.Color:=Color;
WizardForm.SelectStartMenuFolderLabel.Color:=Color;
WizardForm.SelectComponentsLabel.Color:=Color;
WizardForm.SelectTasksLabel.Color:=Color;
WizardForm.LicenseAcceptedRadio.Color:=Color;
WizardForm.LicenseNotAcceptedRadio.Color:=Color;
WizardForm.UserInfoNameLabel.Color:=Color;
WizardForm.UserInfoNameEdit.Color:=Color;
WizardForm.UserInfoOrgLabel.Color:=Color;
WizardForm.UserInfoOrgEdit.Color:=Color;
WizardForm.PreparingLabel.Color:=Color;
WizardForm.UserInfoSerialLabel.Color:=Color;
WizardForm.UserInfoSerialEdit.Color:=Color;
WizardForm.TasksList.Color:=Color;
WizardForm.RunList.Color:=Color;
WizardForm.SelectDirBrowseLabel.Color:=Color;
WizardForm.SelectStartMenuFolderBrowseLabel.Color:=Color;

WizardLabel:= TLabel.Create(WizardForm)
WizardLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(WizardForm.Width), ScaleY(WizardForm.Height))
WizardLabel.Transparent:= True;
WizardLabel.AutoSize:=false;
WizardLabel.OnMouseMove:=@WizardLabelMove
WizardLabel.Parent:= WizardForm;

WizardForm.BackButton.Width:= ButtonWidth
WizardForm.BackButton.Height:= ButtonHeight

WizardForm.NextButton.Width:= ButtonWidth
WizardForm.NextButton.Height:= ButtonHeight

WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:= ButtonHeight

WizardForm.DirBrowseButton.Left:=ScaleX(337)
WizardForm.DirBrowseButton.Width:= ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight

WizardForm.GroupBrowseButton.Left:=ScaleX(337)
WizardForm.GroupBrowseButton.Width:= ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick

WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button2.bmp')
LoadButtonImage(WizardForm.BackButton)
LoadButtonImage(WizardForm.NextButton)
LoadButtonImage(WizardForm.CancelButton)
LoadButtonImage(WizardForm.DirBrowseButton)
LoadButtonImage(WizardForm.GroupBrowseButton)
//Ñíà÷àëà òåêñòóðèðóþòñÿ êíîïêè, çàòåì âûïîëíÿåòñÿ ïðîöåäóðà êîòîðóþ ìû ïåðåíåñëè
WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;

nik1967 17-01-2012 11:07 1837715

wertulll, в коде, что ты привёл, нет упоминаний о WizardForm.ProgressGauge (или о каком либо ProgressBar'е). В твоём скрипте есть строка о PlayWith.Texture.iss. Может быть там? А вообще, если прогрессбар дефолтный, то изменить его цвет можно закомментировав строку
Код:

WizardForm.ProgressGauge.State:= npbsPaused;
или изменив её (строку) на
Код:

WizardForm.ProgressGauge.State:= npbsNormal;

wertulll 17-01-2012 11:11 1837720

nik1967, cпасибо за разъеснение вот этот скрипт с файлами http://inno.at.ua/load/utility/game_...s_ex/9-1-0-176

nik1967 17-01-2012 11:20 1837726

wertulll, я оттуда скачать не могу - нет ссылки на скачивание. Просто запости здесь содержание PlayWith.Texture.iss.

wertulll,
Цитата:

Страница не найдена. Если вы уверены, что использовали правильную ссылку, свяжитесь с администрацией

wertulll 17-01-2012 11:24 1837732

вот
читать дальше »
[Files]
Source: Files\BASS.dll; DestDir: {tmp}; Flags: dontcopy noencryption
Source: Files\sound.mp3; DestDir: {tmp}; Flags: dontcopy noencryption nocompression
Source: Files\MusicButton.bmp; DestDir: {tmp}; Flags: dontcopy


[code]
const
BASS_ACTIVE_STOPPED = 0;
BASS_ACTIVE_PLAYING = 1;
BASS_ACTIVE_STALLED = 2;
BASS_ACTIVE_PAUSED = 3;
BASS_SAMPLE_LOOP = 4;

var
mp3Handle: HWND;
mp3Name: String;
PlayButton, PauseButton, StopButton: TPanel;
PlayImage, PauseImage, StopImage: TBitmapImage;
PlayLabel, PauseLabel, StopLabel: TLabel;
MouseLabel: Tlabel;

function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean;
external 'BASS_Init@files:BASS.dll stdcall delayload';

function BASS_StreamCreateFile(mem: BOOL; f: PAnsiChar; offset: DWORD; length: DWORD; flags: DWORD): DWORD;
external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';

function BASS_Start(): Boolean;
external 'BASS_Start@files:BASS.dll stdcall delayload';

function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean;
external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';

function BASS_ChannelIsActive(handle: DWORD): Integer;
external 'BASS_ChannelIsActive@files:BASS.dll stdcall delayload';

function BASS_ChannelPause(handle: DWORD): Boolean;
external 'BASS_ChannelPause@files:BASS.dll stdcall delayload';

function BASS_Stop(): Boolean;
external 'BASS_Stop@files:BASS.dll stdcall delayload';

function BASS_Pause(): Boolean;
external 'BASS_Pause@files:BASS.dll stdcall delayload';

function BASS_Free(): Boolean;
external 'BASS_Free@files:BASS.dll stdcall delayload';

procedure PlayMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PlayImage.Left := -96
end;

procedure PlayMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PlayImage.Left := 0
end;

procedure PlayMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if PlayImage.Left <> -96 then PlayImage.Left := -192 ;
StopImage.Left := -64
end;

procedure PauseMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PauseImage.Left := -128
end;

procedure PauseMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
PauseImage.Left := -32
end;

procedure PauseMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if PauseImage.Left <> -128 then PauseImage.Left := -224;
StopImage.Left := -64
end;

procedure StopMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StopImage.Left := -160
end;

procedure StopMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
StopImage.Left := -64
end;

procedure StopMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
if StopImage.Left <> -160 then StopImage.Left := -256;
PlayImage.Left := 0
PauseImage.Left := -32
end;

procedure MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
PlayImage.Left := 0
PauseImage.Left := -32
StopImage.Left := -64
end;

function InitializeSetup(): Boolean;
begin
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('sound.mp3');
mp3Name := ExpandConstant('{tmp}\sound.mp3');
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PAnsiChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
Result := True;
end;

procedure PlayButtonOnClick(Sender: TObject);
begin
case BASS_ChannelIsActive(mp3Handle) of
BASS_ACTIVE_PAUSED:
begin
BASS_ChannelPlay(mp3Handle, False);
PlayButton.Hide
PauseButton.Show
end;
BASS_ACTIVE_STOPPED:
begin
BASS_Init(-1, 44100, 0, 0, 0);
mp3Handle := BASS_StreamCreateFile(FALSE, PAnsiChar(mp3Name), 0, 0, BASS_SAMPLE_LOOP);
BASS_Start();
BASS_ChannelPlay(mp3Handle, False);
PlayButton.Hide
PauseButton.Show
end;
end;
end;

procedure PauseButtonOnClick(Sender: TObject);
begin
BASS_ChannelPause(mp3Handle);
PauseButton.Hide
PlayButton.Show
end;

procedure StopButtonOnClick(Sender: TObject);
begin
BASS_Stop();
BASS_Free();
PauseButton.Hide
PlayButton.Show
end;

procedure Music();
begin
ExtractTemporaryFile('MusicButton.bmp')

MouseLabel := TLabel.Create(WizardForm)
MouseLabel.Width := WizardForm.Width
MouseLabel.Height := WizardForm.Height
MouseLabel.Autosize := False
MouseLabel.Transparent := True
MouseLabel.OnMouseMove := @MouseMove
MouseLabel.Parent := WizardForm

PlayButton := TPanel.Create(WizardForm)
PlayButton.Left := 465
PlayButton.Top := 64
PlayButton.Width := 23
PlayButton.Height := 23
PlayButton.Cursor := crHand
PlayButton.ShowHint := True
PlayButton.Hint := 'Âîñïðîèçâåäåíèå ìóçûêè'
PlayButton.OnClick := @PlayButtonOnClick
PlayButton.Parent := WizardForm

PlayImage := TBitmapImage.Create(WizardForm)
PlayImage.Left := 0
PlayImage.Top := 0
PlayImage.Width := 288
PlayImage.Height := 23
PlayImage.Enabled := False
PlayImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
PlayImage.Parent := PlayButton
//
PlayImage.ReplaceColor:=$E2E2E2
PlayImage.ReplaceWithColor:=clBtnFace


PlayLabel := TLabel.Create(WizardForm)
PlayLabel.Width := PlayButton.Width
PlayLabel.Height := PlayButton.Height
PlayLabel.Autosize := False
PlayLabel.Transparent := True
PlayLabel.OnClick := @PlayButtonOnClick
PlayLabel.OnMouseDown := @PlayMouseDown
PlayLabel.OnMouseUp := @PlayMouseUp
PlayLabel.OnMouseMove := @PlayMouseMove
PlayLabel.Parent := PlayButton

PauseButton := TPanel.Create(WizardForm)
PauseButton.Left := 465
PauseButton.Top := 64
PauseButton.Width := 23
PauseButton.Height := 23
PauseButton.Cursor := crHand
PauseButton.ShowHint := True
PauseButton.Hint := 'Ïðèîñòàíîâèòü ìóçûêó'
PauseButton.OnClick := @PauseButtonOnClick
PauseButton.Parent := WizardForm

PauseImage := TBitmapImage.Create(WizardForm)
PauseImage.Left := -32
PauseImage.Top := 0
PauseImage.Width := 288
PauseImage.Height := 23
PauseImage.Enabled := False
PauseImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
PauseImage.Parent := PauseButton
//
PauseImage.ReplaceColor:=$E2E2E2
PauseImage.ReplaceWithColor:=clBtnFace

PauseLabel := TLabel.Create(WizardForm)
PauseLabel.Width := PauseButton.Width
PauseLabel.Height := PauseButton.Height
PauseLabel.Autosize := False
PauseLabel.Transparent := True
PauseLabel.OnClick := @PauseButtonOnClick
PauseLabel.OnMouseDown := @PauseMouseDown
PauseLabel.OnMouseUp := @PauseMouseUp
PauseLabel.OnMouseMove := @PauseMouseMove
PauseLabel.Parent := PauseButton

StopButton := TPanel.Create(WizardForm)
StopButton.Left := 82
StopButton.Top := 320
StopButton.Width := 32
StopButton.Height := 33
StopButton.Cursor := crHand
StopButton.ShowHint := True
StopButton.Hint := 'Îñòàíîâèòü ìóçûêó'
StopButton.OnClick := @StopButtonOnClick
StopButton.Parent := WizardForm
StopButton.hide;

StopImage := TBitmapImage.Create(WizardForm)
StopImage.Left := -64
StopImage.Top := 0
StopImage.Width := 288
StopImage.Height := 33
StopImage.Enabled := False
StopImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\MusicButton.bmp'))
StopImage.Parent := StopButton
StopImage.hide;

StopImage.ReplaceColor:=$E2E2E2
StopImage.ReplaceWithColor:=clBtnFace

StopLabel := TLabel.Create(WizardForm)
StopLabel.Width := StopButton.Width
StopLabel.Height := StopButton.Height
StopLabel.Autosize := False
StopLabel.Transparent := True
StopLabel.OnClick := @StopButtonOnClick
StopLabel.OnMouseDown := @StopMouseDown
StopLabel.OnMouseUp := @StopMouseUp
StopLabel.OnMouseMove := @StopMouseMove
StopLabel.Parent := StopButton
StopLabel.hide;
end;

procedure DeinitializeSetup();
begin
BASS_Stop();
BASS_Free();
end;

wertulll 17-01-2012 11:28 1837734

вот архив

nik1967 17-01-2012 11:46 1837746

wertulll, моя невнимательность. Ну как я и писал выше - найди в основном скрипте строку
Код:

WizardForm.ProgressGauge.State:= npbsPaused;
и или закомментируй её, или измени на
Код:

WizardForm.ProgressGauge.State:= npbsNormal;
всё.
или замени на
Код:

WizardForm.ProgressGauge.State:= npbsError;
посмотри, что получиться :)

wertulll 17-01-2012 11:55 1837756

СПАСИБ!!! тебе огромный всё вышло :) это я так понял что цвет можно любой вкатить?

nik1967 17-01-2012 12:15 1837776

Цитата:

Цитата wertulll
это я так понял что цвет можно любой вкатить? »

Нет, ты не правильно понял. По умолчанию Inno использует 3 цвета:
Код:

TNewProgressBarState = (npbsNormal, npbsError, npbsPaused);
названия говорят сами за себя.

TROY Diamond 17-01-2012 19:45 1838237

Как добавить "задание" в "Назначенные задания" - файл .job (Windows\Tasks)?

Gnom_aka_Lexander 17-01-2012 21:04 1838329

Цитата:

Цитата TROY Diamond
Ну как, ну как, сделать так: »

Очень просто. Неужели это у когото может вызывать трудности?
читать дальше »
Код:

AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*Code]
procedure InitializeWizard();
begin
  WizardForm.WizardBitmapImage.Align := alClient;

  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;

  with TLabel.Create(WizardForm) do
  begin
    Parent := WizardForm.WelcomePage;
    Caption := WizardForm.WelcomeLabel2.Caption;
    Font := WizardForm.WelcomeLabel2.Font;
    Font.Color := clWhite;
    WordWrap := True;
    Transparent := True;
    SetBounds(ScaleX(40),ScaleY(79),ScaleX(301),ScaleY(92));
  end;

  with TLabel.Create(WizardForm) do
  begin
    Parent := WizardForm.WelcomePage;
    Caption := WizardForm.WelcomeLabel1.Caption;
    Font := WizardForm.WelcomeLabel1.Font;
    Font.Color := clWhite;
    WordWrap := True;
    Transparent := True;
    SetBounds(ScaleX(40),ScaleY(24),ScaleX(301),ScaleY(35));
  end;
end;


А вообще - неужели трудно почитать справку? ее уже и на русский перевели вполне грамотно, по моему.

TROY Diamond 17-01-2012 21:47 1838364

1. Значение "AppMutex", - дайте, пожалуйста, полный скрипт с его использованием!

Читай справку, типа скажете...

Вот, что это такое и куда вставлять, - я вообще не понял:

CreateMutex(nil, False, 'MyProgramsMutexName');

CreateMutex(NULL, FALSE, "MyProgramsMutexName");

2. "Определение класса приложения", как это как его определить?

Что это:

читать дальше »
Код:

function NextButtonClick(CurPage: Integer): Boolean;
var
sz:Integer;
s:string;
h:Longint;
begin
Result:=True;
If CurPage=1
then
begin
h:=FindWindowByClassName('My-Program-WINDOW');
If h<>0 then
SendMessage(h, 16, 0, 0); //Вот это и есть закрытие программы
end
else
If CurPage=6 then



Как мне название своего приложения записать и куда?

Мне нужно, чтобы если приложение запущено появлялось сообщение "Один экземпляр уже запущен", с предложением его закрыть.

А ещё лучше, чтобы приложение ЗАКРЫВАЛОСЬ САМО - ВООБЩЕ БЕЗ ЗАПРОСА, как при установке, так и при удалении...

TROY Diamond 17-01-2012 22:03 1838385

Цитата:

Цитата Лександер
Очень просто. Неужели это у когото может вызывать трудности?

А как "наоборот" наложить на все, НО КРОМЕ ПЕРВОЙ И ПОСЛЕДНЕЙ? Один вариант: одну и туже картинку, второй на каждую страницу разные...

СПАСИБО! Да, возникают может с остальными вопросами поможете?!

Цитата:

А вообще - неужели трудно почитать справку? ее уже и на русский перевели вполне грамотно, по моему.
Читал... и вообще не понял:

читать дальше »
CreateMutex(nil, False, 'MyProgramsMutexName');

CreateMutex(NULL, FALSE, "MyProgramsMutexName");

И это, что:

Код:

function NextButtonClick(CurPage: Integer): Boolean;
var
sz:Integer;
s:string;
h:Longint;
begin
Result:=True;
If CurPage=1
then
begin
h:=FindWindowByClassName('My-Program-WINDOW');
If h<>0 then
SendMessage(h, 16, 0, 0); //Вот это и есть закрытие программы
end
else
If CurPage=6 then


TROY Diamond 18-01-2012 00:21 1838481

Где взять дополнительные языки: Украинский, белорусский, например?

и почему когда я добавляю множество языков в секцию Lahguages, при установке можно выбрать, только Английский и русский?

olmak 18-01-2012 11:55 1838702

Есть такая задача - перепаковать дистрибутив flylinkdc++(FlylinkDC-x86-r407-build-8559) c тем , чтобы удалить из него ненужный Yandex Bar . Распаковал его c помощью Universal Extractor 1.61 , нашел в папке tmp YandexPackSetup-flylinkdc2-20111031.exe - его удаляем . Но вот проблема , при попытке перекомпилировать (использую Inno Setup v 5.4.2 RUS Portable) ругается Required function or procedure 'Postfix' no found в строке AppName=FlylinkDC++{code:Postfix| }
Ссылок на postfix немало . Что-то внятное по поводу где взять функцию postfix точно подходящую в данном случае в Сети не нашел. Может опытные товарищи будут так добры направить на путь истинный ?

R.i.m.s.k.y. 18-01-2012 12:04 1838707

olmak, Postfix - это процедура из секции Code, она вытаскивается в лучшем случае бинарником
короче никак

XXXler 18-01-2012 12:48 1838745

olmak
Гугл

Код:

function Postfix(Separator: String): String;
 begin
  if Is64BitInstallMode then begin
    Separator := Separator + 'x64';
    Result := Separator;
  end;
 end;
end;


TROY Diamond 18-01-2012 16:41 1838949

Цитата:

Цитата Лександер
Очень просто. Неужели это у кого-то может вызывать трудности?

читать дальше »
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*Code]
procedure InitializeWizard();
begin
WizardForm.WizardBitmapImage.Align := alClient;

WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;

with TLabel.Create(WizardForm) do
begin
Parent := WizardForm.WelcomePage;
Caption := WizardForm.WelcomeLabel2.Caption;
Font := WizardForm.WelcomeLabel2.Font;
Font.Color := clWhite;
WordWrap := True;
Transparent := True;
SetBounds(ScaleX(40),ScaleY(79),ScaleX(301),ScaleY(92));
end;

with TLabel.Create(WizardForm) do
begin
Parent := WizardForm.WelcomePage;
Caption := WizardForm.WelcomeLabel1.Caption;
Font := WizardForm.WelcomeLabel1.Font;
Font.Color := clWhite;
WordWrap := True;
Transparent := True;
SetBounds(ScaleX(40),ScaleY(24),ScaleX(301),ScaleY(35));
end;
end;


А на последней странице?! Там ведь должно быть как "обычно" или же эту картинку надо "подгонять"!

Нужно, чтобы, либо эта же картинка была, либо "обычная" (164x314) А то сплюснуто получилось - используется большая картинка, но подогнана под стандарт.

НАВЕРНОЕ, НАДО, НАОБОРОТ, ЧТОБЫ ОБЫЧНАЯ, "ТАК И БЫЛА", А "БОЛЬШАЯ" - ПОДГРУЖАЛАСЬ, НАПРИМЕР ИЗ TEMP...

Или одну и туже большую, но в начале и в конце и надо учитывать, что в конце всё "по-другому" и "Запустить программу" ещё есть!

Gnom_aka_Lexander 18-01-2012 16:58 1838967

Цитата:

Цитата TROY Diamond
А на последней странице?! Там ведь должно быть как "обычно" или же эту картинку надо "подгонять"! »

Ты сам хоть чего-нибудь делать будешь? Если не видишь, чего в трех строчках написано, брось это дело, ты не хочешь учится. А без желания ничего не получится. программирование не дом - дом можно из кусков наляпать как попало, и пускай стоит. Программу из кусков не наляпаешь, нужно ЧИТАТЬ И ПОНИМАТЬ то. что читаешь.
Делай так-же, как на первой сделано. Для этого есть абсолютно все, что тебе нужно в приведенном коде.

Serega 18-01-2012 20:29 1839110

Цитата:

Цитата Лександер
дом можно из кусков наляпать как попало, и пускай стоит »

Совсем не удачное сравнение... Если как попало, то дом стоять точно не будет ;)

TROY Diamond, по всей видимости вы решили освоить Inno Setup наскоком за несколько дней, но уверяю вас, так у вас ничего не получится.
Начните с простых примеров, сначала без использования секции [Сode], затем разобрав и поняв их, переходите к более сложным примерам...
На данный момент, я так понимаю, у вас в голове каша из-за того, что вы прыгаете с одного на другое, даже не разобравшись как работают предложенные вам варианты.

P.S.
Цитата:

Цитата TROY Diamond
Как добавить "задание" в "Назначенные задания" »

Можно почитать здесь и здесь
Пример с использованием Schtasks.exe
Код:

procedure InitializeWizard();
var
  ResultCode: Integer;
begin
  Exec('schtasks.exe', '/create /sc daily /st 22:00:00 /tn TestMyProg /tr "\"{#CompilerPath}Examples\MyProg.exe"\"',
    ExpandConstant('{sys}'), SW_HIDE, ewNoWait, ResultCode);
end;

Много примеров командной строки Schtasks.exe

Gnom_aka_Lexander 18-01-2012 22:00 1839159

Цитата:

Цитата Serega
Если как попало, то дом стоять точно не будет »

Смотря какими гвоздями все это заколотить. Извиняюсь за оффтоп...

TROY Diamond 18-01-2012 22:24 1839174

Serega

Спасибо хоть кто-то откликнулся, а не пнул. Мне нужно, чтобы при входе пользователя в систему запускалась прога и сворачивалась в трей. Автозапуск...
Может и со СТАРЫМ вопросом поможете - КАК отключить сообщение о нехватке места на ЖД, Вы говорили, что можно как-то автоматом нажать "Да"

...

А читать я читаю, только вопросов ещё больше появляется!

wertulll 19-01-2012 15:09 1839606

ребят может ктонибуть удалить весь ISDone из этого скрипта ? помогите чтото не выходит

Serega 19-01-2012 19:04 1839804

Цитата:

Цитата TROY Diamond
хоть кто-то откликнулся, а не пнул.»

Ну уж вам то грех такое говорить, вам постоянно кто-нибудь подсказывает, но а то, что вы сами не хотите учиться, это уж извините, только ваша вина.
Запомните одну золотую истину, никто ничего за вас делать не будет!
Цитата:

Цитата TROY Diamond
КАК отключить сообщение о нехватке места на ЖД »

Пример для расширенной версии
читать дальше »

Код:

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

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

[Code]
const
  BM_CLICK = $00F5;

function FindWindowEx(Parent, Child: Longint; ClassName, WindowName: PChar): Longint; external 'FindWindowExA@user32.dll stdcall';

var
  tmr: TTimer;

procedure Timer(Sender: TObject);
var
  hWnd: Longint;
begin
  hWnd := FindWindowByWindowName(SetupMessage(msgDiskSpaceWarningTitle)); // ищем сообщение о нехватке места
  if hWnd > 0 then // если нашли
    PostMessage(FindWindowEx(hWnd, 0, 'Button', PChar(SetupMessage(msgButtonYes))), BM_CLICK, 0, 0);  // нажимаем на кнопку
end;

procedure InitializeWizard;
begin
  tmr := TTimer.Create(WizardForm);
  with tmr do
    begin
      Enabled := False;
      Interval := 5;
      OnTimer := @Timer;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  tmr.Enabled := CurPageID = wpSelectDir;
end;


TROY Diamond 19-01-2012 19:56 1839834

Цитата:

Цитата Serega
Ну уж вам то грех такое говорить, вам постоянно кто-нибудь подсказывает, но а то, что вы сами не хотите учиться, это уж извините, только ваша вина.
Запомните одну золотую истину, никто ничего за вас делать не будет!

СПАСИБО ВАМ ОГРОМНОЕ!!! Ну такой я, - трудно мне догнать...

А на обычной версии НЕТ способа...

По поводу "Назначенных заданий", - стал разбираться, столкнулся с проблемой, КАК задачу "вынести галочкой", на страницу "Дополнительные задания" (там же где ярлыки предлагается создать).

Нужно, чтобы если пользователь оставить галочку (по умолчанию она должна стоять), то задача добавится и прога будет загружаться при входе пользователя в систему и сворачиваться в трей...

YURSHAT 20-01-2012 03:54 1840102

Цитата:

Цитата TROY Diamond
А на обычной версии НЕТ способа... »

Есть конечно, используйте InnoCallback.dll.
читать дальше »
Код:

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

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

[Files]
Source: InnoCallback.dll; Flags: dontcopy

[ Code]
type
  TimerProc = procedure(Sender: TObject);

const
  BM_CLICK = $00F5;

function FindWindowEx(Parent, Child: Longint; ClassName, WindowName: PChar): Longint; external 'FindWindowExA@user32.dll stdcall';
function CallbackAddr(Callback: TimerProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer(Sender: TObject);
var
  hWnd: Longint;
begin
  hWnd := FindWindowByWindowName(SetupMessage(msgDiskSpaceWarningTitle)); // ищем сообщение о нехватке места
  if hWnd > 0 then // если нашли
    PostMessage(FindWindowEx(hWnd, 0, 'Button', PChar(SetupMessage(msgButtonYes))), BM_CLICK, 0, 0);  // нажимаем на кнопку
end;

procedure InitializeWizard;
begin
  SetTimer(WizardForm.Handle, 1, 5 {задаём интервал}, CallbackAddr(@Timer, 0));
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then
    KillTimer(WizardForm.Handle, 0);
end;


R.i.m.s.k.y. 20-01-2012 08:44 1840161

Цитата:

Цитата TROY Diamond
хоть кто-то откликнулся, а не пнул »

Хамишь, парниша!

Ты лично мне через ЛС парил моск целую неделю, и не говори, епт, что впустую! Ответы я тебе давал на что знал, просто ты настолько ленивый, что не можешь разобраться даже с Task!
Цитата:

КАК задачу "вынести галочкой", на страницу "Дополнительные задания" (там же где ярлыки предлагается создать)
При этом еще и умудряешься портить скрипты, код и примеры, которые тебе дают в помощь, а потом жалишься "почему не работает", даже не утруждая себя сообщением об ошибке, типа мы помогли - мы и виноваты что не работает!
И после этого ты, блеатЪ, заявляешь хоть кто-то откликнулся, а не пнул




У модераторов прошу прощения.
Можете конечно отправить меня в баню, но вместе с этим вот троллем. Все его сообщения - скрытые оскорбления и сексуальное насилие над моском.

wertulll 20-01-2012 09:18 1840168

да замудрёный скриптец так и не выходит :sorry:

R.i.m.s.k.y. 20-01-2012 09:44 1840176

wertulll, глянул краем уха
если исдоне удалять - там ничего не останется

wertulll 20-01-2012 09:52 1840183

вот и я к томуже мнению пришол
я им просто не пользуюсь мне вид инстала нравится

Gnom_aka_Lexander 20-01-2012 20:55 1840654

Цитата:

Цитата R.i.m.s.k.y.
если исдоне удалять - там ничего не останется »

Цитата:

Цитата wertulll
я им просто не пользуюсь мне вид инстала нравится »

wertulll, с файлами выложи со всеми для работы скрипта нужными, или дай ссылку на ориинал.

wertulll 20-01-2012 21:00 1840656

вот здесь всё http://rghost.ru/24985741

Gnom_aka_Lexander 20-01-2012 21:40 1840689

wertulll, Забирай.
Цитата:

Цитата wertulll
спасибо!!!тебе большое »

Копочка для спасибо есть. Мне нажатия на эту кнопочку - вполне достаточно, в плане благодарности.

wertulll 20-01-2012 21:56 1840701

ну что могу сказать круто!!! :good: 4 человека до тебя сказали что это невозможно :) да и сам не один час над ним медитировал.
спасибо!!!тебе большое

TROY Diamond 20-01-2012 23:11 1840769

R.i.m.s.k.y.

И кто ещё хамит?!

Я ни одного бранного слова, НЕ сказал, тем более в Ваш адрес... За то, что Вы мне помогали Вам отдельное спасибо и я Вам это неоднакратно говорил.

Только Ваше сквернословие - Вас совершенно не красит.

Троль уходит...

sancheolz 21-01-2012 10:48 1840975

искал. но толком не нашел. А вопрос такой возник.
Вот есть флаг comparetimestamp - позволяет сравнить дату создания извлекаемого файла и которого он накрывает. У этого сравнения много недостатков - все написано в справке. А надо бы сравнить даты изменения. Покопавшись немного решил, что можно сравнить даты штатными средствами windows через вызов bat или своей проги какой-нить. И поэтому возникла проблема как "достучаться" до файла в пакете. До файла который уже есть на диске я нашел способ добраться. надо получить только полный путь, указывающий на "реальный" файл ну или хотябы уже сами даты именно этих файлов. А уж как извлечь дату из них, сравнить и выбрать я сам решу. Подскажите хоть что-нибудь.

wertulll 21-01-2012 11:17 1840985

Ребят глянте если не трудно :) вот собрал скрипт из двух скриптов чисто пока один вид фриарк ещё пока не прикручивал
всё работает нармально компилирует . но вот чтото зараза длиный получился может чего лишнего впихнул :) глянте если не трудно
читать дальше »

#define MyAppName "369"
#define NeedSize "7168"


[Setup]
SetupIconFile=1.ico
Diskspanning=yes
AppName=369
AppVerName=369
DefaultDirName={pf}\369
DefaultGroupName=369
DirExistsWarning=no
AppVersion=1.0
OutputBaseFilename=setup
OutputDir=.
VersionInfoCopyright=Me
AppPublisher=Square Enix
WizardImageFile=Files\WizardImage.bmp
WizardSmallImageFile=Files\WizardSmallImage.bmp
UninstallDisplayIcon=1.ico
ShowTasksTreeLines=true

[UninstallDelete]
Type: filesandordirs; Name: {app}


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

[Tasks]
Name: desktopicon; Description: Создать значок на Рабочем столе; GroupDescription: Дополнительные значки:
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить Microsoft DirectX;
Name: Redist\VCCheck; Description: Установить Microsoft Visual C++ Redist;
[Run]
Filename: {src}\Redist\DirectX\DXSETUP.exe; StatusMsg: Обновление компонентов DirectX...; Tasks: Redist\DirectXCheck; Flags: waituntilterminated; Parameters: "/silent";
Filename: "{src}\Redist\vcredist_x86.exe"; StatusMsg: "Установка Microsoft Visual C++ Redist..."; Tasks: Redist\VCCheck; Flags: waituntilterminated; Parameters: "/Q";


[CustomMessages]
rus.Welcome2=Программа установит игру {#MyAppName} на Ваш компьютер.%n%nРекомендуется закрыть антивирусные пакеты, а также все прочие приложения перед тем, как продолжить.
rus.Finished=Игра {#MyAppName} установлена на Ваш компьютер.%n%nПриложение можно запустить с помощью соответствующего значка.%n%nНажмите «Завершить», чтобы выйти из программы установки.

rus.Space=Доступно места на диске:
rus.Space1=Требуется места на диске:



[Files]
Source: Files\button.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\Finishe.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\papka.bmp; DestDir: {tmp}; Flags: dontcopy


[code]
const
ButtonWidth = 80;
ButtonHeight = 23;
Color = clblack;

bidBack = 0;
bidNext = 1;
bidCancel = 2;
bidDirBrowse = 3;
bidGroupBrowse = 4;
bidbtnCancelUnpacking = 5;
var
WizardLabel: TLabel;
ButtonPanel: array of TPanel;
ButtonImage: array of TBitmapImage;
ButtonLabel: array of TLabel;
UsedButtons: array of TButton;
ButtonsCount: Integer;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ NumToStr(round(FreeMB/1024*100)/100) + ' Гб' else
FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ IntToStr(FreeMB)+ ' Мб';
if WizardForm.CurPageID = wpSelectDir then begin //Чтоб не было глюков на других страницах
if FreeMB < NeedSize then begin
WizardForm.NextButton.Enabled := False;
ButtonPanel[bidNext].Enabled:= False;
ButtonLabel[bidNext].Enabled:= False;
end else begin
WizardForm.NextButton.Enabled := True;
ButtonPanel[bidNext].Enabled:= True;
ButtonLabel[bidNext].Enabled:= True; end;
end;
end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ NumToStr(round(NeedSize/1024*100)/100) + ' Гб' else
NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ NumToStr(NeedSize)+ ' Мб';
end;

procedure LabelSize();
begin
NeedSize:= {#NeedSize};
with WizardForm do
begin
DiskSpaceLabel.Hide;end;
////////////////////// SelectDirPage //////////////////////
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;

FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
end;

procedure ButtonLabelClick(Sender: TObject);
var Button: TButton; n, i: Integer;
begin
i:= TLabel(Sender).Tag; ButtonImage[i].Left:= 0
for n:=0 to (ButtonsCount-1) do begin
if i = n then Button:= UsedButtons[n];
end;
Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n, I: Integer;
begin
I:=TLabel(Sender).Tag;
//Сначала восстанавливаем картинку у всех кнопок, так надо иначе могут быть глюки
for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end;
//Теперь собственно ставим нужную картинку
if (ButtonLabel[i].Enabled)and(ButtonImage[i].Left <> -ButtonWidth*2) then begin ButtonImage[i].Left:= -ButtonWidth; end;
end;

procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n: Integer;
begin
//Т.к Sender'ом выступает WizardLabel то не получится испльзовать индекс кнопки
for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end;
end;

procedure LoadButtonImage(AButton: TButton);
var n: Integer;
begin
n:=ButtonsCount; SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1); SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1); UsedButtons[n]:= AButton;

ButtonPanel[n]:=TPanel.Create(WizardForm)
ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height)
ButtonPanel[n].Tag:= n
ButtonPanel[n].Enabled:= AButton.Enabled
ButtonPanel[n].Parent:=AButton.Parent

ButtonImage[n]:=TBitmapImage.Create(WizardForm)
ButtonImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(320), ScaleY(23))
ButtonImage[n].Enabled:=False
ButtonImage[n].Bitmap.LoadFromFile(ExpandConstant('{tmp}\Button.bmp'))
ButtonImage[n].Parent:=ButtonPanel[n]

with TLabel.Create(WizardForm) do begin
Tag:=n
Parent:=ButtonPanel[n]
Width:=AButton.Width
Height:=AButton.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseMove:=@ButtonLabelMove
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end;

ButtonLabel[n]:=TLabel.Create(WizardForm)
ButtonLabel[n].Autosize:=True
ButtonLabel[n].Alignment:=taCenter
ButtonLabel[n].Tag:=n
ButtonLabel[n].Enabled:= AButton.Enabled
ButtonLabel[n].Transparent:=True
ButtonLabel[n].Font.Color:=clWhite
ButtonLabel[n].Caption:=AButton.Caption
ButtonLabel[n].OnClick:=@ButtonLabelClick
ButtonLabel[n].OnDblClick:=@ButtonLabelClick
ButtonLabel[n].OnMouseMove:=@ButtonLabelMove
ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown
ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp
ButtonLabel[n].Parent:=ButtonPanel[n]

ButtonsCount:= ButtonsCount+1
end;

procedure UpdateButtons();
var n: Integer;
begin
for n:=0 to ButtonsCount-1 do begin
ButtonLabel[n].Caption:=UsedButtons[n].Caption
ButtonPanel[n].Visible:=UsedButtons[n].Visible
if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0;
ButtonLabel[n].Enabled:= UsedButtons[n].Enabled;
ButtonPanel[n].Enabled:= UsedButtons[n].Enabled;
//Ставим Left и Top лейбла соразмерно размеру лейбла
ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку активной
WizardForm.NextButton.Enabled:= True;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку неактивной
WizardForm.NextButton.Enabled:= False;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons()
end;

procedure ButtonTextures();
begin
WizardForm.Font.Color:=clWhite;
WizardForm.Color:=Color;
WizardForm.WelcomePage.Color:=Color;
WizardForm.InnerPage.Color:=Color;
WizardForm.FinishedPage.Color:=Color;
WizardForm.LicensePage.Color:=Color;
WizardForm.PasswordPage.Color:=Color;
WizardForm.InfoBeforePage.Color:=Color;
WizardForm.UserInfoPage.Color:=Color;
WizardForm.SelectDirPage.Color:=Color;
WizardForm.SelectComponentsPage.Color:=Color;
WizardForm.SelectProgramGroupPage.Color:=Color;
WizardForm.SelectTasksPage.Color:=Color;
WizardForm.ReadyPage.Color:=Color;
WizardForm.PreparingPage.Color:=Color;
WizardForm.InstallingPage.Color:=Color;
WizardForm.InfoAfterPage.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.DiskSpaceLabel.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.GroupEdit.Color:=Color;
WizardForm.PasswordLabel.Color:=Color;
WizardForm.PasswordEdit.Color:=Color;
WizardForm.PasswordEditLabel.Color:=Color;
WizardForm.ReadyMemo.Color:=Color;
WizardForm.TypesCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.YesRadio.Color:=Color;
WizardForm.NoRadio.Color:=Color;
WizardForm.WelcomeLabel2.Color:=Color;
WizardForm.LicenseLabel1.Color:=Color;
WizardForm.InfoAfterClickLabel.Color:=Color;
WizardForm.ComponentsList.Color:=Color;
WizardForm.ComponentsDiskSpaceLabel.Color:=Color;
WizardForm.BeveledLabel.Color:=Color;
WizardForm.StatusLabel.Color:=Color;
WizardForm.FilenameLabel.Color:=Color;
WizardForm.SelectDirLabel.Color:=Color;
WizardForm.SelectStartMenuFolderLabel.Color:=Color;
WizardForm.SelectComponentsLabel.Color:=Color;
WizardForm.SelectTasksLabel.Color:=Color;
WizardForm.LicenseAcceptedRadio.Color:=Color;
WizardForm.LicenseNotAcceptedRadio.Color:=Color;
WizardForm.UserInfoNameLabel.Color:=Color;
WizardForm.UserInfoNameEdit.Color:=Color;
WizardForm.UserInfoOrgLabel.Color:=Color;
WizardForm.UserInfoOrgEdit.Color:=Color;
WizardForm.PreparingLabel.Color:=Color;
WizardForm.UserInfoSerialLabel.Color:=Color;
WizardForm.UserInfoSerialEdit.Color:=Color;
WizardForm.TasksList.Color:=Color;
WizardForm.RunList.Color:=Color;
WizardForm.SelectDirBrowseLabel.Color:=Color;
WizardForm.SelectStartMenuFolderBrowseLabel.Color:=Color;
WizardForm.Bevel.visible:=True;
WizardForm.BeveledLabel.visible:=True;
WizardForm.Bevel1.visible:=True;

WizardLabel:= TLabel.Create(WizardForm)
WizardLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(WizardForm.Width), ScaleY(WizardForm.Height))
WizardLabel.Transparent:= True;
WizardLabel.AutoSize:=false;
WizardLabel.OnMouseMove:=@WizardLabelMove
WizardLabel.Parent:= WizardForm;

WizardForm.BackButton.Width:= ButtonWidth
WizardForm.BackButton.Height:= ButtonHeight

WizardForm.NextButton.Width:= ButtonWidth
WizardForm.NextButton.Height:= ButtonHeight

WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:= ButtonHeight

WizardForm.DirBrowseButton.Left:=ScaleX(337)
WizardForm.DirBrowseButton.Width:= ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight

WizardForm.GroupBrowseButton.Left:=ScaleX(337)
WizardForm.GroupBrowseButton.Width:= ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick

WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button.bmp')
LoadButtonImage(WizardForm.BackButton)
LoadButtonImage(WizardForm.NextButton)
LoadButtonImage(WizardForm.CancelButton)
LoadButtonImage(WizardForm.DirBrowseButton)
LoadButtonImage(WizardForm.GroupBrowseButton)
//Сначала текстурируются кнопки, затем выполняется процедура которую мы перенесли
WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;

var
WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;
PageNameLabel, PageDescriptionLabel: TLabel;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=True;
end;

procedure Labels();
begin
WelcomeLabel1:= TLabel.Create(WizardForm);
WelcomeLabel1.AutoSize:= False;
with WizardForm.WelcomeLabel1 do
//координаты WelcomeLabel1
WelcomeLabel1.SetBounds(ScaleX(30), ScaleY(10), ScaleX(200), ScaleY(220));
WelcomeLabel1.Font:= WizardForm.WelcomeLabel1.Font
WelcomeLabel1.Font.Color:= clWhite;
WizardForm.ProgressGauge.State:= npbsNormal;
WelcomeLabel1.Transparent:= True;
WelcomeLabel1.WordWrap:= true;
WelcomeLabel1.Caption:= WizardForm.WelcomeLabel1.Caption;
WelcomeLabel1.Parent:= WizardForm.WelcomePage

WelcomeLabel2:= TLabel.Create(WizardForm);
WelcomeLabel2.AutoSize:= False;
with WizardForm.WelcomeLabel2 do
//координаты WelcomeLabel2
WelcomeLabel2.SetBounds(ScaleX(30), ScaleY(105), ScaleX(130), ScaleY(220));
WelcomeLabel2.Font:= WizardForm.WelcomeLabel2.Font
WelcomeLabel2.Font.Color:= clWhite;
WelcomeLabel2.Transparent:= True;
WelcomeLabel2.WordWrap:= true;
WelcomeLabel2.Caption:= ExpandConstant('{cm:Welcome2}');
WelcomeLabel2.Caption:= WizardForm.WelcomeLabel2.Caption;
WelcomeLabel2.Parent:= WizardForm.WelcomePage

WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);

PageNameLabel:= TLabel.Create(WizardForm)
with WizardForm.PageNameLabel do
PageNameLabel.SetBounds(Left, Top, Width, Height);
PageNameLabel.Transparent:= True;
PageNameLabel.Font:= WizardForm.PageNameLabel.Font;
PageNameLabel.Font.Color:= clWhite; //цвет надписи
PageNameLabel.Parent:= WizardForm.MainPanel;

PageDescriptionLabel:= TLabel.Create(WizardForm)
with WizardForm.PageDescriptionLabel do
PageDescriptionLabel.SetBounds(Left, Top, Width, Height);
PageDescriptionLabel.Transparent:= True;
PageDescriptionLabel.Font:= WizardForm.PageDescriptionLabel.Font;
PageDescriptionLabel.Font.Color:= clWhite; //цвет надписи
PageDescriptionLabel.Parent:= WizardForm.MainPanel;

FinishedHeadingLabel:= TLabel.Create(WizardForm);
FinishedHeadingLabel.AutoSize:= False;
with WizardForm.FinishedHeadingLabel do
//координаты FinishedHeadingLabel
FinishedHeadingLabel.SetBounds(ScaleX(30), ScaleY(20), ScaleX(200), ScaleY(220));
FinishedHeadingLabel.Font:= WizardForm.FinishedHeadingLabel.Font
FinishedHeadingLabel.Font.Color:= clWhite;
FinishedHeadingLabel.Transparent:= True;
FinishedHeadingLabel.WordWrap:= true;
FinishedHeadingLabel.Parent:= WizardForm.FinishedPage

FinishedLabel:= TLabel.Create(WizardForm);
FinishedLabel.AutoSize:= False;
with WizardForm.FinishedLabel do
//координаты FinishedLabel
FinishedLabel.SetBounds(ScaleX(30), ScaleY(120), ScaleX(130), ScaleY(220));
FinishedLabel.Font:= WizardForm.FinishedLabel.Font
FinishedLabel.Font.Color:= clWhite;
FinishedLabel.Transparent:= True;
FinishedLabel.WordWrap:= true;
FinishedLabel.Parent:= WizardForm.FinishedPage

WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.FilenameLabel.Hide;
WizardForm.StatusLabel.Caption:='Идет распаковка данных, ждем...'
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
end;


procedure InitializeWizard();
Begin
LabelSize();
ButtonTextures();
Labels();
ExtractTemporaryFile('Finishe.bmp');
WizardForm.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Finishe.bmp'));
ExtractTemporaryFile('papka.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=true;
WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=true;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
UpdateButtons();
FinishedLabel.Caption:= ExpandConstant('{cm:Finished}');
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
//PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;

FinishedHeadingLabel.Caption:= WizardForm.FinishedHeadingLabel.Caption;

end;


да ещё не показывает сколько места займёт после установки в скрипте вроди всё указано?

sergey3695 21-01-2012 15:48 1841114

Цитата:

Цитата wertulll
но вот чтото зараза длиный получился »

Это ты еще длинных не видел, это так себе ....

wertulll 21-01-2012 16:09 1841131

да я к тому что там кроме как для внешнего вида в коде та и нет нечего

R.i.m.s.k.y. 24-01-2012 08:20 1843163

Подскажите, пожалуйста, как в инно задействовать механизм хранения версий библиотек и отката при деинсталляции
Конкретно надо следить за версиями avisynth.dll

Заранее благодарю!

Johny777 24-01-2012 19:33 1843626

хотелось бы реализовать следующее
устанавливаются например 3 компонента из установщика
half life 2
half life 2 episode one
half life 2 episode two
уникальные файлы для каждой игры каждый в свою папку
общие файлы для всех файлов в общую - корневую
например
pf/Orange Box/half life 2/run_hl2.exe
pf/Orange Box/half life 2 ep1/run_hl2_ep1.exe
pf/Orange Box/source 2007 binaries 2.gcf
pf/Orange Box/source models.gcf
итд

логика такая
- Autorun с функцией поиска через реестр узнаёт куда установилась игра (думаю нужно в основном установщике в секции [Setup] задействовать параметр AppId=)
- потом, в директории игры ищет например app/half life 2/run_hl2.exe, и если он есть то появлялась кнопка запустить игру .Eсли его нет то кнопка неактивна или её нет

желательно что бы этот Autorun был бы не частью основного установщика и не было проблемы, что игру удалили вручную, а он предлагает запустить вместо того чтобы установить
в коде для описания компонентов видел функцию поиска файла
может подобная функция и нужна
function IsComponent3:boolean;
var
sz:Integer;
s:string;
begin
Result:=True;
begin
If (FileSearch('manual.txt', ExpandConstant('{src}\main'))='') then
Result:=False
end;
end;

есть уже почти готовый на одну игру
но адаптировать его мне не позволяет незнание паскаля
[Setup]
Код:

SourceDir=.
OutputDir=Setup
AppName=preInstaller
AppVerName=preInstaller
AppVersion=preInstaller
CreateAppDir=false
OutputBaseFilename=preInstaller
DiskSpanning=false

DisableDirPage=true
DisableFinishedPage=true
DisableProgramGroupPage=true
DisableReadyPage=true
Uninstallable=false

[Messages]
SetupAppTitle=AutoRUN

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

[Files]
Source: ISSkin.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: steam.cjstyles; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: 1.bmp; Flags: dontcopy

(Code)
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

function InitializeSetup:boolean;
begin
  ExtractTemporaryFile('steam.cjstyles');
  LoadSkin(ExpandConstant('{tmp}')+'\steam.cjstyles', '');
  Result:=True;
end;

procedure DeinitializeSetup;
begin
  ShowWindow(WizardForm.Handle,0);
  UnloadSkin();
end;
////////////////////////////////////////////////////////////////////////

const
  BM_CLICK    = $00F5;

var
  AutoRun: TSetupForm;
  img1: TBitmapImage;
  PlayButton, InstallButton, SupportButton, ReadmeButton, WebButton, ExitButton, UninstallButton: TButton;
  AppPath,UninsPath: string;
  ResultCode: Integer;
procedure CurPageChanged(CurPageID: Integer);
begin
  If CurPageID=wpWelcome then
  SendMessage(WizardForm.NextButton.Handle, BM_CLICK, 0, 0);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
 Confirm:=False
 Cancel:=True
end;

procedure PlayButtonClick(Sender: TObject);
var
  exe: string;
begin
  exe:='shift.exe';
  if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\se15_is1','Install Dir', AppPath) then
  begin
    Exec(AddBackslash(AppPath) + Exe, '', ExtractFilePath(AddBackslash(AppPath) + Exe), SW_SHOWNORMAL,ewNoWait,ResultCode)
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
  end
end;

procedure InstallButtonClick(Sender: TObject);
var
  CurPageID: Integer;
begin
  Exec(ExpandConstant('{src}\Setup.exe'),'','',SW_SHOW,ewNoWait,ResultCode)
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
end;

procedure SupportButtonClick(Sender: TObject);
begin
  shellexec('open', ExpandConstant('{src}\Game.exe'), '', '',SW_SHOWNORMAL, ewnowait, ResultCode)
end;

procedure ReadmeButtonClick(Sender: TObject);
begin
  ShellExec('open', ExpandConstant('{src}\readme.txt'),'','', SW_SHOW, ewNoWait, ResultCode)
end;

procedure WebButtonClick(Sender: TObject);
begin
  shellexec('open', 'http://localhost', '', '',SW_SHOWNORMAL, ewnowait, ResultCode)
end;

procedure ExitButtonClick(Sender: TObject);
var
  CurPageID: Integer;
begin
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
end;

procedure UninstallButtonClick(Sender: TObject);
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    UninsPath:=RemoveQuotes(UninsPath)
    Exec(UninsPath,'','',SW_SHOWNORMAL,ewNoWait,ResultCode)
    AutoRun.Close;
    PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
  end
end;

procedure CreateAutoRun;
begin
  //AutoRun
  AutoRun := CreateCustomForm;
  with AutoRun do begin
    Left := 498;
    Top := 75;
    Width := 495;
    Height := 340;
    BorderIcons := [];
    BorderStyle:=bsToolWindow //(bsNone, bsSingle, bsSizeable, bsDialog, bsToolWindow, bsSizeToolWin)
    Color := clBtnFace;
    Font.Color := clWindowText;
    Font.Height := -11;
    Font.Name := 'MS Sans Serif';
    Font.Style := [];
    Position := poScreenCenter;
    Caption:='AutoRUN'
  end;
  //img1
  img1 := TBitmapImage.Create(AutoRun);
  ExtractTemporaryFile('1.bmp');
  with img1 do begin
    Parent := AutoRun;
    Left := 0;
    Stretch:= true;
    Top := 0;
    Width := Autorun.Width;
    Height := Autorun.Height;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  end;
  //PlayButton
  PlayButton:= TButton.Create(AutoRun);
  with PlayButton do begin
    Parent := AutoRun;
    Left := 300;
    Top := 110;
    Width := 150;
    Height := 22;
    Caption:= 'Íà÷àòü èãðó';
    Cursor:= crHand;
  // ModalResult:= mrOk;
    OnClick := @PlayButtonClick;
    if not RegQueryStringValue(HKLM, 'SOFTWARE\Game','Install Dir', AppPath) then
  begin
    PlayButton.Enabled := False;
  end;
  end;
  //InstallButton
  InstallButton:= TButton.Create(AutoRun);
  with InstallButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 110;
    Width := 150;
    Height := 22;
    Caption:= 'Óñòàíîâèòü èãðó';
    Cursor:= crHand;
    OnClick := @InstallButtonClick;
  end;
  //SupportButton
  SupportButton:= TButton.Create(AutoRun);
  with SupportButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 140;
    Width := 150;
    Height := 22;
    Caption:= 'Èíôî';
    Cursor:= crHand;
    OnClick := @SupportButtonClick;
  end;
  //ReadmeButton
  ReadmeButton:= TButton.Create(AutoRun);
  with ReadmeButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 170;
    Width := 150;
    Height := 22;
    Caption:= 'Readme';
    Cursor:= crHand;
    OnClick := @ReadmeButtonClick;
  end;
  //WebButton
  WebButton:= TButton.Create(AutoRun);
  with WebButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 200;
    Width := 150;
    Height := 22;
    Caption:= 'Âåá-ñàéò';
    Cursor:= crHand;
    OnClick := @WebButtonClick;
  end;
  //ExitButton
  ExitButton:= TButton.Create(AutoRun);
  with ExitButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 260;
    Width := 150;
    Height := 22;
    Caption:= 'Âûõîä';
    Cursor:= crHand;
    OnClick := @ExitButtonClick;
//    ModalResult:= mrCancel;
  end;
  //UninstallButton
  UninstallButton:= TButton.Create(AutoRun);
  with UninstallButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 230;
    Width := 150;
    Height := 22;
    Caption:= 'Óäàëèòü èãðó';
    Cursor:= crHand;
    OnClick := @UninstallButtonClick;
  end;

  if not RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    InstallButton.Enabled:=true;
    InstallButton.Visible:=true;
    UninstallButton.Enabled:=false;
    UninstallButton.Visible:=false;
  end;
  if RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    InstallButton.Enabled:=false;
    InstallButton.Visible:=false;
    UninstallButton.Enabled:=true;
    UninstallButton.Visible:=true;
  end;

  AutoRun.ShowModal;
end;

procedure InitializeWizard;
begin
  WizardForm.BeveledLabel.Enabled:=True;
  CreateAutoRun;
end;


заранее спасибо за помощь!

El Sanchez 24-01-2012 19:34 1843628

Цитата:

Цитата sancheolz
А надо бы сравнить даты изменения. Покопавшись немного решил, что можно сравнить даты штатными средствами windows через вызов bat или своей проги какой-нить. И поэтому возникла проблема как "достучаться" до файла в пакете. »

sancheolz, это сложная задача, т.к. "достучаться" до файла нужно на этапе препроцессинга (парсить строки секции Files, выдирать значение Source с учетом директивы SourceDir, масок, флагов типа external). Предлагаю функцию, где параметр - дата изменения файла-источника в формате YYYYMMDD. Разумеется, маски недопустимы. Файл будет установлен, если либо его нет в папке назначения, либо он есть, но дата изменения старше.
Код:

[Files]
Source: test.txt; DestDir: {app}; Check: IsLastWriteTimeAttributeChanged('20110127')

[code]
type
    FILETIME = record
        dwLowDateTime, dwHighDateTime: DWORD;
    end;

    WIN32_FILE_ATTRIBUTE_DATA = record
        dwFileAttributes: DWORD;
        ftCreationTime, ftLastAccessTime, ftLastWriteTime: FILETIME;
        nFileSizeHigh, nFileSizeLow: DWORD;
    end;

    SYSTEMTIME = record
        wYear, wMonth, wDayOfWeek, wDay, wHour, wMinute, wSecond, wMilliseconds: WORD;
    end;

function GetFileAttributesEx(lpFileName: String; fInfoLevelId: DWORD; var lpFileInformation: WIN32_FILE_ATTRIBUTE_DATA): BOOL; external 'GetFileAttributesExA@kernel32.dll stdcall';
function FileTimeToSystemTime(const lpFileTime: FILETIME; var lpSystemTime: SYSTEMTIME): BOOL; external 'FileTimeToSystemTime@kernel32.dll stdcall';

function IsLastWriteTimeAttributeChanged(Param: String): Boolean;  //Param have YYYYMMDD format
var
    lpFileInformation: WIN32_FILE_ATTRIBUTE_DATA;
    lpSystemTime: SYSTEMTIME;
begin
    if FileExists(ExpandConstant(CurrentFileName)) then
    begin
        GetFileAttributesEx(ExpandConstant(CurrentFileName), $0, lpFileInformation);
        FileTimeToSystemTime(lpFileInformation.ftLastWriteTime, lpSystemTime);
        Result := Format('%.4d%.2d%.2d', [lpSystemTime.wYear, lpSystemTime.wMonth, lpSystemTime.wDay]) > Param;
    end else Result := True;
end;


spaiders 25-01-2012 05:46 1843948

Всем доброе утро у кого есть такой инсталлятор http://imageshack.us/photo/my-images...11ecfcb9b.jpg/ если есть дайте пожалуйста!

valyok666 25-01-2012 07:31 1843965

spaiders, Его сделать самому не трудно)

spaiders 25-01-2012 07:57 1843971

Цитата:

Цитата valyok666
spaiders, Его сделать самому не трудно) »

Я то не умею делать инсталляторы)) так бы не написал сюда)

valyok666 25-01-2012 11:23 1844074

spaiders, так тебе здесь чисто даром никто писать скрипт не будет....здесь помогают и объясняют

R.i.m.s.k.y. 25-01-2012 11:31 1844077

Цитата:

Цитата valyok666
spaiders, так тебе здесь чисто даром никто писать скрипт не будет »

а тех кто чисто недаром - быстро банят :)

alert30 25-01-2012 18:54 1844363

spaiders, если хочешь такой перепакованные инсталляторские скрипты, как на скрине, пиши в PM, скину.

upd 21:00: Добавлю, что каждый пользователь выкладывает скрины по перепакованных инсталляторов известных RePack групп; то этот супер RePack содержит много скриптов, содержаний и изменений.

sancheolz 25-01-2012 19:57 1844401

El Sanchez, Спасибо огромное! Как же я сам не догадался вызов winAPI сделать, а то еще программистом себя называю. Дату файла из пакета я собираюсь узнать так: в качестве DestDir будет указана %TEMP%, уже от туда с использованием того же вызова winAPI будет извлечена дата, а затем из темпа файл отправится либо в {app} либо в /dev/null)) в соответствии с его актуальностью. Остается уповать на сохранность атрибута даты при всех распаковках\запаковках. Он ведь сохраняется?

El Sanchez 26-01-2012 12:38 1844807

Цитата:

Цитата sancheolz
Дату файла из пакета я собираюсь узнать так: в качестве DestDir будет указана %TEMP%, уже от туда с использованием того же вызова winAPI будет извлечена дата, а затем из темпа файл отправится либо в {app} либо в /dev/null)) в соответствии с его актуальностью »

sancheolz, тогда в лог деинсталлятора запишутся "темповые" файлы и при удалении программы деинсталлятор будет выковыривать их из %TEMP%, а не из {app}, в результате останется программная папка с файлами. В таком случае необходимо в скрипт добавить:
Код:

[UninstallDelete]
Type: filesandordirs; Name: {app}

Цитата:

Цитата sancheolz
Остается уповать на сохранность атрибута даты при всех распаковках\запаковках. Он ведь сохраняется? »

Да, если не использовать флаг touch.

LinkOFF 26-01-2012 16:58 1844989

Добрый день.Не подскажите что нужно сделать в скрипте ISDone чтоб были распакованы указанные файлы из архива FreeArc(Не все, а только один или несколько).Заранее спасибо.

Gnom_aka_Lexander 26-01-2012 17:43 1845021

LinkOFF, Прочитать справку к IsDone. Внимательно!

Johny777 26-01-2012 17:52 1845030

мне никто не поможет немного отредактировть http://forum.oszone.net/post-1843626-672.html ???
Appid=ob
пробовал вписывать свой ключ
if RegQueryStringValue(HKLM64, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ob_is1','Install Dir', AppPath) then
или
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ob_is1','Install Dir', AppPath) then
менял shift.exe на run_hl2.exe
добавлял path + '\half life 2' и Exec(path + '\half life 2\run_hl2.exe'

ничего не видит

мне хотя бы один пример для одной конпи с поиском через реестр, последующим поиском файла и как результат - запуском приложения

El Sanchez 26-01-2012 19:11 1845096

Цитата:

Цитата Johny777
RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\ob_is1','Install Dir', AppPath) »

Johny777, Inno не создает ключ Install Dir, поэтому ничего и не нашлось. Нужно искать InstallLocation. Допустим, что функция RegQueryStringValue вернет в AppPath значение C:\Program Files\Half Life 2 Orange Box\, тогда код может быть таким:
Код:

[Setup]
AppID=ob

[code]
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'InstallLocation', AppPath) then
        Exec(AppPath + '\half life 2\run_hl2.exe', '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);


Johny777 27-01-2012 00:08 1845257

El Sanchez,
спасибо конечно , но к сожалению кнопка серая
сделал так (хотя скорее всего ошибся где-то)
Код:


[Setup]
AppID=ob
AppName=AutoRUN
VersionInfoDescription=AutoRUN
VersionInfoProductName=AutoRUN
AppVerName=AutoRUN
VersionInfoProductVersion=1.0.0.0
VersionInfoVersion=1.0.0.0
VersionInfoCompany=john
VersionInfoCopyright=Copyright © John
CreateAppDir=no
OutputDir=.
OutputBaseFilename=Autorun



procedure PlayButtonClick(Sender: TObject);
var
  exe: string;
begin

  exe:='run_hl2.exe';
  if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'InstallLocation', AppPath) then
  begin
    Exec(AppPath + '\half life 2\run_hl2.exe', '', '', SW_SHOWNORMAL, ewNoWait, ResultCode);
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
  end
end;


по сути кнопка "играть" появляется вместо кнопки "установить"
я её на 100 пикселей влево сдвинул

вот целиком
http://rghost.ru/36146504

El Sanchez 27-01-2012 16:59 1845712

Цитата:

Цитата Johny777
но к сожалению кнопка серая »

Johny777, а я кнопку и не делал, я лишь указал на ошибку поиска исполняемого файла через реестр.
Цитата:

Цитата Johny777
вот целиком
http://rghost.ru/36146504 »

Johny777, аж 71 байт. Пустой, короче :).
В общем, переделал ваш вариант: http://rghost.ru/36156009

leshcat 27-01-2012 19:47 1845819

Подскажите,

Вводится кнопка about:

CancelButton := WizardForm.CancelButton;

AboutButton := TButton.Create(WizardForm);
AboutButton.Left := WizardForm.ClientWidth - CancelButton.Left - CancelButton.Width;
AboutButton.Top := CancelButton.Top;
AboutButton.Width := CancelButton.Width;
AboutButton.Height := CancelButton.Height;
AboutButton.Caption := '&About...';
AboutButton.OnClick := @AboutButtonOnClick;
AboutButton.Parent := WizardForm;

Как сделать так, чтобы она отображалась только на Welcome page?

nik1967 27-01-2012 20:27 1845834

Цитата:

Цитата leshcat
Как сделать так, чтобы она отображалась только на Welcome page? »

Код:

Procedure CurPageChanged(CurPageID: Integer);
Begin
  if CurPageID = 1 then
    AboutButton.Show
  else
    AboutButton.Hide;
end;


Johny777 27-01-2012 23:08 1845954

El Sanchez,
спасибо, что помогаете
заработало

объединить кнопку "установить" и "играть" задумка хорошая,
скажите пожалуйста!
А можно сделать, что бы запускался не run_hl2.exe, а hl2.exe с параметрами
Run_hl2.exe это бывший батник с параметрами, кторый можно использовать, но лучше (если это возможно) сделать как у меня в секции RUN (например Parameters: -steam -game hl2 -appid 220)
по сути будет проверяться наличие одного и того же hl2.exe, но в различных директориях
уже перечитал всю ветку Inno Setup "помощь и советы часть 2", но настолько не продвинулся , что б всё самостоятельно реализовать

(спасибо за картинку :), но Orange Box это внутреннее название. У меня сортировка по версии движков идёт. В реале "Source Engine 15" sp (без тим фортресс))
выкладываю скрипт целиком со всем прилагающимся, если нужно
http://rghost.ru/36163770
http://rghost.ru/36164295
http://rghost.ru/36164749
http://rghost.ru/36165097
http://rghost.ru/36165223
оставил только экзешники и батники - для проверки запуска хватит, но игра не запустится, вылетит с ошибкой нехватки библиотеки

SARATOVSKY 28-01-2012 01:06 1846013

Здравствуйте уважаемые репейкеры! Помогите, пожалуйста, решить слейдующую проблему: У меня оснавные файлы распаковываются freearc-ком в окне inno. FreeArc распаковывается перед inno setup-ом (для того, что-бы секция run выполнялась после фриарка), но из-за этого неработает скрипт со слайд шоу в окне инсталляции(слайды не распаковываются, ведь начинает работу первым FreeArc)! Вопрос- как сделать, что-бы слайды распаковывались сразу после запуска инсталлятора? Вот скрипт:
читать дальше »

Код:

#define TIME_FOR_VIEW 10

[Setup]
AppName=Диверсант
AppVerName=Диверсант
DefaultDirName={pf}\Diversant
DefaultGroupName=Диверсант
OutputBaseFilename=setup
Compression=none
OutputDir=C:\Documents and Settings\Вавиловец\Рабочий стол\Распаковка freearc в окне inno setup

[Files]
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: image_6.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: image_5.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: image_4.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: image_3.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: image_2.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak
Source: image_1.bmp; DestDir: {tmp}; Flags: ignoreversion dontcopy noencryption nocompression solidbreak

[CustomMessages]
rus.ArcBreak=Установка прервана!
rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб
rus.ArcInfo=Архив: %1 из %2
rus.ArcTitle=Распаковка архивов FreeArc
rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1
rus.ArcFail=Распаковка не завершена!
rus.AllProgress=Общий прогресс распаковки: %1%%
rus.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения.
rus.Extracting=Распаковывается: %1
rus.taskbar=%1%%, жди %2
rus.remains=Осталось ждать %1
rus.LongTime=вечно
rus.ending=завершение
rus.hour=часов
rus.min=мин
rus.sec=сек

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

[UninstallDelete]
Name: {app}; Type: filesandordirs
[??Code]
//***************************************** [ Начало - Распаковка архивов FreeArc  ] *********************************************//
const
    Archives = '{src}\*.arc';    // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно

    PM_REMOVE = 1;
    CP_ACP = 0; CP_UTF8 = 65001;
    oneMb = 1048576;

type
#ifdef UNICODE  ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
    #define A "W"
#else
    #define A "A"  ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
    PAnsiChar = PChar;  // Required for Inno Setup 5.3.0 and higher. (требуется для Inno Setup версии 5.3.0 и ниже)
#endif
#if Ver < 84018176
    AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif

    TMyMsg = record
        hwnd: HWND;
        message: UINT;
        wParam: Longint;
        lParam: Longint;
        time: DWORD;
        pt: TPoint;
    end;

    TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
    TArc = record Path: string; OrigSize: Integer; Size: Extended; end;

var
    ExtractFile: TLabel;
    lblExtractFileName: TLabel;
    btnCancelUnpacking: TButton;
    CancelCode, n, UnPackError, StartInstall: Integer;
    Arcs: array of TArc;
    msgError: string;
    lastMb: Integer;
    baseMb: Integer;
    totalUncompressedSize: Integer;            // total uncompressed size of archive data in mb
    LastTimerEvent: DWORD;

Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

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

// Перевод числа в строку с точностью 3 знака (%.3n) с округлением дробной части, если она есть
Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do
        SetLength(Result, Length(Result)-1);
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') 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;

// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировку
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
    nRet : longint;
begin
    SetLength( Result, Length( strSource ) );
    nRet:= OemToChar( strSource, Result );
end;

// Converts ANSI encoded string into UTF-8
// Преобразует строку из ANSI в UTF-8 кодировку
function AnsiToUtf8( strSource: string ): string;
var
    nRet : integer;
    WideCharBuf: string;
    MultiByteBuf: string;
begin
    strSource:= strSource + chr(0);
    SetLength( WideCharBuf, Length( strSource ) * 2 );
    SetLength( MultiByteBuf, Length( strSource ) * 2 );

    nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
    nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

    Result:= MultiByteBuf;
end;

// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
    if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
        CancelCode:= -127;
end;

var origsize: Integer;
// The callback function for getting info about FreeArc archive
function FreeArcInfoCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
begin
    if string(what)='origsize'    then origsize := Mb else
    if string(what)='compsize'    then                else
    if string(what)='total_files' then                else
    Result:= CancelCode;
end;

// Returns decompressed size of files in archive
function ArchiveOrigSize(arcname: string): Integer;
var
    callback: longword;
Begin
    callback:= WrapFreeArcCallback(@FreeArcInfoCallback,4);  //FreeArcInfoCallback has 4 arguments
    CancelCode:= 0;
    AppProcessMessage;
    try
        // Pass the specified arguments to 'unarc.dll'
        Result:= FreeArcExtract (callback, 'l', '--', AnsiToUtf8(arcname), '', '', '', '', '', '', '');
        if CancelCode < 0 then Result:= CancelCode;
        if Result >= 0 then Result:= origsize;
    except
        Result:= -63;  //    ArcFail
    end;
end;

// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
    FSR: TFindRec;
Begin
    Result:= 0;
    if FindFirst(ExpandConstant(dir), FSR) then begin
        try
            repeat
                // Skip everything but the folders
                if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
                n:= GetArrayLength(Arcs);
                // Expand the folder list
                SetArrayLength(Arcs, n +1);
                Arcs[n].Path:= ExtractFilePath(ExpandConstant(dir)) + FSR.Name;
                Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
                Result:= Result + Arcs[n].Size;
                Arcs[n].OrigSize := ArchiveOrigSize(Arcs[n].Path)
                totalUncompressedSize := totalUncompressedSize + Arcs[n].OrigSize
            until not FindNext(FSR);
        finally
            FindClose(FSR);
        end;
    end;
End;

// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
    h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;

// Converts milliseconds to human-readable time
// Конвертирует милисекунды в человеко-читаемое изображение времени
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail                              {hh:mm:ss format} then
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000              {more than hour}  then
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000                {1..60 minutes}  then
        Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
  else Result:= IntToStr(Ticks/1000) +s    {less than one minute}
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
    percents, Remaining: Integer;
    s: String;
begin
    if GetTickCount - LastTimerEvent > 1000 then begin
        // This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
        //  ....
        // End of code executed by timer
        LastTimerEvent := LastTimerEvent+1000;
    end;

    if string(what)='filename' then begin
        // Update FileName label
    end else if (string(what)='write') and (totalUncompressedSize>0) and (Mb>lastMb) then begin
        // Assign to Mb *total* amount of data extracted to the moment from all archives
        lastMb := Mb;
        Mb := baseMb+Mb;

        // Update progress bar
        WizardForm.ProgressGauge.Position:= Mb;

        // Show how much megabytes/archives were processed up to the moment
        percents:= (Mb*1000) div totalUncompressedSize;
        s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalUncompressedSize)]);
        if GetArrayLength(Arcs)>1 then
            s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))])
        ExtractFile.Caption := s

        // Calculate and show current percents
        percents:= (Mb*1000) div totalUncompressedSize;
        s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
        if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalUncompressedSize - Mb)/Mb)) else Remaining:= 0;
        if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
            s:= s + '.  '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
            SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
        end;
        WizardForm.FileNameLabel.Caption := s
    end;
    AppProcessMessage;
    Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
    totalCompressedSize: Extended;
    callback: longword;
    FreeMB, TotalMB: Cardinal;
begin
    // Display 'Extracting FreeArc archive'
    lblExtractFileName.Caption:= '';
    lblExtractFileName.Show;
    ExtractFile.caption:= cm('ArcTitle');
    ExtractFile.Show;
    // Show the 'Cancel unpacking' button and set it as default button
    btnCancelUnpacking.Caption:= WizardForm.CancelButton.Caption;
    btnCancelUnpacking.Show;
    WizardForm.ActiveControl:= btnCancelUnpacking;
    WizardForm.ProgressGauge.Position:= 0;
    // Get the size of all archives
    totalUncompressedSize := 0;
    totalCompressedSize := FindArcs(Archives);
    WizardForm.ProgressGauge.Max:= totalUncompressedSize;
    // Other initializations
    callback:= WrapFreeArcCallback(@FreeArcCallback,4);  //FreeArcCallback has 4 arguments
    StartInstall:= GetTickCount;    {время начала распаковки}
    LastTimerEvent:= GetTickCount;
    baseMb:= 0

    for n:= 0 to GetArrayLength(Arcs) -1 do
    begin
        lastMb := 0
        CancelCode:= 0;
        AppProcessMessage;
        try
            // Pass the specified arguments to 'unarc.dll'
            Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
            if CancelCode < 0 then Result:= CancelCode;
        except
            Result:= -63;  //    ArcFail
        end;
        baseMb:= baseMb+lastMb

        // Error occured
        if Result <> 0 then
        begin
            msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
            GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
            case Result of
                -1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
                    else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
                -127:  msgError:= cm('ArcBreak');    //Cancel button
                -63:    msgError:= cm('ArcFail');
            end;
//          MsgBox(msgError, mbInformation, MB_OK);    //сообщение показывается на странице завершения
            Log(msgError);
            Break;    //прервать цикл распаковки
        end;
    end;
    // Hide labels and button
    WizardForm.FileNameLabel.Caption:= '';
    lblExtractFileName.Hide;
    ExtractFile.Hide;
    btnCancelUnpacking.Hide;
end;

procedure CurStepChanged1(CurStep: TSetupStep);
begin
    if CurStep = ssInstall then
    begin
        UnPackError:= UnPack(Archives)
        if UnPackError = 0 then
            SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
        else
        begin
            // Error occured, uninstall it then
            Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);    //откат установки из-за ошибки unarc.dll
            SetTaskBarTitle(SetupMessage(msgErrorTitle))
            WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
        end;
    end;
end;

//    стандартный способ отката (не нужна CurPageChanged1), но архивы распаковываются до извлечения файлов инсталлятора
//    if CurStep = ssInstall then
//      if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged1(CurPageID: Integer);
Begin
    if (CurPageID = wpFinished) and (UnPackError <> 0) then
    begin // Extraction was unsuccessful (распаковщик вернул ошибку)
        // Show error message
        WizardForm.FinishedLabel.Font.Color:= $0000C0;    // red (красный)
        WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
        WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
    end;
End;

procedure InitializeWizard1();
begin
    with WizardForm.ProgressGauge do
    begin
        // Create a label to show current FileName being extracted
        lblExtractFileName:= TLabel.Create(WizardForm);
        lblExtractFileName.parent:=WizardForm.InstallingPage;
        lblExtractFileName.autosize:=false;
        lblExtractFileName.Width:= Width;
        lblExtractFileName.top:=Top + ScaleY(35);
        lblExtractFileName.Caption:= '';
        lblExtractFileName.Hide;

        // Create a label to show percentage
        ExtractFile:= TLabel.Create(WizardForm);
        ExtractFile.parent:=WizardForm.InstallingPage;
        ExtractFile.autosize:=false;
        ExtractFile.Width:= Width;
        ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
        ExtractFile.caption:= '';
        ExtractFile.Hide;
    end;

    // Create a 'Cancel unpacking' button and hide it for now.
    btnCancelUnpacking:=TButton.create(WizardForm);
    btnCancelUnpacking.Parent:= WizardForm;
    btnCancelUnpacking.SetBounds(WizardForm.CancelButton.Left, WizardForm.CancelButton.top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
    btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
    btnCancelUnpacking.Hide;
end;
//***************************************** [ Конец - Распаковка архивов FreeArc] *********************************************//

//***************************************** [ Начало - Слай шоу в окне инсталляции] *********************************************//
const
m=6; //количество слайдов
type
TProc = procedure(HandleW, msg, idEvent, TimeSys: LongWord);
TRandNumbers = array[1..M] of byte;

function WrapTimerProc(callback:TProc; paramcount:integer):longword;
external 'wrapcallback@files:InnoCallback.dll stdcall';

function SetTimer(hWnd: LongWord; nIDEvent, uElapse: LongWord; lpTimerFunc: LongWord): LongWord;
external 'SetTimer@user32.dll stdcall';

function KillTimer(hWnd: LongWord; nIDEvent: LongWord): LongWord;
external 'KillTimer@user32.dll stdcall';

function get_unique_random_number(X:byte):TRandNumbers;
var
A,b,c: string;
i,j,k:byte;
begin
 For i:=1 to X do A:=A+chr(i);
 B:='';
 For i:=1 to X do begin
  j:=Random(Length(A)-1)+1;
  C:='';
  B:=B + A[j];
  for k:=1 to Length(A) do
  if k<>j then C:=C+A[k];
  A:=C;
 end;
 for i:=1 to X do Result[i]:=ord(B[i]);
end;

var
TimerID: LongWord;
currTime: Integer;
SplashImage: TBitmapImage;
StatusMessages: TNewStaticText;
bmp: TRandNumbers;
z:byte;

procedure OnTimer(HandleW, msg, idEvent, TimeSys: LongWord);
begin
currTime := currTime + 1;
if (currTime mod {#TIME_FOR_VIEW} = 0)
 then begin
  SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[currTime/{#TIME_FOR_VIEW}])+'.bmp'));
  if (currTime/{#TIME_FOR_VIEW} = M) then currTime:=0;
 end;
end;


procedure InitializeWizard2;
begin
bmp:=get_unique_random_number(M);
ExtractTemporaryFile('Image_'+inttostr(bmp[1])+'.bmp');

currTime := 0;

WizardForm.ProgressGauge.Parent := WizardForm;
WizardForm.ProgressGauge.Top := WizardForm.CancelButton.Top + ScaleY(12);
WizardForm.ProgressGauge.Left := ScaleX(10);
WizardForm.ProgressGauge.Width := WizardForm.MainPanel.Width - ScaleX(20);
WizardForm.ProgressGauge.Height := 16;
WizardForm.ProgressGauge.Hide;

WizardForm.StatusLabel.Parent := WizardForm;
WizardForm.StatusLabel.Top := WizardForm.ProgressGauge.Top - ScaleY(18);
WizardForm.StatusLabel.Left := ScaleX(10);
WizardForm.StatusLabel.Width := ScaleX(397);
WizardForm.StatusLabel.Hide;

SplashImage := TBitmapImage.Create(WizardForm);
SplashImage.Top := 0;
SplashImage.Left := 0;
SplashImage.Width := WizardForm.MainPanel.Width;
SplashImage.Height := WizardForm.Bevel.Top;
SplashImage.Parent := WizardForm.InnerPage;
SplashImage.Stretch := True;
SplashImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image_'+inttostr(bmp[1])+'.bmp'));
SplashImage.Hide;
end;

procedure CurStepChanged2(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов ...';
for z:=2 to M do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp');
end;
end;

procedure CurPageChanged2(CurPageID: Integer);
var
pfunc: LongWord;
begin
if (CurPageID = wpInstalling) then
begin
pfunc := WrapTimerProc(@OnTimer, 5);
TimerID := SetTimer(0, 0, 1000, pfunc);
WizardForm.PageNameLabel.Visible := False;
WizardForm.PageDescriptionLabel.Visible := False;
WizardForm.InnerNotebook.Hide;
WizardForm.Bevel1.Hide;
WizardForm.MainPanel.Hide;
WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.ProgressGauge.Show;
WizardForm.StatusLabel.Show;
SplashImage.Show;
WizardForm.CancelButton.Enabled := False;
end else
begin
WizardForm.ProgressGauge.Hide;
SplashImage.Hide;
WizardForm.FileNameLabel.Hide;
WizardForm.StatusLabel.Hide;
if (CurPageID > wpInstalling) and (CurPageID < wpFinished) then
begin
WizardForm.InnerNotebook.Show;
WizardForm.Bevel1.Show;
WizardForm.MainPanel.Show;
WizardForm.PageNameLabel.Show;
WizardForm.PageDescriptionLabel.Show;
end;
If CurPageID = wpFinished then
end;
end;

procedure DeInitializeSetup();
begin
KillTimer(0, TimerID);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  CurStepChanged1(CurStep);
  CurStepChanged2(CurStep);
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  CurPageChanged1(CurPageID);
  CurPageChanged2(CurPageID);
end;

procedure InitializeWizard();
begin
  InitializeWizard1();
  InitializeWizard2();
end;
//***************************************** [ Конец - Слай шоу в окне инсталляции] *********************************************//


Заранее спасибо!!! :(

Модератор: Пользуйтесь тэгами hide и code. В следующий раз горчичник за такие простыни...

leshcat 28-01-2012 02:47 1846028

nik1967,

Говорит, что переменная неизвестна, но она описана:

AboutButton, CancelButton: TButton;

?

nik1967 28-01-2012 11:32 1846101

leshcat, ну, как бы это не мой косяк. Работает всё отлично. Да и азы это. ничего сложного.
читать дальше »
Код:

[Setup]
AppName=Приложение
AppVerName=Приложение
DefaultDirName={pf}\Приложение
DirExistsWarning=no

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

[_Code]
var
  AboutButton, CancelButton: TButton;

procedure InitializeWizard;
begin
    CancelButton:= WizardForm.CancelButton;
    AboutButton:= TButton.Create(WizardForm);
  with AboutButton do begin
    SetBounds(WizardForm.ClientWidth-CancelButton.Left-CancelButton.Width,CancelButton.Top,CancelButton.Width,CancelButton.Height);
    Caption:= '&About...';
    //OnClick:= @AboutButtonOnClick;
    Parent:= WizardForm;
  end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  if CurPageID = 1 then
    AboutButton.Show
  else
    AboutButton.Hide;
end;




Скорее всего переменная описана в какой то конкретной процедуре. Вынеси описание под [_Code]

Johny777 28-01-2012 11:56 1846119

SARATOVSKY,
если нужно распаковать картинки первыми, то напиши их первыми в секции файлов, а потом уже саму unarc.dll и CallBack.dll
файлы в секции файлов распаковываются сверху вних
тоже самое относится и скеции RUN
попробуй

leshcat 28-01-2012 12:37 1846140

nik1967,

Да, спасибо, вы правы, описание было внутри процедуры, я ступил.

Devils Night 28-01-2012 15:37 1846258

Кто нибудь подскажет, как обойти UAC на W7? Мне товарищ сказал что можно, у него для этого DLL-ка валяется, но под неё скрипт надо писать, на всякий пожарный её прикрепил, мож кто ладу даст.
Без этого изврата всяких там дллок можно как то обойтись?

Цитата:

Цитата olmak
Есть такая задача - перепаковать дистрибутив flylinkdc++(FlylinkDC-x86-r407-build-8559) »

по моему в Скрипты Inno Setup. Помощь и советы [часть 3] был готовый скрипт, там можешь поискать, точно помню он был, сам скачивал, выложить не могу к сожалению, искать очень долго придётся.

флуд по теме
Цитата:

Цитата Лександер
ты не хочешь учится. »

Ну, Лександер, не все же мы такие вумные, я сам справку не понял, вот иногда приходятся догонять методом тыка, к примеру никак не мог догнать как совмещаются скрипты с одинаковыми процедурами что бы не выскакивало это сообщение, типа dublicate xxx, и приходилось, да и сейчас приходится в конце скрипта дописывать что то вроде
Код:

procedure InitializeWizard();
begin
  InitializeWizard1();
  InitializeWizard2();

я и не думал что их вообще возможно совмещать, кое что допёрло тогда, когда начал юзать редактор форм, по тихоньку добавляя что либо, допустим какие нибудь там кнопочки, сделал одну кнопку для одного скрипта, вторую для другого скрипта, потом хотелось видеть их в третьем скрипте, через редактор форм я добавил эти 2 кнопки, когда сравнил три скрипта, вот только тогда и увидел как совмещается, но и то в общих чертах.
А
Код:

procedure InitializeWizard();
begin
  InitializeWizard1();
  InitializeWizard2();

, приходится использовать потому, что выскакивает уже совсем другая ошибка, не dublicate.

Цитата:

Цитата Лександер
А без желания ничего не получится. »

Да тут и с желанием, любой интерес пропадёт.
Цитата:

Цитата Лександер
Программу из кусков не наляпаешь, нужно ЧИТАТЬ И ПОНИМАТЬ то. что читаешь. »

Конечно поймёшь, как же, когда всё рассказывается на своём программерском языке, а не так как может понять юзер. А бывает и как то само доходит, от святого духа и без всяких там справок.
Цитата:

Цитата Лександер
дом можно из кусков наляпать как попало »

Ну ты конечно и загнул. Какой же это дом :lol:? Это сарай а не дом, даже скорее будка для собаки, хотя я даже и собаке такого не пожелал бы.


Цитата:

Цитата Devils Night
как совмещаются скрипты с одинаковыми процедурами »

Это позже буду обсуждать, и думаю это затянется на долго, поскольку оно не сразу доходит, объясняется тем что понимаешь одно, а говориться совсем о другом, т.е у каждого своя формулировка понятия того о чём обсуждается, так что если будет всё слишком нудно, то не обессудьте, честно, очень хочется понять о чём говориться, а на половину пройденного пути не хотелось бы всё забрасывать, потом опять начинать тему, потом опять забросить, и так по сто раз одно и тоже, этоже ведь не дело.

UAC.rar

El Sanchez 28-01-2012 20:15 1846419

Цитата:

Цитата Johny777
А можно сделать, что бы запускался не run_hl2.exe, а hl2.exe с параметрами »

Johny777, версия авторана №2 http://rghost.ru/36181331

LinkOFF 28-01-2012 20:56 1846448

Цитата:

Цитата Лександер
LinkOFF, Прочитать справку к IsDone. Внимательно! »

Ну нету там!мне ведь что нужно:Есть freearc-архив data.arc, в нем 2 папки rus и eng и как сделать чтоб распаковалась только ОДНА папка или файл из них.
И не могли бы мне помочь с распаковкой архивов в зависимости от выбранных компонентов. Все перепробовал, но ничего не получается.Заранее спасибо!

N00bak 28-01-2012 23:21 1846615

подскажите пожалуйста как изменить вид страницы компонентов чтобы я мог сам сделать шрифт написаного там и расположение

Цитата:

Цитата LinkOFF
Ну нету там!мне ведь что нужно:Есть freearc-архив data.arc, в нем 2 папки rus и eng и как сделать чтоб распаковалась только ОДНА папка или файл из них.
И не могли бы мне помочь с распаковкой архивов в зависимости от выбранных компонентов. Все перепробовал, но ничего не получается.Заранее спасибо! »

if not ISArcExtract ( 1, 0, ExpandConstant('{app}\rus.bin'), ExpandConstant('{app}'), '', true, '', '', ExpandConstant('{app}'), notPCFonFLY) then break;
где 1 это номер компонента по разным арк архивам расфасуй руский в отдельный архив английский в отдельный и все.true замени на false чтоб архив после распаковки не стирало.
я так обхожусь все работает как часы если нужен реестр то так
Components:text\rus; Root: HKCU; SubKey: Software\Valve\Steam; ValueType: string; ValueName: Language; ValueData: russian; Flags: uninsdeletevalue uninsdeletekeyifempty

nik1967 29-01-2012 16:10 1846920

LinkOFF,
Код:

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.arc'), ExpandConstant('{app}'), 'rus', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

N00bak 29-01-2012 17:39 1846980

Цитата:

Цитата nik1967
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.arc'), ExpandConstant('{app}'), 'rus', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break; »

надо немер компонента ставить вместо первого 0

N00bak 29-01-2012 18:14 1847007

подскажите пожалуйста как изменить вид страницы компонентов чтобы я мог сам сделать шрифт написаного там и расположение

Johny777 30-01-2012 02:14 1847333

N00bak,
вот код меняющий весь шрифт на той или иной странице
читать дальше »

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,
procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpInfoBefore then WizardForm.Font.Name:= 'Verdana'; /// страница пролога
if CurPageID = wpLicense then WizardForm.Font.Name:= 'Verdana'; /// страница лицензии
end;
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,

id страниц
читать дальше »

CurPageChanged: CurPageID = wpWelcome Приветствие
CurPageChanged: CurPageID = wpLicense Лицензионное соглашение
CurPageChanged: CurPageID = wpPassword Пароль
CurPageChanged: CurPageID = wpInfoBefore Информация перед установкой
CurPageChanged: CurPageID = wpUserInfo Информация о пользователе
CurPageChanged: CurPageID = wpSelectDir Выбор папки для установки
CurPageChanged: CurPageID = wpSelectComponents Выбор компонентов (типов)
CurPageChanged: CurPageID = wpSelectProgramGroup Выбор группы меню "Пуск"
CurPageChanged: CurPageID = wpSelectTasks Выбор дополнительных задач
CurPageChanged: CurPageID = wpReady Готовность к установке (Сводная информация)
CurPageChanged: CurPageID = wpPreparing Отображение процесса подготовки к установке
CurPageChanged: CurPageID = wpInstalling Отображение процесса установки

для изменения шрифта определённых лейблов, их расположения и размера на странице, ровно как и размера самой страницы рекомендую воспользоваться расширенной версией Inno от Restools (легко и удобно через GUI во вкладке "Редактор форм"), скачать который можно здесь http://forum.oszone.net/showthread.p...99#post1201499 или здесь http://innoultra.ru/

если нужно сделать одну из страниц уникальной (или все разные ), то это можно сделать по примеру кода "Прогрессбар в маленьком окне В левом нижнем углу"
http://forum.ru-board.com/topic.cgi?...&limit=1&m=1#1
также тебе пригодятся "компоненты основных страниц" http://forum.oszone.net/post-1096943-634.html из шапки темы


El Sanchez,
спасибо за автозапуск версии 2
работает отлично и всплывающее меню даже лучше и удобнее четырёх отдельных кнопок

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,

подскажите пожалуйста как объединить два кода!
знаний паскаля нет, а логики дальше не хватает
для компонентов у меня есть панель с описанием (так называемый "CompDescText")
вот оригинал и он же у меня в скрипте (только с константами описаний)
http://rghost.ru/36219751

я его изменил для страницы задач и он тоже работает
http://rghost.ru/36219742

вернее работал, пока я не начал их соединять

в моём скрипте уже есть описание компонетов
теперь хотел добавить описания и задач на станице задач
сделал так (чёрным те места, которые я поменял и вставил)

читать дальше »

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[_Code]

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

var
Info, Info2: TNewStaticText;
InfoCaption, InfoCaption2: TNewStaticText;
InfoPanel, InfoPanel2: TPanel;

procedure InitializeWizard;

begin
InfoPanel2 := TPanel.Create(WizardForm);
InfoPanel2.Parent := WizardForm.SelectTasksPage;
InfoPanel2.Caption := '';
InfoPanel2.Top := WizardForm.TasksList.Top;
InfoPanel2.Left := ScaleX(216);
InfoPanel2.Width := ScaleX(200);
InfoPanel2.Height := WizardForm.TasksList.Height;
InfoPanel2.BevelInner := bvRaised;
InfoPanel2.BevelOuter := bvLowered;
InfoCaption2 := TNewStaticText.Create(WizardForm);
InfoCaption2.Parent := WizardForm.SelectTasksPage;
InfoCaption2.Caption := 'Информация:';
InfoCaption2.Left := ScaleX(224);
InfoCaption2.Top := InfoPanel.Top - ScaleY(5);
InfoCaption2.Font.Color := clActiveCaption;
Info2 := TNewStaticText.Create(WizardForm);
Info2.Parent := InfoPanel;
Info2.AutoSize := False;
Info2.Left := ScaleX(6);
Info2.Width := ScaleX(188);
Info2.Top := ScaleY(12);
Info2.Height := WizardForm.TasksList.Height - ScaleY(18);
Info2.Caption := 'Наведите на компонент, чтобы получить дополнительную информацию';
Info2.WordWrap := true;


InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := ScaleY(477);
InfoPanel.Left := ScaleX(0);
InfoPanel.Width := ScaleX(382);
InfoPanel.Height := ScaleY(72);
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 := clWhite;

Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(10);
Info.Width := ScaleX(370);
Info.Top := ScaleY(10);
Info.Height := ScaleY(60);
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};')+
ExpandConstant('{cm:ComponentsDescription7};')+
ExpandConstant('{cm:ComponentsDescription8};')+
ExpandConstant('{cm:ComponentsDescription9};')+
ExpandConstant('{cm:ComponentsDescription10};')+
ExpandConstant('{cm:ComponentsDescription11};')+
ExpandConstant('{cm:ComponentsDescription12};')+
ExpandConstant('{cm:ComponentsDescription13};')+
ExpandConstant('{cm:ComponentsDescription14};')+
ExpandConstant('{cm:ComponentsDescription15};')+
ExpandConstant('{cm:ComponentsDescription16};')+
ExpandConstant('{cm:ComponentsDescription17};')+
ExpandConstant('{cm:ComponentsDescription18};')+
ExpandConstant('{cm:ComponentsDescription19};')+
ExpandConstant('{cm:ComponentsDescription20};')+
ExpandConstant('{cm:ComponentsDescription21};')+
ExpandConstant('{cm:ComponentsDescription22};')
enabledesc(WizardForm.TasksList.Handle,Info.Handle, ------------------- Здесь ошибка Comma `,` Expected (не знаю как объединить эту строчку и описания задач с их аналогами для компонентов)
'Короткое описание игры;'+ ///// описания задач начало
'Дополнительная документация, на разных языках;'+
'Техт игры;'+
'Официальный английский текст от EA Games;'+
'Официальный немецкий текст от неизвестного производителя;'+
'Пиратский китайский текст;'+
'Официальный русский текст от софтклаб;'+
'Озвучка игры;'+
'Официальная английская озвучка от EA Games;'+
'Официальная немецкая озвучка от неизвестного производителя;'+
'Пиратская китайская озвучка;'+
'Официальная русская озвучка от софтклаб;'+
'Русская озвучка от 7Wolf;'+
'Русская озвучка от фаргуса;'

);
end.



Script Joiner не помогает

Gnom_aka_Lexander 30-01-2012 10:56 1847437

Цитата:

Цитата Johny777
Script Joiner не помогает »

Script Joiner помогает! В папке с установленным Script Joiner есть папка с примерами того, КАК нужно подготовить скрипт, и тогда все просто великолепно объединяется и работает. Тут я постарался максимально понятно описать, как с помощью этой утилиты объединять скрипты. Специально для тех, кто считает, что справки пишут для лохов, а реальным пацанам она ни к чему.

lmiol 30-01-2012 13:13 1847528

доброго времени суток, у меня проблема, как сделать так как на картинке??? (картинку оформлял я http://i29.fastpic.ru/big/2012/0130/...3500a70a12.jpg )

смысл заключается в том что у пользователя перед компонентами вылетает выбор режима установки для Standart пользователя и для Premium пользователя
Для обоих вариантов вылетает список компонентов которые он не может выбрать (но может увидеть что они устанавливаются) и те которые может выбрать
Они идентичны только в разделе Premium устанавливается еще одна строчка

вот ниже код который я использовал для написания такого скрипта но не знаю как дальше писать
читать дальше »

[code]
[Setup]
AppName=Quake Live
AppVerName="Quake Live"
AppPublisher=Mio Dark Project
CreateAppDir=no
DefaultGroupName=Mio Dark Project\Quake Live
AllowNoIcons=yes
OutputDir=Output
OutputBaseFilename=Quake Live
SetupIconFile=setup.ico
Compression=lzma/ultra
SolidCompression=yes
ShowTasksTreeLines=yes
DisableProgramGroupPage=yes
WizardImageFile=Big.bmp
WizardSmallImageFile=Small.bmp
UninstallDisplayIcon={app}\Uninstall\uninstall.ico
UninstallFilesDir={app}\Uninstall
WizardImageStretch=no
AlwaysShowComponentsList=no

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

[Types]
Name: "full"; Description: "Все компоненты";
Name: "custom"; Description: "Выбрать компоненты"; Flags: iscustom

[Components]
Name: "main"; Description: "Cтандартные файлы Quake Live"; Types: full custom; Flags: fixed
Name: "main2"; Description: "Премиум файлы Quake Live"; Types: full custom; Flags: fixed
Name: "plug"; Description: "Плагин Quake Live"; Types: full custom
Name: "browser"; Description: "Портативный Firefox под Quake Live"; Types: full custom
Name: "manual"; Description: "Руководство и Награды"; Types: full custom
Name: "anti"; Description: "Античит PunkBuster"; Types: full custom

[CustomMessages]
HeaderLabelPage=Выберите тип вашего аккаунта
MyRadioCaption_1=Standart
MyRadioCaption_2=Premium / Pro
PageTextHeader=На этой странице Вы можете выбрать тип вашего аккаунта, который вы используете в игре.
MyText_1=Будут установлены файлы которые доступны для игроков без подписки.
MyText_2=Будут установлены файлы которые доступны для игроков с Premium/Pro подпиской.


[Tasks]
Name: "desktopicon"; Description: "Создать ярлык на Рабочем Столе"; GroupDescription: "{cm:AdditionalIcons}"

[Files]
;source: "uninstall.ico"; Components: main; DestDir: "{code:DetectWindows}\uninstall"; Flags: ignoreversion
;Source: "usercur\*"; Components: main; DestDir: "{code:DetectWindows}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
;Source: "usercur2\*"; Components: manual; DestDir: "{code:DetectWindows}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
;Source: "programfiles\*"; Components: browser; DestDir: "{pf}\"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
Source: "pk31\*"; Components: main; DestDir: "{code:DetectWindows}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension nocompression
;Source: "pbsvc.exe" ;Components: anti;DestDir: "{tmp}"; Flags: ignoreversion
;Source: "QuakeLiveNP_433.msi" ;Components: plug;DestDir: "{tmp}"; Flags: ignoreversion

Код:

var
  MyNewPage: TWizardPage;
  Rect: TRect;
  HIcon: LongInt;
  AIconFileName: String;
  MyRadioBtn_1, MyRadioBtn_2: TNewRadioButton;

procedure GetInstTypePage();
begin
  MyNewPage := CreateCustomPage(wpWelcome,
    ExpandConstant('{cm:HeaderLabelPage}'), '');



  with TNewStaticText.Create(WizardForm) do
  begin
    Width := WizardForm.InnerNotebook.Width;
    Height := ScaleY(26);
    WordWrap := True;
    Caption := ExpandConstant('{cm:PageTextHeader}');
    Parent := MyNewPage.Surface;
  end;

  MyRadioBtn_1 := TNewRadioButton.Create(WizardForm);
  with MyRadioBtn_1 do
  begin
    Top := ScaleY(50);
    Width := ScaleX(150);
    Caption := ExpandConstant('{cm:MyRadioCaption_1}');
    Checked := True;
    Parent := MyNewPage.Surface;
  end;

  with TNewStaticText.Create(WizardForm) do
  begin
    Left := ScaleX(16);
    Top := ScaleY(68);
    Width := WizardForm.InnerNotebook.Width - ScaleX(60);
    Height := ScaleY(26);
    WordWrap := True;
    Caption := ExpandConstant('{cm:MyText_1}');
    Parent := MyNewPage.Surface;
  end;

  MyRadioBtn_2 := TNewRadioButton.Create(WizardForm);
  with MyRadioBtn_2 do
  begin
    Top := ScaleY(120);
    Width := ScaleX(150);
    Caption := ExpandConstant('{cm:MyRadioCaption_2}');
    Parent := MyNewPage.Surface;
  end;

  with TNewStaticText.Create(WizardForm) do
  begin
    Left := ScaleX(16);
    Top := ScaleY(138);
    Width := WizardForm.InnerNotebook.Width - ScaleX(60);
    Height := ScaleY(26);
    WordWrap := True;
    Caption := ExpandConstant('{cm:MyText_2}');
    Parent := MyNewPage.Surface;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if (PageID <= wpSelectDir) and (PageID = wpReady) and (MyRadioBtn_2.Checked) then
    Result := True;
end;

procedure InitializeWizard();
begin
  GetInstTypePage();
end;
function DetectWindows(s: string): string;
var
  SubKeyName, ResultStr: string;
begin
  SubKeyName:= 'Software\Microsoft\Windows NT\CurrentVersion';
  RegQueryStringValue(HKLM, SubKeyName, 'ProductName', ResultStr);
  if Pos('XP', ResultStr) > 0 then
    Result:= ExpandConstant('{%APPDATA}\id Software')
  else
  if Pos('Vista', ResultStr) > 0 then
    // не знаю, будет ли это C:\Users\Ваше_имя_пользователя\AppData\LocalLow\id Software
    // проверить не где
    Result:= ExpandConstant('{%APPDATA}\LocalLow\id Software')
  else Result:= '{%APPDATA}\LocalLow\id Software'; // сюда нужно вписать путь по дефолту, т.е. если не XP или Vista
end;


Johny777 30-01-2012 14:04 1847574

Лександер,
соединил
сделал как в инструкции
в итоге получил дубликаты DeinitializeSetup1() и InitializeWizard1()
и опять ту же ошибку Duplicate Idenifier выдаёт, когда доходи до строк function
читать дальше »

// --- Generated by InnoSetup Script Joiner version 3.0, Jul 22 2009, (c) Bulat Ziganshin <Bulat.Ziganshin@gmail.com>. More info at http://issjoiner.codeplex.com/

// --- Source: 1.iss ------------------------------------------------------------

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 DeinitializeSetup1();
begin
disabledesc();
end;

procedure InitializeWizard1();
begin


InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;
InfoPanel.Left := ScaleX(216);
InfoPanel.Width := ScaleX(200);
InfoPanel.Height := WizardForm.ComponentsList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := 'Èíôîðìàöèÿ:';
InfoCaption.Left := ScaleX(224);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;
Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188);
Info.Top := ScaleY(12);
Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);
Info.Caption := 'Íàâåäèòå íà êîìïîíåíò, ÷òîáû ïîëó÷èòü äîïîëíèòåëüíóþ èíôîðìàöèþ';
Info.WordWrap := true;
enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
'Êîðîòêîå îïèñàíèå èãðû;'+
'Äîïîëíèòåëüíàÿ äîêóìåíòàöèÿ, íà ðàçíûõ ÿçûêàõ;'+
'Òåõò èãðû;'+
'Îôèöèàëüíûé àíãëèéñêèé òåêñò îò EA Games;'+
'Îôèöèàëüíûé íåìåöêèé òåêñò îò íåèçâåñòíîãî ïðîèçâîäèòåëÿ;'+
'Ïèðàòñêèé êèòàéñêèé òåêñò;'+
'Îôèöèàëüíûé ðóññêèé òåêñò îò ñîôòêëàá;'+
'Îçâó÷êà èãðû;'+
'Îôèöèàëüíàÿ àíãëèéñêàÿ îçâó÷êà îò EA Games;'+
'Îôèöèàëüíàÿ íåìåöêàÿ îçâó÷êà îò íåèçâåñòíîãî ïðîèçâîäèòåëÿ;'+
'Ïèðàòñêàÿ êèòàéñêàÿ îçâó÷êà;'+
'Îôèöèàëüíàÿ ðóññêàÿ îçâó÷êà îò ñîôòêëàá;'+
'Ðóññêàÿ îçâó÷êà îò 7Wolf;'+
'Ðóññêàÿ îçâó÷êà îò ôàðãóñà;'
);
end;

// --- Source: 2.iss ------------------------------------------------------------

function enabledesc(TasksListHandle: 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 DeinitializeSetup2();
begin
disabledesc();
end;

procedure InitializeWizard2();
begin


InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectTasksPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.TasksList.Top;
InfoPanel.Left := ScaleX(216);
InfoPanel.Width := ScaleX(200);
InfoPanel.Height := WizardForm.TasksList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectTasksPage;
InfoCaption.Caption := 'Èíôîðìàöèÿ:';
InfoCaption.Left := ScaleX(224);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;
Info := TNewStaticText.Create(WizardForm);
Info.Parent := InfoPanel;
Info.AutoSize := False;
Info.Left := ScaleX(6);
Info.Width := ScaleX(188);
Info.Top := ScaleY(12);
Info.Height := WizardForm.TasksList.Height - ScaleY(18);
Info.Caption := 'Íàâåäèòå íà êîìïîíåíò, ÷òîáû ïîëó÷èòü äîïîëíèòåëüíóþ èíôîðìàöèþ';
Info.WordWrap := true;
enabledesc(WizardForm.TasksList.Handle,Info.Handle,
'1;'+
'12;'+
'2222;'+
'5555;'+
'10;'+

'Ð0;'
);
end;

// --- Dispatching code ------------------------------------------------------------

procedure DeinitializeSetup();
begin
DeinitializeSetup1();
DeinitializeSetup2();
end;

procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
end;



Script Joiner новый

Gnom_aka_Lexander 30-01-2012 14:37 1847602

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

У тебя эти две функции зачем-то объявлены дважды. естественно они не могут быть объединены, поскольку они вызываемые извне. а жойнеру - ему по барабану на то, что ты элементарных вещей понять не хочешь.

Johny777 30-01-2012 14:57 1847611

Лександер,
да это так
сейчас без этих функций соединил, а потом дописал в Joined
инструкцию по Джоинеру несколько раз перечитал прежде чем соединять. Не получается :(
ну если у Вас соединилось, то дайте пожалуйста результат, а то я в тупике
говорю ж
паскаль не знаю
а про внешние функции в инструкции не слова

TROY Diamond 30-01-2012 17:02 1847710

Можно ли как-то "обновить" список файлов деинсталлятора?
У меня в процессе установки создаются файлы, о которых установщик "НЕ знает"...
Все эти файлы я записываю в секцию "[UninstallDelete]", а есть ли какой-нибудь другой способ?

Вариант:

читать дальше »
[UninstallDelete]
Type: filesandordirs; Name: "{app}


НЕ подходит, т.к. в процессе использования приложения в папке установки, создаются файлы конфигурации, профили, настройки, которые если пользователь не хочет удалять, ДОЛЖНЫ ОСТАТЬСЯ!
А данная команда удалит всю папку установки...

И аналогичный вопрос, по поводу "этих файлов", - как их удалить если установка НЕ завершится или пользователь её прервёт?

Johny777 30-01-2012 17:31 1847722

TROY Diamond,
идеальный для тебя вариант (сам использую)
скопируй куда нибудь в конец секции CODE
http://rghost.ru/36227252
если не были созданы файлы после установки в директории установки, то удалит всё
если были созданы, то после удаления основных файлов появится окно со списком созданных после работы приложения файлов и галками можешь удалять отдельные ветки или некоторые файлы
скрин-пример http://rghost.ru/36227488
не забудь испольвоать в секции удаления такую строку
[UninstallDelete]
Type: files; Name: {app}
это часть Inno Setup Upgrade от Виктора Дробова

TROY Diamond 30-01-2012 19:56 1847838

Как в "родных" установщиках для игр из серии "S.T.A.L.K.E.R." реализованы проверка системных требований и вывод информации о винчестерах, через библиотеку "get_hw_caps.dll"?
Или это сейчас не актуально?
Сколько смотрел на форуме - многие спрашивали... а кода я чё та так и не нашёл, предлагают другие варианты!
читать дальше »

И вообще интересуют все "примочки", которые есть в этих установщиках...
"Народную солянку" НЕ надо!!! Нужны разные "штуки", которые есть в оригинальных установщиках: проверка наличия уже установленной игры, системные требования, невозможность продолжения установки, инфа и винтах, установка DirectX до установки игры, регистрация и т.п.
Если есть скрипт оригинального установщика, - вообще отлично...

Johny777 30-01-2012 21:28 1847904

TROY Diamond,
Цитата:

Цитата TROY Diamond
Если есть скрипт оригинального установщика, - вообще отлично... »

есть для стакера
наткнулся когда листал предыдущие ветки этой темы
писали здешние умы
http://rghost.ru/36232050
в нём есть сис. требования
они же есть и в шапке
вот тебе ещё 2 решения на проверку сис. требований
http://rghost.ru/36232112

TROY Diamond 30-01-2012 21:34 1847909

Johny777

СПАСИБО ОГРОМНОЕ!!!

Насчёт удаления файлов есть способ если установка прервана и БЕЗ "визуальности".

За Сталкера отдельная благодарность!!!

Johny777 30-01-2012 22:39 1847948

TROY Diamond,
за сталкера не мне спасибо а Serega и другим кто скрипт писал
я его только сохранил себе, чтоб изучить и знаний набраться
насчёт удаления проблем не вижу
когда нажимаешь отмену идёт "откат изменений" во время которого удаляется всё что успело установиться
хотя я и не пользуюсь модулем фриарка, но он тоже всё трёт при "Отмене"

если ты завршил процесс, то вручную
есть решение, что перед установкой проверят что в директории лежит и выдаёт запрс на "запустить" или "удалить" или "отмена"
http://rghost.ru/36233810

Dark_Delphin 31-01-2012 01:57 1848037

Всем привет.

Помогите вот с этой проблемкой:
Когда запускаю инсталл и высвечивается выбор языка, и когда я сразу закриваю этот выбор языка выдаёт такую ошибку:




Заранее спасибо.

Johny777 31-01-2012 03:00 1848054

ntrx,
кажется это из-за использования скина
у меня та же ошибка
используй автовыбор языка
вот так
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
будет язык в соответствии с языком системы и не будет окна выбора языка при запуске инсталятора
Из справки "При значении auto окно появится только в том случае, когда инсталлятор не найдет идентификатор языка."

Gnom_aka_Lexander 31-01-2012 10:41 1848170

Цитата:

Цитата Johny777
кажется это из-за использования скина »

Вовсе нет. Это попытка выгрузки dll до ее инициализации. Serega давал мне както такое решение:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[*code]
var
  Initialize:Boolean;

function InitializeSetup(): Boolean;
begin
  Initialize:=False; // инициализация еще не произошла.
  // Ваш код
  Result:=True;
end;

procedure InitializeWizard();
begin
  // Ваш код
  Initialize:=True;// к этому моменту инсталл уже работает, значит инициализация прошла упешно
end;

procedure DeinitializeSetup();
begin
  if Initialize then // если произошла инициализация, то выгружаем все,что нужно, в противном случае, в этом нет необходимости
  begin
    UnloadSkin;
    gdipShutdown;
  end;
end;


nik1967 31-01-2012 11:41 1848231

Цитата:

Цитата Johny777
ну если у Вас соединилось, то дайте пожалуйста результат, а то я в тупике »

Как то так
Код:

[Setup]
AppName=My Program
AppVerName=My Program version 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

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

[Files]
Source: descctrl.dll; Flags: dontcopy

[Tasks]
Name: need; Description: необходимо; GroupDescription: для првильной работы:; Check:
Name: need\no_steam; Description: выкл Steam (если включен); GroupDescription: для првильной работы:;
Name: need\direct_x; Description: установть/обновить DirectX; GroupDescription: для првильной работы;
Name: need\visual_c; Description: установть/отремонтировать VisualC++; GroupDescription: для првильной работы;
Name: need\hey; Description: ещё рекомендуется:; Flags: unchecked; GroupDescription: для првильной работы;
Name: need\hey\fonts; Description: установить шрифты; GroupDescription: для првильной работы;

[Components]
Name: "program"; Description: "Игра"; Types: full compact custom; Flags: fixed
Name: "help"; Description: "Помощь"; Types: full
Name: "Text"; Description: "Tехт"; Types: full
Name: "Text\en"; Description: "Aнглийский"; Flags: exclusive
Name: "Text\de"; Description: "Немецкий"; Flags: exclusive
Name: "Text\cn"; Description: "Китайский"; Flags: exclusive
Name: "Text\ru"; Description: "Русский"; Flags: exclusive
Name: "Voice"; Description: "Озвучка"; Types: full
Name: "Voice\en"; Description: "Английская"; Flags: exclusive
Name: "Voice\de"; Description: "Немецкая"; Flags: exclusive
Name: "Voice\ch"; Description: "Китайская"; Flags: exclusive
Name: "Voice\ru"; Description: "Русская"; Flags: exclusive
Name: "Voice\ru2"; Description: "Русская"; Flags: exclusive
Name: "Voice\ru3"; Description: "Русская"; Flags: exclusive

[_Code]
var
  Info, InfoCaption: TNewStaticText;
  InfoPanel: TPanel;

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

procedure InitializeWizard;
begin
  WizardForm.TYPESCOMBO.Visible:= false;
  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(200);

  InfoPanel:= TPanel.Create(WizardForm);
with InfoPanel do
begin
  Parent:= WizardForm.SelectComponentsPage;
  Caption := '';
  SetBounds(ScaleX(216),WizardForm.ComponentsList.Top,ScaleX(200),WizardForm.ComponentsList.Height);
  BevelInner := bvRaised;
  BevelOuter := bvLowered;
end;
  InfoCaption := TNewStaticText.Create(WizardForm);
with InfoCaption do
begin
  Parent:= WizardForm.SelectComponentsPage;
  Caption:= 'Информация:';
  Left:= ScaleX(224);
  Top:= InfoPanel.Top - ScaleY(5);
  Font.Color:= clActiveCaption;
end;
  Info:= TNewStaticText.Create(WizardForm);
with Info do
begin
  Parent:= InfoPanel;
  AutoSize:= False;
  SetBounds(ScaleX(6),ScaleY(12),ScaleX(188),WizardForm.ComponentsList.Height - ScaleY(18));
  WordWrap:= true;
end;
end;

Procedure CurPageChanged(CurPageID: Integer);
begin
  case CurPageID of
    wpSelectComponents:
    begin
      InfoPanel.Parent:= WizardForm.SelectComponentsPage;
      InfoCaption.Parent:= WizardForm.SelectComponentsPage;
      Info.Caption:= 'Наведите на компонент, чтобы получить дополнительную информацию';
      disabledesc();
      enabledesc(WizardForm.ComponentsList.Handle,Info.Handle,
      'Короткое описание игры;'+
      'Дополнительная документация, на разных языках;'+
      'Техт игры;'+
      'Официальный английский текст от EA Games;'+
      'Официальный немецкий текст от неизвестного производителя;'+
      'Пиратский китайский текст;'+
      'Официальный русский текст от софтклаб;'+
      'Озвучка игры;'+
      'Официальная английская озвучка от EA Games;'+
      'Официальная немецкая озвучка от неизвестного производителя;'+
      'Пиратская китайская озвучка;'+
      'Официальная русская озвучка от софтклаб;'+
      'Русская озвучка от 7Wolf;'+
      'Русская озвучка от фаргуса;');
    end;

    wpSelectTasks:
    begin
      InfoPanel.Parent:= WizardForm.SelectTasksPage;
      InfoCaption.Parent:= WizardForm.SelectTasksPage;
      Info.Caption:= 'Наведите на задачу, чтобы получить дополнительную информацию';
      disabledesc();
      enabledesc(WizardForm.TasksList.Handle,Info.Handle,
      'Чтобы игра игралась;'+
      'Нужно сделать так;'+
      'Выключить Steam нафиг;'+
      'Зафигачить DirectX;'+
      'Намутить VisualC++;'+
      'А так же;'+
      'Воткнуть ненужные шрифты;');
    end;
  end;
end;

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

Ну и не забыть добавить descctrl.dll

И ещё по Сталкеру
Код:

;Всем известная игра S.T.A.L.K.E.R. при установке использует некоторые хитрости. Дело не в проверке системных требований или свободного
;места на диске. Самый важный момент при инсталляции перепакованной игры - создать правильный файл "fsgame.ltx". Данный файл представляет
;собой некоторый загрузчик данных. Любое неправильное его построение чревато глюками и неправильной работе игры. Чтобы создать абсолютно
;точную копию оригинала нужно выполнить следующий код (не забываем при сборке, чтобы файл "fsgame.ltx" был абсолютно пустой):
[_Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
S: String;
begin
If CurStep=ssPostInstall then
begin
S := ExpandConstant('{commondocs}\STALKER-SHOC\')
StringChangeEx(S, ':\', ':\|', True);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$app_data_root$=true|false|' + S + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_data$        = false|    true|    $fs_root$|        gamedata\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_ai$        = true|        false|    $game_data$|        ai\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_spawn$    = true|        false|    $game_data$|        spawns\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_anims$        = true|        true|    $game_data$|        anims\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_levels$    = true|        false|    $game_data$|        levels\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_meshes$    = true|        true|    $game_data$|        meshes\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_dm$        = true|        true|    $game_data$|        meshes\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_shaders$    = true|        true|    $game_data$|        shaders\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_sounds$    = true|        true|    $game_data$|        sounds\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_textures$    = true|        true|    $game_data$|        textures\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_scripts$    = true|        false|    $game_data$|        scripts\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_config$    = true|        false|    $game_data$|        config\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$level$        = false|    false|    $game_levels$' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$game_saves$    = true|        false|    $app_data_root$|    savedgames\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$logs$        = true|        false|    $app_data_root$|    logs\' + #13, true);
SaveStringToFile(ExpandConstant('{app}')+'\fsgame.ltx', '$screenshots$    = true|        false|    $app_data_root$|    screenshots\' + #13, true);
end;
end;


lmiol 31-01-2012 11:42 1848236

Мне както Лександер подсказывал код, но он как вариант не подходит!!!
а то что можно сделать такой как я показал это 100%, я видел в какойто из версий Klite codec pack

Gnom_aka_Lexander 31-01-2012 12:47 1848295

lmiol, в твоем случае, без содания дополнительной страницы компонентов, и описания кучи условий, вариант только такой:
читать дальше »
Код:

[Setup]
AppName=Quake Live
AppVerName="Quake Live"
AppPublisher=Mio Dark Project
CreateAppDir=no

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

[Types]
Name: "full"; Description: "Все компоненты";
Name: "custom"; Description: "Выбрать компоненты"; Flags:  iscustom

[Components]
Name: "main"; Description: "Cтандартные файлы Quake Live"; Types: full custom; Flags: fixed
Name: "main2"; Description: "Премиум файлы Quake Live"; Types: full custom;
Name: "plug"; Description: "Плагин Quake Live"; Types: full custom;
Name: "browser"; Description: "Портативный Firefox под Quake Live"; Types: full custom;
Name: "manual"; Description: "Руководство и Награды"; Types: full custom;
Name: "anti"; Description: "Античит PunkBuster"; Types: full custom;

[CustomMessages]
HeaderLabelPage=Выберите тип вашего аккаунта
MyRadioCaption_1=Standart
MyRadioCaption_2=Premium / Pro
PageTextHeader=На этой странице Вы можете выбрать тип вашего аккаунта, который вы используете в игре.
MyText_1=Будут установлены файлы которые доступны для игроков без подписки.
MyText_2=Будут установлены файлы которые доступны для игроков с Premium/Pro подпиской.


[*code]
var
  MyNewPage: TWizardPage;
  MyRadioBtn:ArraY[0..1]of TNewRadioButton;

procedure GetInstType;
begin
  WizardForm.ComponentsList.ItemEnabled[1]:= MyRadioBtn[1].Checked or not MyRadioBtn[0].Checked;
  WizardForm.ComponentsList.Checked[1]:=MyRadioBtn[1].Checked or not MyRadioBtn[0].Checked;
  WizardForm.ComponentsList.Checked[4]:=MyRadioBtn[1].Checked or not MyRadioBtn[0].Checked;
end;

procedure GetInstTypePage;
var
  i:integer;
begin
  MyNewPage := CreateCustomPage(wpWelcome,
  ExpandConstant('{cm:HeaderLabelPage}'), '');

  with TNewStaticText.Create(WizardForm) do
  begin
    Width := WizardForm.InnerNotebook.Width;
    Height := ScaleY(26);
    WordWrap := True;
    Caption := ExpandConstant('{cm:PageTextHeader}');
    Parent := MyNewPage.Surface;
  end;

  for i:=0 to 1 do
  begin
    MyRadioBtn[i] := TNewRadioButton.Create(WizardForm);
    with MyRadioBtn[i] do
    begin
      Parent := MyNewPage.Surface;
      Top := ScaleY(50+i*70);
      Width := ScaleX(150);
      case i of
        0: begin
          Caption := ExpandConstant('{cm:MyRadioCaption_1}');
          Checked := True;
        end;
        1:Caption := ExpandConstant('{cm:MyRadioCaption_2}');
      end;
    end;

    with TNewStaticText.Create(WizardForm) do
    begin
      Parent := MyNewPage.Surface;
      SetBounds(ScaleX(16),ScaleY(68+i*70),WizardForm.InnerNotebook.Width - ScaleX(60),ScaleY(26));
      WordWrap := True;
      case i of
        0:Caption := ExpandConstant('{cm:MyText_1}');
        1:Caption := ExpandConstant('{cm:MyText_2}');
      end;
    end;
  end;
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if (PageID <= wpSelectDir)
    and (PageID = wpReady)
      and (MyRadioBtn[1].Checked)
        then Result := True;
end;

procedure InitializeWizard();
begin
  GetInstTypePage;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpSelectComponents then GetInstType;
end;

Цитата:

Цитата lmiol
это 100%, я видел в какойто из версий Klite codec pack »

Конечно можно. создаешь еще одну страницу компонентов и делаешь привязки к старой по каждому пункту. Сам.

LinkOFF 31-01-2012 14:20 1848412

Цитата:

Цитата N00bak
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data.arc'), ExpandConstant('{app}'), 'rus', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break; »

Вообще не работает я и компоненты переносил в скрипт isdone из исходного и чего только не пробовал.Распаковка выбранных папок/файлов работает.
если что вот мой скрипт http://rghost.ru/36247630

lmiol 31-01-2012 16:10 1848506

Цитата:

Конечно можно. создаешь еще одну страницу компонентов и делаешь привязки к старой по каждому пункту. Сам.
а можно пару ссылок на создание страниц, чтобы хоть я знал с чего начинать

TROY Diamond 31-01-2012 18:39 1848638

Как правильно сделать, когда используешь несколько языков для установки, чтобы в зависимости от языка ОС, выбирался и язык установщика и сообщений?

читать дальше »
]Setup]
...
LanguageDetectionMethod=uilanguage
ShowLanguageDialog=auto

[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
Name: "french"; MessagesFile: "compiler:Languages\French.isl"
Name: "german"; MessagesFile: "compiler:Languages\German.isl"
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl"


А в некоторых скриптах видел "locale" вместо "uilanguage" + "ShowUndisplayableLanguages=yes":

читать дальше »
[Setup]
...
LanguageDetectionMethod=locale
ShowUndisplayableLanguages=yes


P.S. СКОЛЬКО БЫ Я ЯЗЫКОВ НЕ ЗАДАЛ В "Languages", при "ShowLanguageDialog=yes, отображаются только 2 Английский и Русский, Что не так?
ГДЕ ВЗЯТЬ БЕЛОРУССКИЙ И УКРАИНСКИЙ ЯЗЫКИ ДЛЯ УСТАНОВЩИКА?!

TROY Diamond 31-01-2012 19:23 1848674

Есть ли какая-нибудь принципиальная разница при разбиении на части между "setup-1.bin", "setup-2.bin", "setup-3.bin"... и "setup-1a.bin", "setup-1b.bin", "setup-1c.bin"?

Насколько я понимаю "первый вариант" БЕЗ "SlicesPerDisk", а "второй" с ним. Для чего это нужно?

Это отразится только на размере и количестве частей? Если я к примеру и так знаю сколько мне нужно, чтобы каждая часть занимала и сколько их должно быть...
А расположение частей можно указать вручную в обоих случаях, т.е. можно располагать части на разных носителях отдельно от "setup.exe"?

alert30 31-01-2012 19:25 1848679

Цитата:

Цитата TROY Diamond
Есть ли какая-нибудь принципиальная разница при разбиении на части между "setup-1.bin", "setup-2.bin", "setup-3.bin"... и "setup-1a.bin", "setup-1b.bin", "setup-1c.bin"? »

Разницы никакой нету, главное чтоб к примеру во время инсталляции игры прицепились к другому BIN'у. То сеть устанавливается setup-1.bin - это первый диск, setup-2.bin - второй диск, setup-3.bin - третий диск и т.п. Я так полагаю, что Вы перепаковываете какую-то программу с бОльшим размером?

TROY Diamond 31-01-2012 19:58 1848703

Цитата:

Цитата alert30
alert30 alert30 вне форума »

Да, спасибо я так и думал... Меня просто "смущали буквы".

Dark_Delphin 31-01-2012 20:26 1848725

Всем привет!
подскажите пожалуйста, где можно посомтреть таблицу такого кода.. т.е. каждый код означает букву.
На скриншоте пример слова "Русский"



Заранее спасибо.

TROY Diamond 31-01-2012 21:52 1848814

Как в патчах для Сталкера реализован "дополнительный" индикатор процесса?
Или это тот же самый? Сначала идёт распаковка - доходит до конца до 100%, а потом при пропатчивании "полоска опять сначала".

El Sanchez 31-01-2012 21:55 1848816

Цитата:

Цитата TROY Diamond
СКОЛЬКО БЫ Я ЯЗЫКОВ НЕ ЗАДАЛ В "Languages", при "ShowLanguageDialog=yes, отображаются только 2 Английский и Русский, Что не так? »

TROY Diamond, пробуйте так:
Код:

[Setup]
LanguageDetectionMethod=none
ShowUndisplayableLanguages=yes

При таком раскладе первый язык в секции [Languages] будет по умолчанию в диалоге, список языков по алфавиту.
Цитата:

Цитата TROY Diamond
ГДЕ ВЗЯТЬ БЕЛОРУССКИЙ И УКРАИНСКИЙ ЯЗЫКИ ДЛЯ УСТАНОВЩИКА?! »

TROY Diamond, украинский появился в последней версии 5.4.3, белорусского нет.

Цитата:

Цитата ntrx
подскажите пожалуйста, где можно посомтреть таблицу такого кода.. т.е. каждый код означает букву. »

ntrx, http://msdn.microsoft.com/ru-ru/goglobal/cc305144

sancheolz 01-02-2012 21:59 1849628

Как же я заблуждался. Не знаю по чьему совету, но там говорилось, что флаг comparetimestamp проверяет только дату создания файла. оказалось же он проверяет дату изменения и все мои па с вызовами winAPI оказались не к месту. только время потратил. Глянул дебагером пошагово и в логе заметил, что сравниваются штампы времени и принимается решение о замене файла. Вот так. всего одно слово вместо кучи кода. Другим на заметку.

YURSHAT 02-02-2012 10:07 1849882

Цитата:

Цитата El Sanchez
украинский появился в последней версии 5.4.3 »

В качестве неофициального, украинский был очень давно...
Цитата:

Цитата El Sanchez
белорусского нет. »

Отчего же, есть. Опять же, в качестве "Unofficial translations" лежит на сайте автора http://www.jrsoftware.org/files/istrans/

Dark_Delphin 02-02-2012 20:15 1850306

Всем привет!

Подскажите как решить такую проблему:
Скомпилировал, установил, но когда запускаю деинсталятор, то выбивает две ошибки.
Вот скрины ошибок:



Заранее благодарен.

Johny777 02-02-2012 21:14 1850359

ntrx,
скрипт выложи
у меня такое было, когда к деинсталятору скин прикручивал

valyok666 02-02-2012 21:59 1850385

ntrx, кидай [code] по тегом more щас посмотрю

TROY Diamond 02-02-2012 23:40 1850458

El Sanchez и YURSHAT

:up Спасибо! :)

Johny777 03-02-2012 03:27 1850554

Уважаемые!
натыкаюсь на решения, которые выполняют одни и те же функции
например описанее компонетов через deskctrl и без него для расширеной версии
или
ISFont, который установливает временный шрифт и его аналог, но без библиотеки
с isskin понятно, что без него никак, если нужен скин

вопрос:

что вообще лучше библиотека или чистый кусок кода
на какой-то странице кажись Лександер писал, что библиотека в отличии от штатных средств разгружает систему и в некоторых случаях добавляет функции, которые сама инно не поддерживает
это, понятное дело, хорошо
но у меня в инсталляторе уже 4 библиотеки, картинки и скин, которые при инициализации разархивируются в темп (is-temp кажется)
всё это занимает у меня одну секунду, что дольше чем без них, но секундой или тремя я могу пренебречь

мне б хотелось окончательно знать что нужно использовать, если есть выбор,
цель - максимальное качество (насколько возможно) самого инсталятора во всех отношениях

alert30 03-02-2012 04:49 1850561

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

R.i.m.s.k.y. 03-02-2012 08:04 1850599

Цитата:

Цитата alert30
после перед запуском инсталлятора »

Ты ломать крушить мой мозг любвеобильно и ясно

Код:

Function InitializeSetup: Boolean;
Begin
...
MsgBox('табличко с кнопочкой "ОК"', mbError, mb_Ok);
...
end;


Gugle 03-02-2012 15:48 1850955

Доброго времени суток!

Подскажите как использовать встроенные архиваторы (а может надо использовать сторонние) для сжатия файлов в секции [code] ?

R.i.m.s.k.y. 03-02-2012 15:55 1850960

Gugle, непонял, которые ты вызываешь из секции Code и присутствуют в секции Files? так они сжимаются с параметрами, указанными в секции Setup, пока не укажешь им флаг nocompression
Если сторонние файлы - надо читать справку к архиватору каким сжимаешь

Gugle 03-02-2012 16:06 1850964

R.i.m.s.k.y., да нет. Я имел ввиду, что мне надо было архивировать файлы, которые ложатся в backup, после установки софта.

Вот нашел Сейчас попробую как работает. Отпишусь в своем же сообщении.

Работает.
Есть прогресс бар.

alert30 03-02-2012 16:06 1850965

Цитата:

Цитата R.i.m.s.k.y.
Ты ломать крушить мой мозг любвеобильно и ясно »

Отредактировал. Что-то я быстро перенажал клавишу... :)

TROY Diamond 03-02-2012 18:02 1851052

Как в патче для игры Сталкер реализованы несколько индикаторов процесса?



"По очереди появляются несколько индикаторов": отдельно для распаковки, для обновления и для регистрации.
Т.е. сначала файлы распаковываются "полоска доходит до конца", потом "полоска по новой" для обновления и ещё раз для регистрации.

Почему в оригинальном установщике шрифт текста Лицензионного соглашения более "аккуратный, компактный и чёткий", чем в моём?
(1 - оригинал, 2 - мой):



Текст в обычном *.txt, а не *.rtf, - можно ли его как-нибудь "настроить"?

alert30 03-02-2012 19:34 1851120

TROY Diamond, изменить запросто, просто открой Inno Setup 5.4.3 (РАСШИРЕННАЯ), открой скрипт ISS, редактор форм, и найди типа "License" и удачи изменить шрифты...

wdmitriy 04-02-2012 01:39 1851420

Ребят подскажите кто может у меня такая проблема переделал скрипт от "Killer" Установка проходит успешно а вот при удалении выскакивает ошибка Runtime Error (at 170:5712): Could not call proc. после нажатия на "ок" выскакивает следующая Runtime Error (at 213:5): Could not call proc. и на этом все ничего не удаляеться уже весь скрипт перелопатил в чем проблема понять не могу зарание спасибо за ответ!!

Johny777 04-02-2012 02:09 1851444

wdmitriy,
скин к деинсталятору пришивал?
если да, то вот правильный код-пример:
Код:

[Files]
Source: ISSkin.dll; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system;  /// в папку установи
Source: steam.cjstyles; DestDir: {app}; Flags: ignoreversion; Attribs: hidden system; /// в папку установки
/// если используешь скин на самом инсталяторе, то эти же две строки, только в темп
/// Source: ISSkin.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
/// Source: steam.cjstyles; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[_Code]
procedure LoadSkinA(lpszPath: String; lpszIniFileName: String ); external 'LoadSkin@{tmp}\isskin.dll stdcall delayload uninstallonly';

function InitializeUninstall(): Boolean;
begin
  FileCopy(ExpandConstant('{app}\isskin.dll'), ExpandConstant('{tmp}\isskin.dll'), False);
  FileCopy(ExpandConstant('{app}\steam.cjstyles'), ExpandConstant('{tmp}\steam.cjstyles'), False);
  LoadSkinA(ExpandConstant('{tmp}\steam.cjstyles'), '');
  Result:=True;
end;


Gnom_aka_Lexander 04-02-2012 10:38 1851513

Цитата:

Цитата wdmitriy
Runtime Error (at 213:5) »

213-я строка 5-й символ.
А вообще - Could not call proc означает обращение к объекту до его создания. Чаще всего. Без скрипта - больше никто и ничего не сможет тебе подсказать, что тебе действительно помогло-бы. Хотя желающих пофлудить на тему нарушения тобой элементарных правил постановки вопроса - найдется множество. Но большинство удержит себя в руках.

Johny777 04-02-2012 14:13 1851637

скажите пожалуйста
если создать один чекбокс и например 3 радио кнопки, то чтобы сделать эти радиокнопки дочерними (как с компонетами 1, 1\1, 1\2) нужно настраивать Tab Order?
например у чекбокса Tab Order 0, а у радиокнопок 1

alert30 04-02-2012 14:49 1851668

Johny777, то есть, к примеру если чекбокс не галична (не активируется галочкой), то эти радиобуттоны не активны я так полагаю?

Johny777 04-02-2012 15:10 1851683

alert30,
да
видишь ли
у меня косяк с RunList-ом на последней странице
устанавливаются 4 игры и в конце четыре чебокса
выбираются все одновременно, а надо, чтоб по очереди
флаг "эксклюзив" не действует в секции RUN, вот и прикидываю, чтоб как-то сделать так:

здесь

те пустой чекбокс "запустить" и радиобаттоны
скрип с нуля делаю сначала на game script generator от South
раньше эти чекбоксы были как бы "эксклюзивными"
а сейчас нет
где ошибся понять не могу


отбой,
примерно вот так будет эксклюзивный выбор на RunList-е
читать дальше »
procedure RunListClickCheck(Sender: TObject);
var
i:integer;
begin
if WizardForm.RunList.Checked[WizardForm.RunList.ItemIndex] then begin
for i:=0 to WizardForm.RunList.Items.Count-1 do
WizardForm.RunList.Checked[i]:=False;
WizardForm.RunList.Checked[WizardForm.RunList.ItemIndex]:=True;
end;
end;

procedure InitializeWizard;
begin
WizardForm.RunList.OnClickCheck:=@RunListClickCheck;
WizardForm.TypesCombo.ItemIndex:=0;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if (CurPageID=wpFinished) or (CurPageID=wpInfoAfter) then
WizardForm.RunList.Checked[0]:=True;
end;


но хотелось бы всё таки узнать насчёт TabOrder

STRAYKER 04-02-2012 16:57 1851757

Помогите, как сделать в скрипте что бы были дополнительные голочки по поводу установки дополнительного ПО?

R.i.m.s.k.y. 04-02-2012 18:09 1851790

STRAYKER, может в справке поглядеть?
Код:

[Tasks]
Name: vcredist; Description: MS Visual C++ 2008; GroupDescription: Доп.ПО

[Run]
Tasks: vcredist; Filename: {app}\VCRedist2008\vcredist_x86.exe; WorkingDir: {app}\VCRedist2008; Description: MS Visual C++ 2008; Flags: waituntilterminated


leshcat 05-02-2012 02:36 1852050

Привет всем!

Странное дело:

function InitializeSetup(): Boolean;
var
path, RegValue, TmpFileName,TmpFileName2,ExecStdout: String;
ErrorCode, Messages, Messages2: Integer;
begin
Result:= True;


TmpFileName := ExpandConstant('{tmp}') + '\A.txt';
TmpFileName2 := ExpandConstant('{tmp}') + '\B.txt';

Exec('cmd.exe', ..+ TmpFileName +... , ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ErrorCode);
LoadStringFromFile(TmpFileName, ExecStdout);

Чето там с ним делается.

Потом:

Exec('cmd.exe', ..+ TmpFileName2 +... , ExpandConstant('{tmp}'), SW_HIDE, ewWaitUntilTerminated, ErrorCode);
LoadStringFromFile(TmpFileName2, ExecStdout);

Проблема в следующем:
TmpFileName2 := ExpandConstant('{tmp}') + '\B.txt'; ----> не создается ни под каким предлогом, хотя A файл всегда.

В чем проблема?

SARATOVSKY 05-02-2012 18:05 1852321

Здравствуйте, ребят подскажите как создать инсталл с выборочной установкой. К примеру у меня в инстале 11 частей игры и нужно чтобы какие части нужны те и должны отмечаться галочками. Ткните мне туда где это описано!

R.i.m.s.k.y. 05-02-2012 18:13 1852324

SARATOVSKY,
Tasks (выше пример) и Components по аналогии

wdmitriy 06-02-2012 07:01 1852619

как сделать чтобы видео проигрывалось на заднем фоне в окне инсталлятора за надписями, прогрес баром и тд.

master00778 06-02-2012 15:08 1852868

помогить как сделать музыку в инсталляторе

nazbek010 06-02-2012 16:29 1852925

Люди помогите как соединить эти 2 кода

procedure CurStepChanged(CurStep: TSetupStep);
var
FindFiles: TFindRec;
i: integer;
MyFiles: array of string;
MyDir, BackDir: string;
begin
if CurStep=ssInstall then begin
if MyTask.Checked then begin
MyFiles:=['*.vtx','*.','*.mdl','*.vvd','*.phy']; // указать файлы или маски нужные для бакупа через запятую. при указании маски '*' бакупятся все файлы с вложенными папками
MyDir:=ExpandConstant('{app}'+'\cstrike\models\weapons\'); //папка откуда бакупить
BackDir:=ExpandConstant('{app}'+'\Backup\'); // папка куда бакупить
for i:=0 to GetArrayLength(MyFiles)-1 do
begin
if FindFirst(MyDir+MyFiles[i], FindFiles) then begin
repeat
if not DirExists(BackDir) then begin
CreateDir(BackDir);
end;
MoveFile(MyDir+FindFiles.Name, BackDir+FindFiles.Name);
until not FindNext(FindFiles);
FindClose(FindFiles);
end;
end;
end;
end;
end;

и

procedure CurStepChanged(CurStep: TSetupStep);
begin
case CurStep of
ssInstall: begin
PercentsOldProc:=SetWindowLong(WizardForm.ProgressGauge.Handle,-4,CallBackProc(@PercentsProc,4));
if GetArrayLength(ADisk)>0 then begin
KillTimer(WizardForm.Handle,WFDiskTimerID);
SetArrayLength(ADisk,0);
end;
end;
ssPostInstall: SetWindowLong(WizardForm.ProgressGauge.Handle,-4,PercentsOldProc);
end;
end;

Dark_Delphin 06-02-2012 18:23 1852999

master00778, вот пример.
Есть даже регулятор громкости.

valyok666 06-02-2012 18:44 1853011

master00778, wdmitriy,
трудно в справку заглянуть или примеры в шапке???

sergey3695 07-02-2012 17:53 1853696

wdmitriy, IsPicture в помощь...

Deadmau5 07-02-2012 19:14 1853738

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

wdmitriy 07-02-2012 20:12 1853780

sergey3695, это для изображения а я просил для видео

Gnom_aka_Lexander 07-02-2012 20:44 1853798

Кто тебе сказал, что IsPicture для изображений? Она с картинками вообще не умеет работать. я ее как раз для того и писал, чтоб видео на фоне инсталла можно было показывать.
тоесть, позади надписей, контролов, и так далее.

wdmitriy 07-02-2012 20:59 1853811

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

Лександер, я добовляю видео в пример IsPicture а у меня при запуске установка не отвечает

Gnom_aka_Lexander 07-02-2012 21:10 1853820

Из 250-ти скачавших, ни у кого проблем не было. К библиотеке идет 100% рабочий пример. Наверняка просто успел накосячить в коде, либо подключил что-то, что не работает. например код для использования своих шрифтов в инсталле.
Без твоего скрипта, наверняка сказать не могу.

wdmitriy 07-02-2012 21:25 1853826

[Setup]
WizardImageFile=Fon.avi
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program

[Files]
Source: IsPicture.dll; Flags: dontcopy
Source: Fon.avi; DestDir: {tmp}; Flags: dontcopy;
[code]
//-----------------------------------------
procedure Initialize(AhWnd,BhWnd: hWnd;Color:Tcolor;bAlpha:Integer;Flag:Boolean);external 'Initialize@files:IsPicture.dll stdcall delayload';
//-----------------------------------------
// AhWnd - форма, которая будет сверху
// BhWnd - форма, которая будет снизу
// Color - цвет,который будет вырезан из формы, которая сверху
// bAlpha - степень прозрачности - от 0 до 255 для формы,которая сверху
// Flag - значения - True-будет применена прозрачность false- вырезание цвета
//-----------------------------------------
// Примеры:
// Initialize(WizardForm.Handle,MainForm.Handle,$0f0f0f,130,false);
// будет вырезан цвет $0f0f0f из WizardForm (флаг false)
//-----------------------------------------
// Initialize(WizardForm.Handle,MainForm.Handle,$0f0f0f,130,True);
// Будет применена прозрачность 130 к WizardForm (флаг True)
//-----------------------------------------


procedure Deinitialize;external 'Deinitialize@files:IsPicture.dll stdcall delayload';

const
// цвета придется тщательно подбирать.
// Если Сглаживание шрифтов в системе отключено,
// то нужно его включить на время настройкт инсталлятора.
TfonColor = $0f0f0f; // Цвет фона $0f0f0f
TfontColor = $E5E5E5; // Цвет текста $E5E5E5


procedure InitializeWizard();
var s:String;
begin
//-----------------------------------------
// нижеприведенный код очень желателен для наличия.
WizardForm.Color:=TfonColor;
WizardForm.WelcomePage.Color:=WizardForm.Color;
WizardForm.FinishedPage.Color:=WizardForm.Color;
WizardForm.InnerPage.Color:=WizardForm.Color;
WizardForm.DirEdit.Color:=WizardForm.Color;
WizardForm.ReadyMemo.Color:=WizardForm.Color;
WizardForm.MainPanel.Color:=WizardForm.Color;
//-----------------------------------------
//-----------------------------------------
WizardForm.Font.Color:=TfontColor;
WizardForm.Font.Size:=9;
WizardForm.Font.Name:='Georgia';
WizardForm.Font.Style := [fsBold, fsItalic];
//-----------------------------------------
//-----------------------------------------
WizardForm.PageNameLabel.Font := WizardForm.Font;
WizardForm.WelcomeLabel1.Font := WizardForm.Font;
WizardForm.WelcomeLabel1.Font.Size:=14;
WizardForm.FinishedHeadingLabel.Font := WizardForm.Font;
WizardForm.FinishedHeadingLabel.Font.Size:=14;
//-----------------------------------------
//-----------------------------------------
WizardForm.WizardBitmapImage.Parent := MainForm;
WizardForm.WizardBitmapImage.Align := alClient;;
WizardForm.WizardBitmapImage2.Hide;
//-----------------------------------------

//-----------------------------------------
// указываем формы, в данном случае WizardForm и MainForm
// выбираем режим работы с помощью флага:
//True-будет применена прозрачность к WizardForm false- вырезание цвета.
//соединены формы будут в длл-ке
Initialize(WizardForm.Handle,MainForm.Handle,TfonColor,130,false);
//-----------------------------------------
// не забываем показать MainForm
MainForm.Show;
//-----------------------------------------
end;

procedure DeinitializeSetup();
begin
//-----------------------------------------
// не забываем правильно завершить функцию,
// во избежание ошибок при закрытии
Deinitialize;
//-----------------------------------------
end;

Ну и вчем ошибка я ничего не добовлял кроме того что заменил Fon.bmp на Fon.avi

vitl 07-02-2012 21:33 1853829

Пожалуйста, помогите решить следующую задачу.
Нужно силами Inno Setup создать программу-обновлялку, которая обновляла бы программу на флешке.

Нужно сделать так, чтобы Программу-Апдейтер можно было запускать из любой папки на компьютере. Для этого необходимо по маркерным файлу и папке определить на какую букву села флешка, после чего должно произойти обновление на флешке в папках:
%буква_флешки%\Settings\Client\ и %буква_флешки%\utils\.

Желательно обновляемые файлы предварительно скопировать в backup.

Надеюсь на помощь.

P.S. Всё застопорилось на определении буквы диска с флешкой.

Gnom_aka_Lexander 07-02-2012 21:33 1853831

wdmitriy, Ооо... вопревых есть теги, чтоб портянки не вывешивать. А во вторых - где ты нашел такую древнюю версию?
Ссылка - тут последняя версия.

wdmitriy 07-02-2012 21:56 1853846

На этом сайте спасибо за последнюю версию

R.i.m.s.k.y. 07-02-2012 21:57 1853848

vitl,
как-то так
Код:

[Setup]
DefaultDirName={code:Path}
DisableDirPage=True
Uninstallable=false

[Files]
Source: filenull; DestDir: {tmp}; BeforeInstall: BackUp; Flags: ignoreversion
Source: \Settings\Client\; DestDir: {app}\Settings\Client\; BeforeInstall: ChangeCaption('\Settings\Client\'); Flags: ignoreversion recursesubdirs createallsubdirs
Source: \utils\; DestDir: {app}\utils\; BeforeInstall: ChangeCaption('\utils\'); Flags: ignoreversion recursesubdirs createallsubdirs

[*Code]

var DriveLetter : char;

procedure ChangeCaption(str: string);
    begin
    WizardForm.StatusLabel.Caption:= str;
end;

Function InitializeSetup: Boolean;
var i : Integer;
begin
DriveLetter := ''; i:= Ord('a');
while ( (Length(DriveLetter)=0) or (i<=Ord('z')) )
do begin
if FileExists(Chr(i)+':\markerfile') then DriveLetter := Chr(i);
i := i +1;
end;
if (Length(DriveLetter) > 0 then Result := True
  else begin
  MsgBox('флэшка не найдена', mbError, mb_Ok);
  Result := False;
  end;
end;

function Path(): String;
begin
if (Length(DriveLetter) > 0) then Result := DriveLetter +':\' else Result := ExpandConstant('{tmp}');
end;

procedure copyfiles(fromfile, tofile:string);
var res : integer;
begin
  Exec('cmd.exe', ' /c copy /Y ' + AddQuotes(fromfile) + ' ' + AddQuotes(tofile),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

Procedure backUp();
begin
ChangeCaption('BackUp')
If DirExists (DriveLetter +':\'+'Settings\Client\') then copyfiles(DriveLetter +':\'+'Settings\Client\', DriveLetter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\Settings\Client\');
if DirExists (DriveLetter +':\'+'utils\') then copyfiles(DriveLetter +':\'+'utils\', DriveLetter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\utils\');
end;

код идейно верный но могут быть синтаксические ошибки: end'а не хватает, ошибка в названии и тп

Johny777 08-02-2012 02:02 1853938

помогите пожалуйста
вылетает с ошибкой когда добавляю AddToMemo
[Files]
Source: half-life 2\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension onlyifdoesntexist; Components: g0\c1; AfterInstall: ExtLog(); BeforeInstall: AddToMemo, ChangeCaption('установка компонентов Half-Life 2');

как в BeforeInstall записать 2 параметра?
в справке говорится, что через запятую, но у меня это не работает
с этой проблемой столкнулся, когда объединял эти 2 кода
1
читать дальше »
Код:

\[Files]
Source: "{src}\*.exe"; DestDir: {app}; BeforeInstall: ChangeCaption('Откиньтесь на спинку кресла и наслаждайтесь!')
Source: "{src}\*.dll"; DestDir: {app}; BeforeInstall: ChangeCaption('Не забудьте зарегистрироваться')

[_Code]
procedure ChangeCaption(str: string);
begin
WizardForm.StatusLabel.Caption:= str;
end;


2
читать дальше »
Код:

[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp
 
[Files]
Source: E:\Program\Inno Setup 5.3.8 Ext\*; DestDir: {app}; BeforeInstall: AddToMemo; Flags: nocompression recursesubdirs createallsubdirs
 
[_code]
var
FilesMemo: TMemo;
 
procedure AddToMemo();
var AFile: String;
begin
AFile:= ExpandConstant(CurrentFilename);
if ExtractFileExt(AFile)='' then
  FilesMemo.Lines.Add('CreateFolder: '+RemoveBackslash(AFile)) else
  FilesMemo.Lines.Add('Extract: '+AFile);
end;
 
procedure InitializeWizard();
begin
FilesMemo:= TMemo.Create(WizardForm);
FilesMemo.SetBounds(0, 80, 418, 120);
FilesMemo.WordWrap:= False;
FilesMemo.Parent:= WizardForm.InstallingPage;
FilesMemo.ScrollBars:= ssVertical;
FilesMemo.ReadOnly:= True;
FilesMemo.Clear;
end;


vitl 08-02-2012 09:11 1853995

Цитата:

Цитата R.i.m.s.k.y.
код идейно верный но могут быть ...

Спасибо, R.i.m.s.k.y., буду пробовать!

vitl 08-02-2012 09:59 1854010

Цитата:

Цитата R.i.m.s.k.y.
[Files]
Source: filenull; DestDir: {tmp}; BeforeInstall: BackUp; Flags: ignoreversion
Source: \Settings\Client\; DestDir: {app}\Settings\Client\; BeforeInstall: ChangeCaption('\Settings\Client\'); Flags: ignoreversion recursesubdirs createallsubdirs
Source: \utils\; DestDir: {app}\utils\; BeforeInstall: ChangeCaption('\utils\'); Flags: ignoreversion recursesubdirs createallsubdirs »

Выдает ошибку "Sourse file \Settings\Client\ does not exist". Что нужно поправить?
На флешке Settings\Client\ присутствует, рядом с файлом-скриптом тоже.

R.i.m.s.k.y. 08-02-2012 10:07 1854015

vitl, Source - местонахождение файлов обновления
первый слэш убери
Source: Settings\Client\;
Source: utils\;
или жеско пропиши путь местонахождения обновления

vitl 08-02-2012 11:23 1854047

Цитата:

Цитата R.i.m.s.k.y.
первый слэш убери
Source: Settings\Client\; »

Сделал так:
Source: Settings\Client\*; DestDir: {app}\Settings\Client\; BeforeInstall: ChangeCaption('\Settings\Client\'); Flags: ignoreversion recursesubdirs createallsubdirs

Теперь другая ошибка:
"Required function or procedure 'Path' not found"

R.i.m.s.k.y. 08-02-2012 12:02 1854070

Цитата:

Цитата vitl
Теперь другая ошибка:
"Required function or procedure 'Path' not found" »

да она же в примере вверху!
Код:

function Path(): String;
begin
if (Length(DriveLetter) > 0) then Result := DriveLetter +':\' else Result := ExpandConstant('{tmp}');
end;

на каком этапе ошибка, компиляции или уже выполнения инсталлера?

vitl 08-02-2012 12:55 1854103

Цитата:

Цитата R.i.m.s.k.y.
на каком этапе ошибка, компиляции или уже выполнения инсталлера? »

На этапе компиляции.

R.i.m.s.k.y. 08-02-2012 13:02 1854113

значит требуемой процедуры нет
полный код

vitl 08-02-2012 13:35 1854148

R.i.m.s.k.y.
Код:


[Setup]
AppName=Обновление Флеш-версии
AppVerName=Обновление
DefaultDirName={code:Path}
DisableStartupPrompt=yes
DisableReadyPage=yes
; DisableFinishedPage=yes
DisableDirPage=True
DisableProgramGroupPage=yes
OutputBaseFilename=Updater_Fl
Compression=lzma
SolidCompression=yes
Uninstallable=false
WizardImageFile=SFXLogo3.bmp

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

[Files]
; Source: "{src}\utils\*"; DestDir: "{app}\"; Flags: external recursesubdirs skipifsourcedoesntexist

Source: filenull; DestDir: {tmp}; BeforeInstall: BackUp; Flags: ignoreversion
Source: Settings\Client\*; DestDir: {app}\Settings\Client\; BeforeInstall: ChangeCaption('\Settings\Client\'); Flags: ignoreversion recursesubdirs createallsubdirs
Source: utils\; DestDir: {app}\utils\; BeforeInstall: ChangeCaption('\utils\'); Flags: ignoreversion recursesubdirs createallsubdirs



[*Code]

var DriveLetter : char;

procedure ChangeCaption(str: string);
    begin
    WizardForm.StatusLabel.Caption:= str;
end;

Function InitializeSetup: Boolean;
var i : Integer;
begin
DriveLetter := ''; i:= Ord('a');
while ( (Length(DriveLetter)=0) or (i<=Ord('z')) )
do begin
if FileExists(Chr(i)+':\markerfile') then DriveLetter := Chr(i);
i := i +1;
end;
if (Length(DriveLetter) > 0 then Result := True
  else begin
  MsgBox('флэшка не найдена', mbError, mb_Ok);
  Result := False;
  end;
end;

function Path(): String;
begin
if (Length(DriveLetter) > 0) then Result := DriveLetter +':\' else Result := ExpandConstant('{tmp}');
end;

procedure copyfiles(fromfile, tofile:string);
var res : integer;
begin
  Exec('cmd.exe', ' /c copy /Y ' + AddQuotes(fromfile) + ' ' + AddQuotes(tofile),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

Procedure backUp();
begin
ChangeCaption('BackUp')
If DirExists (DriveLetter +':\'+'Settings\Client\') then copyfiles(DriveLetter +':\'+'Settings\Client\', DriveLetter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\Settings\Client\');
if DirExists (DriveLetter +':\'+'utils\') then copyfiles(DriveLetter +':\'+'utils\', DriveLetter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\utils\');
end;


R.i.m.s.k.y. 08-02-2012 14:40 1854194

vitl,
код рабочий джигурда процентов
Код:


[Setup]
AppName=Обновление Флеш-версии
AppVerName=Обновление
UsePreviousAppDir=no
AppendDefaultDirName=no
AllowRootDirectory=yes
DirExistsWarning=no
DefaultDirName={code:Pathapp}
DisableStartupPrompt=yes
DisableReadyPage=yes
; DisableFinishedPage=yes
DisableDirPage=True
DisableProgramGroupPage=yes
OutputBaseFilename=Updater_Fl
Compression=lzma
SolidCompression=yes
Uninstallable=false
//WizardImageFile=SFXLogo3.bmp

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

[Files]
; Source: "{src}\utils\*"; DestDir: "{app}\"; Flags: external recursesubdirs skipifsourcedoesntexist

Source: filenull; DestDir: {tmp}; BeforeInstall: BackUp; Flags: ignoreversion
Source: Settings\Client\*; DestDir: {app}\Settings\Client\; BeforeInstall: ChangeCaption('\Settings\Client\'); Flags: ignoreversion recursesubdirs createallsubdirs
Source: utils\; DestDir: {app}\utils\; BeforeInstall: ChangeCaption('\utils\'); Flags: ignoreversion recursesubdirs createallsubdirs


[*Code]

var Drive_Letter : string;

procedure ChangeCaption(str: string);
    begin
    WizardForm.StatusLabel.Caption:= str;
end;

Function InitializeSetup: Boolean;
var i : Integer;
begin
Drive_Letter := ''; i:= Ord('a');
while ( (Length(Drive_Letter)=0) and (i<=Ord('z')) )
do begin
if FileExists(Chr(i)+':\markerfile') then Drive_Letter := Chr(i);
i := i +1;
end;
if (Length(Drive_Letter) > 0) then begin
  Result := True
  end
  else begin
  MsgBox('флэшка не найдена', mbError, mb_Ok);
  Result := False;
  end;
end;

function Pathapp(String:String): String;
begin
if (Length(Drive_Letter) > 0) then Result := Drive_Letter +':\' else Result := ExpandConstant('{tmp}');
end;

procedure copyfiles(fromfile, tofile:string);
var res : integer;
begin
  Exec('cmd.exe', ' /c xcopy /Y ' + AddQuotes(fromfile) + ' ' + AddQuotes(tofile),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

Procedure backUp();
begin
ChangeCaption('BackUp');
If DirExists (Drive_Letter +':\'+'Settings\Client\') then copyfiles(Drive_Letter +':\'+'Settings\Client\*', Drive_Letter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\Settings\Client\');
if DirExists (Drive_Letter +':\'+'utils\') then copyfiles(Drive_Letter +':\'+'utils\*', Drive_Letter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\utils\');
end;


vitl 08-02-2012 18:48 1854362

Цитата:

Цитата R.i.m.s.k.y.
[*Code] »

1.) Заработало, когда исправил на [code]
Спасибо, R.i.m.s.k.y.

2.) Но почему то не обновляются файлы (при запуске готового EXE-ка), а только бэкапятся. В чем м.б. проблема? При компиляции такого нет.

3.) Что делает код? (см. ниже)
Цитата:

Цитата R.i.m.s.k.y.
Source: filenull; DestDir: {tmp}; BeforeInstall: BackUp; Flags: ignoreversion »

4.) Еще вопрос по тому-же скрипту: что изменить в коде, чтобы копировались в backup только те файлы, которые обновляются?

R.i.m.s.k.y. 08-02-2012 21:41 1854461

vitl,
1. пожалуйста
2. строчка Source: Settings\Client\*; DestDir: {app}\Settings\Client\; копирует обновления, проверяйте пути, можно в ее изменить, добавить AfterInstall: MsgBox(ExpandConstant('{app}\Settings\Client\'), mbError, mb_Ok) - будет выводится путь куда пишется, хотя это должно писаться над зеленой колбасой
3. бэкапит, nullfile - любой левый мелкий файлик, можно и через CurStepChanged, но это следующий уровень
4. писать руками имена файлов в Procedure backUp()

vitl 08-02-2012 22:11 1854469

Цитата:

Цитата R.i.m.s.k.y.
проверяйте пути, можно в ее изменить »

1.) а можно ли организовать все так:
на одном уровне с ЕХЕ-ком положить каталог UPD\, который содержит обновленные папки с файлами (т.е. Settings\Client\ и UTILS\), как и в корне флешки?
Чтобы из UPD\ подхватывались обновления - чтобы не дописывать каждый раз скрипт при изменении в последующих обновлениях.
Т.е. в дистрибе с обновлениями папка UPD\ будет повторять корень флешки.

2.) Еще вопрос по тому-же скрипту: что изменить в коде, чтобы копировались в backup только те файлы, которые обновляются?

R.i.m.s.k.y. 08-02-2012 22:26 1854476

vitl,
1. Source: {src}\upd\Settings\Client\*; ... Flags: external
2. см 4 выше, ручками дописываешь в процедуру backup в copyfiles(Drive_Letter +':\'+'Settings\Client\file1', Drive_Letter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\Settings\Client\');
Можно конечно замутить опрос в цикле {src} и бэкап, но а) сложность не оправдывается целями ибо б) полные бэкапы спасут мир, а инкрементные следует предать анафеме

gvshil 09-02-2012 02:01 1854561

Прошу помощи:

Во время установки запускается процесс, нужно дождаться появления его окна и убить процесс.

читать дальше »
[Run]
Filename: {app}\MyProg.exe; Parameters: -init
Filename: {sys}\taskkill.exe; Parameters: /f /im MyProg.exe; Flags: runhidden waituntilidle

Не убивается процесс.

R.i.m.s.k.y. 09-02-2012 08:10 1854611

gvshil, а что делает точка с запятой в имени экзешника?

gvshil 09-02-2012 08:19 1854613

Цитата:

Цитата R.i.m.s.k.y.
а что делает точка с запятой в имени экзешника? »

Да это опечатка, в скрипте MyProg.exe;

R.i.m.s.k.y. 09-02-2012 08:28 1854616

gvshil,
а руками из комстроки он прибивается?

gvshil 09-02-2012 08:45 1854626

R.i.m.s.k.y.
Отписал в РМ.

R.i.m.s.k.y. 09-02-2012 08:48 1854628

gvshil, на тематические вопросы отвечаю в темах
сам прибиваю также, через taskkill

Gugle 09-02-2012 12:07 1854716

Доброго времени суток!
Подскажите как можно проверить создана Panel или нет?

Что то типа:
Код:

[*code]
VAR
  panel: TPanel;

....

PROCEDURE Test();
BEGIN
  if (panel = null) then begin
    panel := TPanel.Create(WizardForm);
  end;
END;


YURSHAT 09-02-2012 13:36 1854776

Цитата:

Цитата Gugle
Подскажите как можно проверить создана Panel или нет? »

А не проще ли создавать панель если удовлетворяется условие для ее создания? То есть ""если мое условие удовлетворяется - panel := TPanel.Create(WizardForm)... и т.д.""

А так, какой смысл создавать элемент, который не используется?

Gugle 09-02-2012 14:41 1854814

Нет не проще. Панелька может создаваться при выполнении нескольких не взаимосвязанных условиях.

R.i.m.s.k.y. 09-02-2012 14:48 1854824

Gugle, я в таких случаях делаю проще:
1. объявляю глобальную переменную типа integer, к примеру var panelka_goooogle : integer;
2. в InitializeSetup присваиваю ей -1 panelka_goooogle := -1// переменная неопределена
3. в процедуре где создается твоя панелька делаю уже panelka_goooogle := 1 если панелька дропается или еще какие уловия panelka_goooogle := 0, 2, 3...
4. где нужна проверка на панельку if (panelka_goooogle = 1) then... )[/off]

Serega 10-02-2012 15:29 1855633

Цитата:

Цитата YURSHAT
А не проще ли создавать панель если удовлетворяется условие для ее создания? »

Полностью согласен, но видимо Gugle требуется доп. проверка...
Цитата:

Цитата Gugle
Подскажите как можно проверить создана Panel или нет? »

Всё просто:
читать дальше »

Код:

var
  panel: TPanel;

procedure InitializeWizard;
begin
  panel := nil; // укажем, что объект ещё не создан...
end;

procedure Test;
begin
  if panel = nil then
    begin
      panel := TPanel.Create(WizardForm);
      // и т.д. и т.п.
    end;
end;


Serega 10-02-2012 15:57 1855649

Цитата:

Цитата Johny777
как в BeforeInstall записать 2 параметра? »

Вы немного путаете, две функции в одну строку нельзя.
Цитата:

Цитата Johny777
в справке говорится, что через запятую, но у меня это не работает »

В справке говорится, что вы можете передать несколько параметров одной функции, которые будут разделены запятыми.
Цитата:

Цитата Johny777
с этой проблемой столкнулся, когда объединял эти 2 кода »

Решается она просто:
читать дальше »

Код:

[Files]
Source: "{src}\*.exe"; DestDir: {app}; BeforeInstall: AddInfo('Откиньтесь на спинку кресла и наслаждайтесь!')
Source: "{src}\*.dll"; DestDir: {app}; BeforeInstall: AddInfo('Не забудьте зарегистрироваться')
Source: E:\Program\Inno Setup 5.3.8 Ext\*; DestDir: {app}; BeforeInstall: AddInfo(''); Flags: nocompression recursesubdirs createallsubdirs

[Code]
var
  FilesMemo: TMemo;

procedure AddInfo(s: string);
var
  AFile: string;
begin
  AFile := ExpandConstant(CurrentFilename);
  if ExtractFileExt(AFile) = '' then
    FilesMemo.Lines.Add('CreateFolder: ' + RemoveBackslash(AFile))
  else
    FilesMemo.Lines.Add('Extract: ' + AFile);
  if s <> '' then
    WizardForm.StatusLabel.Caption := s;
end;

procedure InitializeWizard();
begin
  FilesMemo := TMemo.Create(WizardForm);
  with FilesMemo do
    begin
      SetBounds(ScaleX(0), ScaleY(80), ScaleX(418), ScaleY(120));
      WordWrap := False;
      Parent := WizardForm.InstallingPage;
      ScrollBars := ssVertical;
      ReadOnly := True;
      Clear;
    end;
end;


Johny777 10-02-2012 17:11 1855703

Serega,
спасибо,
.................................................................................................... ............................
и ещё вопрос

как сделать, чтобы созданный мной сроллбокс в расширенной версии инно, в дизайнере
чтобы он прокручивался колесом мыши.
VertScrollBar.Tracking := True; не помогает
подозреваю, что не хватает какой-то функции

TROY Diamond 11-02-2012 13:32 1856202

Цитата:

Цитата Serega
можно через код...

Старый вопрос... а как?

Как "тихо" запустить определённый exe-шник, копируемый в папку установки, сразу же после его успешного копирования и потом закрыть его "автоматом", или после распаковки всех файлов приложения, НО ДО ЗАВЕРШЕНИЯ УСТАНОВКИ?

Ничего "криминального" - этот "файл" является небольшой родной "утилиткой", которая собирает определённые сведения о системе и прописывает необходимые данные в реестр в ветку устанавливаемого приложения.
Если есть какой-нибудь другой способ, то тоже неплохо.

Пробовал в секции Run - сначала запустить этот файл, а потом, убить его с помощью батника, в котором прописано "taskkill /f /im MyProg.exe" - НЕ получается, прога запускается и висит, батник не запускается, пока прогу НЕ закроешь, а мне ведь и НАДО ЕЁ закрыть!!!
Если поставить флаг "nowait", то он действительно НЕ ждёт и не даёт файлу даже запуститься...

читать дальше »
Почему-то НЕ работает флаг "runhidden", он не скрывает окно приложения и даже НЕ сворачивает с флагом "runminimized".
Этот флаг работает только для скрытия консольных окон что ли? Их он скрывает без проблем.
Помогите, пожалуйста!!! Может через секцию Code как-то можно сделать?


Пробовал так, тоже не получилось:

читать дальше »
Код:

function RunTask(FileName: string; bFullpath: Boolean): Boolean;
  external 'RunTask@{app}\ISTask.dll stdcall delayload;

function KillTask(ExeFileName: string): Integer;
  external 'KillTask@{app}\ISTask.dll stdcall delayload';

procedure CurStepChanged(CurStep: TSetupStep);
var
ResultCode:Integer;
begin
if CurStep = ssPostInstall then
begin
Exec(ExpandConstant('{app}\MyProg.exe'), '', ExpandConstant('{app}'), SW_Hide, ewWaitUntilTerminated, ResultCode);
  begin
    if RunTask('MyProg.exe', false) then
      KillTask('MyProg.exe');
    UnloadDll(ExpandConstant('{app}\ISTask.dll'));
  end;
end;



И так: Exec('taskkill', '/f /im MyProg.exe', '', SW_HIDE, ewWaitUntilTerminated, ErrorCode);

А также можно ли, чтобы данные в реестр вносились "в самом начале" или же "2 раза" или "по частям". Нужно, чтобы выбранный путь установки (папка назначения), внеслись в реестр ДО завершения установки.

TROY Diamond 11-02-2012 14:17 1856242

Serega

Вы как-то делали "фейковый" индикатор процесса, по типу IE. Есть ли сейчас какие-нибудь варианты и наработки?
Нужна индикация процесса во время установки дополнительного ПО - установка долгая минут 15...
Можете ли Вы "доработать" Ваш индикатор, "под секцию Code", а не "под Run"?

читать дальше »
Код:

function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

const
  PBM_SETMARQUEE = $040A;
  GWL_STYLE      = -16;
  PBS_MARQUEE    = $08;

var
  AnimatePb: TNewProgressBar;

procedure CreateAnimatePb;
begin
  AnimatePb := TNewProgressBar.Create(WizardForm);
  with AnimatePb do
    begin
      Parent := WizardForm.InstallingPage;
      SetBounds(WizardForm.ProgressGauge.Left, WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(-21),
                WizardForm.ProgressGauge.Width, WizardForm.ProgressGauge.Height);
      SetWindowLong (AnimatePb.Handle, GWL_STYLE, (GetWindowLong (AnimatePb.Handle, GWL_STYLE) or PBS_MARQUEE));
      SendMessage(AnimatePb.Handle, PBM_SETMARQUEE, 1, 20);
    end;
end;

procedure AnimatePbMsg(const msg: string);
begin
  if AnimatePb = nil then
    CreateAnimatePb;
  WizardForm.FilenameLabel.Caption := msg;
end;

procedure AnimatePbFree;
begin
  if AnimatePb <> nil then
    begin
      AnimatePb.Free;
      AnimatePb := nil;
    end;
end;



И действительно он НЕ работает на некоторых темах (скорее всего из-за того что они не подписанные/не официальные)... Работает на "стандартной" во всех ОС и на "Классической" - но бегунок двигается намного медленнее...

Beginner85 11-02-2012 17:59 1856397

Странно, но по всем темам не нашел такого простого варианта добавления правила в брандмауэр Windows:

Код:

[Run]
Filename: "netsh.exe"; Parameters: "firewall add allowedprogram ""{app}\MyApp.exe"" ""MyApp"" ENABLE ALL";

Ну да ладно, у меня другой вопрос. Кто-нибудь встречал скрипт для запуска гаджета в Windows 7 или Vista? Хочется как у каспера сделать, чтоб после установки он сразу появлялся на декстопе.

Ман есть тут, но вкурить не могу http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

R.i.m.s.k.y. 11-02-2012 19:40 1856448

подскажите, пожалуйста, есть ли способ узнать в инно есть ли интернет или нет

VASYAKRN 11-02-2012 20:37 1856492


Текстурируйте пожалуйста кнопку "Отменить распаковку" в скрипте
Ссылка

Gnom_aka_Lexander 11-02-2012 20:39 1856495

R.i.m.s.k.y., ТОлько через внешнюю длл-ку. у китайцев есть такая - webctrl - там есть такая проверка. Вручную тоже можно, есть примеры, но криво дюже они в инно работают...

ARS_23 11-02-2012 20:54 1856506

VASYAKRN,
надеюсь никто не станет тебе помогать :read:

Gnom_aka_Lexander 11-02-2012 20:56 1856508

Цитата:

Цитата VASYAKRN
Inno.at.ua - все о создании инсталляционных пакетов на Inno Setup »

Вчитайся - все о создании инсталляционных пакетов на Inno Setup. Тоесть, ты уже сам все знаеш, и способен помогать другим. посему, помогай себе сам.
Ах да, у тебя-же объявлено, что этот форум дал свое согласие на дружбу с твоим быдло-сайтом.
А раз так, то может тебе твой друг, уважаемый Vadikan поможет?

VASYAKRN 11-02-2012 21:08 1856517

Лександер, Ничего не понял, что ты написал, но обращу внимание

ARS_23 11-02-2012 21:12 1856522

Цитата:

Цитата VASYAKRN
Ничего не понял, что ты написал, но обращу внимание »

конечно, куда ж тебе )

VASYAKRN 11-02-2012 21:25 1856530

Лександер,

Если ты не заметыл у меня там пишет "Ссылки"

Лександер, Кстати поставь счетчик на свой http://innoultra.ru/ и я хочу сравнть мой "быдло-сайт" с твоим

Gnom_aka_Lexander 11-02-2012 21:41 1856542

Цитата:

Цитата VASYAKRN
и я хочу сравнть мой "быдло-сайт" с твоим »

Я не умею читерить и накручитвать счетчики сообщений. потому не буду я с тобой письками меряться. При случае - морду набью - это да. А оффтопик считаю бессмысленным.
Цитата:

Если ты не заметыл у меня там пишет "Ссылки"

Не заметил

ARS_23 11-02-2012 21:43 1856545

мда, начался оффтоп. тему чистить надо))

VASYAKRN,
ох лол, быстренько переименовал "друзья сайта" на "ссылки" и пытается доказать что так и было. ужасный человек...

Цитата:

Цитата VASYAKRN
пол месеца назад »

Ты имел в виду полчаса назад? - Скрин на предыдущей странице сделан полчаса назад.

VASYAKRN 11-02-2012 21:46 1856547

Лександер, Ха-ха

ARS_23, я переимини гдето пол месеца назад

R.i.m.s.k.y. 13-02-2012 12:51 1857603

Помогите, пожалуйста, скриптом
Требуется в заданной строчке:string найти определенные слова из одной строки массива, кол-во слов может разное, хоть 0, но не больше 5.
Сам я заткнулся уже на объявлении array of string в 20 строк и 5 столбцов чтобы в цикле перебирать (в справке и примерах этого не нашел).

Пример массива:
['Москва','ул','Пушкарная','',''
'','','','',''
'','Ленинград','','пер','Московский'
...]
Пример строки '000000, Ленинград; улица московская 65-1985'

И соответсвенно как правильно заполнить в инно этот array

Заранее благодарю!

El Sanchez 13-02-2012 16:36 1857792

Цитата:

Цитата R.i.m.s.k.y.
подскажите, пожалуйста, есть ли способ узнать в инно есть ли интернет или нет »

Цитата:

Цитата Лександер
Вручную тоже можно, есть примеры, но криво дюже они в инно работают... »

В инно работают все, кривыми их уже мелкомягкие сделали, но не все. В ПМ мне уже задавали подобный вопрос, вот цитата:
Цитата:

Единственно правильный вариант - послать запрос и получить ответ. Вариантов несколько, попробуйте такой:
читать дальше »

Код:

type
  WSADATA = record
    wVersion: WORD;
    wHighVersion: WORD;
    szDescription: array [0..256] of char;
    szSystemStatus: array [0..128] of char;
    iMaxSockets: SmallInt;
    iMaxUdpDg: SmallInt;
    lpVendorInfo: Longint;
  end;

function WSAStartup(wVersionRequested: WORD; var lpWSAData: WSADATA): Integer; external 'WSAStartup@ws2_32.dll stdcall';
function gethostbyname(const name: String): DWORD; external 'gethostbyname@ws2_32.dll stdcall';
function WSACleanup(): Integer; external 'WSACleanup@ws2_32.dll stdcall';

function IsInternetActive(sURL: String): Boolean;
var
    wsa: WSADATA;
begin
    WSAStartup($101, wsa);
    Result := gethostbyname(sUrl) <> 0;
    WSACleanup();
end;

//результат TRUE - есть инет, False - нет, в качестве аргумента URL железобетонно работающего сайта
if IsInternetActive('www.microsoft.com') then
  MsgBox('on', mbInformation, MB_OK)
else
  MsgBox('off', mbInformation, MB_OK);


Конечно, есть варианты покороче с использованием других WinAPI-функций InternetGetConnectedState, InternetCheckConnection, IsNetworkAlive, но врут они в определенных ситуациях.
Цитата:

Цитата R.i.m.s.k.y.
Сам я заткнулся уже на объявлении array of string в 20 строк и 5 столбцов »

Цитата:

Цитата R.i.m.s.k.y.
И соответсвенно как правильно заполнить в инно этот array »

Код:

var
  i, j: Byte;
  arr: array [0..19] of array [0..4] of String;
...
arr[0][0] := 'test';
...
for i := 0 to 19 do for j := 0 to 4 do
begin
  MsgBox(arr[i][j], mbInformation, MB_OK);
end;


mariolast 13-02-2012 17:06 1857816

Лександер,
Что то не заметил в последней твоей сборке innocallback.dll
Пришлось самому ее докидывать в папку dll pack\

R.i.m.s.k.y. 13-02-2012 18:07 1857867

El Sanchez, два вопроса: 1) где взять ws2.dll и 2) можно ли определять таблицу в "человечьем" виде как в примере выше, а не по ячейкам отдельно (вопрос синтаксиса)

Serega 13-02-2012 19:13 1857911

Цитата:

Цитата Beginner85
Кто-нибудь встречал скрипт для запуска гаджета в Windows 7 или Vista? »

Я думаю, придётся писать свою dll'ку... код для Делфи можете глянуть здесь
Цитата:

Цитата R.i.m.s.k.y.
есть ли способ узнать в инно есть ли интернет или нет »

Цитата:

Цитата El Sanchez
Единственно правильный вариант - послать запрос и получить ответ »

На все 100% согласен.

El Sanchez 13-02-2012 22:17 1858050

Цитата:

Цитата R.i.m.s.k.y.
1) где взять ws2.dll »

ws2_32.dll - стандартная библиотека, другие не использую.
P.S. Почитал статейку, надо чего-нибудь другое придумать.

Цитата:

Цитата R.i.m.s.k.y.
2) можно ли определять таблицу в "человечьем" виде как в примере выше, а не по ячейкам отдельно (вопрос синтаксиса) »

Может без многомерных массивов можно обойтись?

Цитата:

Цитата Serega
Я думаю, придётся писать свою dll'ку... код для Делфи можете глянуть здесь »

Юникодный китайский Inno с интерфейсами может работать (см. CodeAutomation2.iss), можно попробовать портировать.

svensoft 14-02-2012 03:06 1858207

Подскажите пожайлуста, как сделать так, чтобы при инсталяции не создавался деинсталлятор ?..

И второй вопрос, как в разделе Files указать создание пустой папки (директории без файлов) ?..

Заранее благодарен за ответ.

Beginner85 14-02-2012 04:50 1858231

Цитата:

Цитата Serega
Я думаю, придётся писать свою dll'ку... код для Делфи можете глянуть здесь »

Цитата:

Цитата El Sanchez
Юникодный китайский Inno с интерфейсами может работать (см. CodeAutomation2.iss), можно попробовать портировать. »

Спасибо, господа. Будем пробовать.

R.i.m.s.k.y. 14-02-2012 08:09 1858271

Цитата:

Цитата El Sanchez
Может без многомерных массивов можно обойтись? »

тоже сначала хотел несколькоми одномерными массивами обойтись, криво выходит, в цикле перебирать тяжело, появляются многомерные вложенные if'ы, не кошер в общем.

Да и вообще на будущее, мало ли кому пригодится, такого вопроса еще никто не задавал, судя по поиску ;-)

elChoopacabra 14-02-2012 10:25 1858327

svensoft, как бы всё это в справке наличествует...
1.
[Setup]
Uninstallable=not

2. Указывается не в Files
[Dirs]
Name: "{app}\Data"

Gnom_aka_Lexander 14-02-2012 22:02 1858931

Ivan_009, Както так:
читать дальше »
[code]
Код:

const
  PCFonFLY=true;
  notPCFonFLY=false;
var
  BackPanel, WizardPanel, StatusPanel, ImagePanel: TPanel;
  CaptionLabel: TLabel; BmpFile: TBitmapImage;
  NeedSpaceLabel,FreeSpaceLabel: TLabel;
  FreeMB, TotalMB: Cardinal; NeedSize: Integer;
  LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
  ISDoneProgressBar1: TNewProgressBar;
#ifdef SecondProgressBar
  LabelPct2: TLabel;
  ISDoneProgressBar2:TNewProgressBar;
#endif
  MyCancelButton: TButton;
  ISDoneCancel:integer;
  ISDoneError:boolean;
  PCFVer:double;


type
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';

function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function IS7ZipExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'IS7zipExtract@files:ISDone.dll stdcall delayload';
function ISRarExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'ISRarExtract@files:ISDone.dll stdcall delayload';
function ISPrecompExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISPrecompExtract@files:ISDone.dll stdcall delayload';
function ISSRepExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISSrepExtract@files:ISDone.dll stdcall delayload';
function ISxDeltaExtract(CurComponent:Cardinal; PctOfTotal:double; minRAM,maxRAM:integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile:boolean):boolean; external 'ISxDeltaExtract@files:ISDone.dll stdcall delayload';
function ISPackZIP(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString;ComprLvl:integer; DeleteInFile:boolean):boolean; external 'ISPackZIP@files:ISDone.dll stdcall delayload';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):boolean; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall delayload';

function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer; external 'ISFindFiles@files:ISDone.dll stdcall delayload';
function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean; external 'ISPickFilename@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):PAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';

function SrepInit(TmpPath:PAnsiChar;VirtMem,MaxSave:Cardinal):boolean; external 'SrepInit@files:ISDone.dll stdcall delayload';
function PrecompInit(TmpPath:PAnsiChar;VirtMem:cardinal;PrecompVers:single):boolean; external 'PrecompInit@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';

procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
        SetLength(Result, Length(Result)-1);
End;

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
  if OveralPct<=1000 then ISDoneProgressBar1.Position := OveralPct;
  LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
#ifdef SecondProgressBar
  if CurrentPct<=1000 then ISDoneProgressBar2.Position := CurrentPct;
  LabelPct2.Caption := IntToStr(CurrentPct div 10)+'.'+chr(48 + CurrentPct mod 10)+'%';
#endif
  LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, LabelCurrFileName.Font, LabelCurrFileName.Width-ScaleX(100));
  LabelTime1.Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
  LabelTime2.Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
  LabelTime3.Caption:=ExpandConstant('{cm:AllElapsedTime}')+TimeStr3;
  Result := ISDoneCancel;
end;

procedure CancelButtonOnClick(Sender: TObject);
begin
  SuspendProc;
  if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
  ResumeProc;
end;

procedure HideControls;
begin
  WizardForm.FileNamelabel.Hide;
  ISDoneProgressBar1.Hide;
  LabelPct1.Hide;
  LabelCurrFileName.Hide;
  LabelTime1.Hide;
  LabelTime2.Hide;
  MyCancelButton.Hide;
#ifdef SecondProgressBar
  ISDoneProgressBar2.Hide;
  LabelPct2.Hide;
#endif
end;

procedure CreateControls;
var PBTop:integer;
begin
  PBTop:=ScaleY(50);
  ISDoneProgressBar1 := TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar1 do begin
    Parent  := WizardForm.InstallingPage;
    Height  := WizardForm.ProgressGauge.Height;
    Left    := ScaleX(0);
    Top      := PBTop;
    Width    := ScaleX(365);
    Max      := 1000;
  end;
  LabelPct1 := TLabel.Create(WizardForm);
  with LabelPct1 do begin
    Parent    := WizardForm.InstallingPage;
    AutoSize  := False;
    Left      := ISDoneProgressBar1.Width+ScaleX(5);
    Top      := ISDoneProgressBar1.Top + ScaleY(2);
    Width    := ScaleX(80);
  end;
  LabelCurrFileName := TLabel.Create(WizardForm);
  with LabelCurrFileName do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := ISDoneProgressBar1.Width+ScaleX(30);
    Left    := ScaleX(0);
    Top      := ScaleY(30);
  end;
#ifdef SecondProgressBar
  PBTop:=PBTop+ScaleY(25);
  ISDoneProgressBar2 := TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar2 do begin
    Parent  := WizardForm.InstallingPage;
    Left    := ScaleX(0);
    Top      := PBTop+ScaleY(8);
    Width    := ISDoneProgressBar1.Width;
    Max      := 1000;
    Height  := WizardForm.ProgressGauge.Height;
  end;
  LabelPct2 := TLabel.Create(WizardForm);
  with LabelPct2 do begin
    Parent    := WizardForm.InstallingPage;
    AutoSize  := False;
    Left      := ISDoneProgressBar2.Width+ScaleX(5);
    Top      := ISDoneProgressBar2.Top + ScaleY(2);
    Width    := ScaleX(80);
  end;
#endif
  LabelTime1 := TLabel.Create(WizardForm);
  with LabelTime1 do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := ISDoneProgressBar1.Width div 2;
    Left    := ScaleX(0);
    Top      := PBTop + ScaleY(35);
  end;
  LabelTime2 := TLabel.Create(WizardForm);
  with LabelTime2 do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := LabelTime1.Width+ScaleX(40);
    Left    := ISDoneProgressBar1.Width div 2;
    Top      := LabelTime1.Top;
  end;
  LabelTime3 := TLabel.Create(WizardForm);
  with LabelTime3 do begin
    Parent  := WizardForm.FinishedPage;
    AutoSize := False;
    Width    := 300;
    Left    := 180;
    Top      := 200;
  end;
  MyCancelButton:=TButton.Create(WizardForm);
  with MyCancelButton do begin
    Parent:=WizardForm;
    Width:=ScaleX(135);
    Caption:=ExpandConstant('{cm:CancelButton}');
    Left:=ScaleX(360);
    Top:=WizardForm.cancelbutton.top;
    OnClick:=@CancelButtonOnClick;
  end;
end;

function CheckError:boolean;
begin
  result:= not ISDoneError;
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB > 1024 then
    FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSize} ')+ NumToStr(round(FreeMB/1024*100)/100) + ' Гб' else
    FreeSpaceLabel.Caption := ExpandConstant('{cm:FreeSize} ')+ IntToStr(FreeMB)+ ' Мб';
  if FreeMB < NeedSize then
    WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True;
end;

procedure GetNeedSpaceCaption;
begin
  if NeedSize > 1024 then
    NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSize} ')+ NumToStr(round(NeedSize/1024*100)/100) + ' Гб' else
  NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSize} ')+ IntToStr(NeedSize)+ ' Мб';
end;

function InitializeSetup(): Boolean;
begin
  ExtractTemporaryFile('Tiger.cjstyles');
  LoadSkin(ExpandConstant('{tmp}\Tiger.cjstyles'), '');
  Result := True;
end;

procedure DeinitializeSetup();
begin
  ShowWindow(StrToInt(ExpandConstant('{wizardhwnd}')), 0);
  UnloadSkin();
end;

procedure InitializeWizard();
begin
  NeedSize:= {#NeedSize};

  ExtractTemporaryFile('Image1.bmp')
  ExtractTemporaryFile('Image2.bmp')
  ExtractTemporaryFile('Image3.bmp')
  ExtractTemporaryFile('Image4.bmp')

  WizardForm.ClientWidth:= ScaleX(800);
  WizardForm.ClientHeight:= ScaleY(620);
  WizardForm.Position:= poScreenCenter;

  WizardForm.InnerNotebook.Hide;
  WizardForm.OuterNotebook.Hide;
  WizardForm.Font.Name:= 'Georgia';

  BackPanel:= TPanel.Create(WizardForm)
  BackPanel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(800), ScaleY(618))
  BackPanel.Color:= clWhite
  BackPanel.BorderStyle:= bsNone
  BackPanel.ParentBackground:= False
  BackPanel.ParentColor:= False
  BackPanel.Parent:= WizardForm

  StatusPanel:= TPanel.Create(WizardForm)
  StatusPanel.SetBounds(ScaleX(2), ScaleY(2), ScaleX(796), ScaleY(18))
  StatusPanel.BorderStyle:= bsNone
  StatusPanel.ParentBackground:= False
  StatusPanel.ParentColor:= False
  StatusPanel.Font.Color:= clWhite
  StatusPanel.Font.Size:= 12
  StatusPanel.Font.Style:= [fsBold]
  StatusPanel.Font.Name:= 'Times New Roman'
  StatusPanel.Alignment:= taCenter
  StatusPanel.Parent:= WizardForm

  ImagePanel:= TPanel.Create(WizardForm)
  ImagePanel.SetBounds(ScaleX(2), ScaleY(21), ScaleX(796), ScaleY(484))
  ImagePanel.BorderStyle:= bsNone
  ImagePanel.ParentBackground:= False
  ImagePanel.ParentColor:= False
  ImagePanel.Parent:= WizardForm

  BmpFile:= TBitmapImage.Create(WizardForm)
  BmpFile.Stretch:= True;
  BmpFile.SetBounds(ScaleX(0),ScaleY(0), ScaleX(796), ScaleY(484))
  BmpFile.Parent:= ImagePanel

  WizardPanel:= TPanel.Create(WizardForm)
  WizardPanel.SetBounds(ScaleX(2), ScaleY(506), ScaleX(796), ScaleY(110))
  WizardPanel.Alignment:= taCenter;
  WizardPanel.BorderStyle:= bsNone
  WizardPanel.ParentBackground:= False
  WizardPanel.ParentColor:= False
  WizardPanel.Parent:= WizardForm

  CaptionLabel:= TLabel.Create(WizardForm);
  CaptionLabel.SetBounds(ScaleX(100), ScaleY(5), ScaleX(590), ScaleY(100));
  CaptionLabel.AutoSize:= False;
  CaptionLabel.WordWrap:= True;
  CaptionLabel.Transparent:= True;
  CaptionLabel.Font.Color:= $5F8BA2
  CaptionLabel.Font.Size:= 11
  CaptionLabel.Font.Style:= [fsBold]
  CaptionLabel.Alignment:= taCenter;
  CaptionLabel.Parent:= WizardPanel;

  NeedSpaceLabel:= TLabel.Create(WizardForm);
  NeedSpaceLabel.SetBounds(ScaleX(5),ScaleY(70),ScaleX(300),ScaleY(20))
  NeedSpaceLabel.Transparent:= True;
  NeedSpaceLabel.Font.Style:= [fsBold]
  NeedSpaceLabel.Parent:= WizardPanel

  FreeSpaceLabel:= TLabel.Create(WizardForm);
  FreeSpaceLabel.SetBounds(ScaleX(250), ScaleY(70), ScaleX(300),ScaleY(20))
  FreeSpaceLabel.Transparent:= True;
  FreeSpaceLabel.Font.Style:= [fsBold]
  FreeSpaceLabel.Parent:= WizardPanel

  WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;

  WizardForm.DirBrowseButton.Parent:= WizardForm
  WizardForm.DirBrowseButton.Left:= ScaleX(455)
  WizardForm.DirBrowseButton.Top:= ScaleY(590)
  WizardForm.DirBrowseButton.Font.Size:= 8
  WizardForm.DirBrowseButton.Font.Style:= [fsBold]

  WizardForm.DirEdit.Parent:= WizardForm
  WizardForm.DirEdit.Left:= ScaleX(5)
  WizardForm.DirEdit.Top:= ScaleY(590)
  WizardForm.DirEdit.Width:= ScaleX(445)
  WizardForm.DirEdit.Font.Size:= 8
  WizardForm.DirEdit.Font.Style:= [fsBold]

  WizardForm.ProgressGauge.Parent:= WizardForm
  WizardForm.ProgressGauge.Left:= ScaleX(5)
  WizardForm.ProgressGauge.Top:= ScaleY(590)
  WizardForm.ProgressGauge.Width:= ScaleX(450)

  WizardForm.StatusLabel.Parent:= WizardPanel
  WizardForm.StatusLabel.SetBounds(ScaleX(5), ScaleY(52), ScaleX(300), ScaleY(20))
  WizardForm.StatusLabel.Font.Style:= [fsBold]

  WizardForm.FilenameLabel.Parent:= WizardPanel
  WizardForm.FilenameLabel.SetBounds(ScaleX(5), ScaleY(68), ScaleX(450), ScaleY(20))
  WizardForm.FilenameLabel.Font.Style:= [fsBold]

  WizardForm.CancelButton.BringToFront;
  WizardForm.CancelButton.Left:= ScaleX(715)
  WizardForm.CancelButton.Top:= ScaleY(590)
  WizardForm.CancelButton.Font.Size:= 8
  WizardForm.CancelButton.Font.Style:= [fsBold]

  WizardForm.NextButton.BringToFront;
  WizardForm.NextButton.Left:= ScaleX(630)
  WizardForm.NextButton.Top:= ScaleY(590)
  WizardForm.NextButton.Font.Size:= 8
  WizardForm.NextButton.Font.Style:= [fsBold]

  WizardForm.BackButton.BringToFront;
  WizardForm.BackButton.Left:= ScaleX(545)
  WizardForm.BackButton.Top:= ScaleY(590)
  WizardForm.BackButton.Font.Size:= 8
  WizardForm.BackButton.Font.Style:= [fsBold]
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  WizardForm.DirEdit.Hide; WizardForm.DirBrowseButton.Hide;
  WizardForm.Progressgauge.Hide; WizardForm.StatusLabel.Hide;
  WizardForm.FilenameLabel.Hide; FreeSpaceLabel.Hide;
  NeedSpaceLabel.Hide;
  case CurPageID of
  wpWelcome:
    begin
      CaptionLabel.Caption:= ExpandConstant('{cm:Welcome}')
      StatusPanel.Caption:= 'Приветствие'
      BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image1.bmp'))
    end;
  wpSelectDir:
    begin
      WizardForm.DirEdit.Show; WizardForm.DirBrowseButton.Show;
      FreeSpaceLabel.Show; NeedSpaceLabel.Show;
      CaptionLabel.Caption:= ExpandConstant('{cm:SelectDir}')
      StatusPanel.Caption:= 'Подготовка к установке'
      WizardForm.NextButton.Caption:= 'Установить'
      BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image2.bmp'))
      GetNeedSpaceCaption; if FreeMB < NeedSize then WizardForm.NextButton.Enabled:=False;
    end;
  wpInstalling:
    begin
      WizardForm.Progressgauge.Show; WizardForm.StatusLabel.Show;
      WizardForm.FilenameLabel.Show;
      CaptionLabel.Caption:= ExpandConstant('{cm:Installing}')
      StatusPanel.Caption:= 'Установка'
      BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image3.bmp'))
    end;
  wpFinished:
    begin
      if ISDoneError then
      begin
        LabelTime3.Hide;
        WizardForm.Caption:= ExpandConstant('{cm:Error}');
        WizardForm.FinishedLabel.Font.Color:= clRed;
        WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
      end;
      CaptionLabel.Caption:= ExpandConstant('{cm:Finished}')
      StatusPanel.Caption:= 'Завершение'
      BmpFile.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Image4.bmp'))
    end;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var Comps1,Comps2,Comps3, TmpValue:cardinal;
    FindHandle1,ColFiles1,CurIndex1,tmp:integer;
    ExecError:boolean;
    InFilePath,OutFilePath,OutFileName:PAnsiChar;
begin
  if CurStep = ssInstall then begin  //Если необходимо, можно поменять на ssPostInstall
    WizardForm.ProgressGauge.Hide;
    WizardForm.CancelButton.Hide;
    CreateControls;
    WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
    ISDoneCancel:=0;

// Распаковка всех необходимых файлов в папку {tmp}.

  ExtractTemporaryFile('unarc.dll');

  #ifdef PrecompInside
  ExtractTemporaryFile('CLS-precomp.dll');
  ExtractTemporaryFile('packjpg_dll.dll');
  ExtractTemporaryFile('packjpg_dll1.dll');
  ExtractTemporaryFile('precomp.exe');
  ExtractTemporaryFile('zlib1.dll');
  #endif
  #ifdef SrepInside
  ExtractTemporaryFile('CLS-srep.dll');
  #endif
  #ifdef MSCInside
  ExtractTemporaryFile('CLS-MSC.dll');
  #endif
  #ifdef facompress
      ExtractTemporaryFile('facompress.dll'); //ускоряет распаковку .arc архивов.
  #endif
  #ifdef records
      ExtractTemporaryFile('records.inf');
  #endif
  #ifdef precomp
    #if precomp == "0.38"
      ExtractTemporaryFile('precomp038.exe');
    #else
      #if precomp == "0.4"
        ExtractTemporaryFile('precomp040.exe');
      #else
        #if precomp == "0.41"
          ExtractTemporaryFile('precomp041.exe');
        #else
          #if precomp == "0.42"
            ExtractTemporaryFile('precomp042.exe');
          #else
            ExtractTemporaryFile('precomp038.exe');
            ExtractTemporaryFile('precomp040.exe');
            ExtractTemporaryFile('precomp041.exe');
            ExtractTemporaryFile('precomp042.exe');
          #endif
        #endif
      #endif
    #endif
  #endif
  #ifdef unrar
      ExtractTemporaryFile('Unrar.dll');
  #endif
  #ifdef XDelta
      ExtractTemporaryFile('XDelta3.dll');
  #endif
  #ifdef PackZIP
      ExtractTemporaryFile('7z.dll');
      ExtractTemporaryFile('PackZIP.exe');
  #endif

    ExtractTemporaryFile('English.ini');

// Подготавливаем переменную, содержащую всю информацию о выделенных компонентах для ISDone.dll
// максимум 96 компонентов.
    Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
    TmpValue:=1;
    if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue;    //компонент 1
    TmpValue:=TmpValue*2;
    if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue;    //компонент 2
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue;    //компонент 3
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue;    //компонент 4
//    .....
// см. справку
#endif

#ifdef precomp
  PCFVer:={#precomp};
#else
  PCFVer:=0;
#endif
    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
      repeat
//        ChangeLanguage('English');
        if not SrepInit('',512,0) then break;
        if not PrecompInit('',128,PCFVer) then break;
        if not FileSearchInit(true) then break;

        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\*.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

//    далее находятся закомментированые примеры различных функций распаковки (чтобы каждый раз не лазить в справку за примерами)
(*
        if not ISArcExtract    ( 0, 0, ExpandConstant('{src}\arc.arc'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
        if not IS7ZipExtract  ( 0, 0, ExpandConstant('{src}\CODMW2.7z'), ExpandConstant('{app}\data1'), false, '') then break;
        if not ISRarExtract    ( 0, 0, ExpandConstant('{src}\data_*.rar'), ExpandConstant('{app}'), false, '') then break;
        if not ISSRepExtract  ( 0, 0, ExpandConstant('{app}\data1024_1024.srep'),ExpandConstant('{app}\data1024.arc'), true) then break;
        if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\data.pcf'),    ExpandConstant('{app}\data.7z'), true) then break;
        if not ISxDeltaExtract ( 0, 0, 0, 640, ExpandConstant('{app}\in.pcf'), ExpandConstant('{app}\*.diff'),  ExpandConstant('{app}\out.dat'), false, false) then break;
        if not ISPackZIP      ( 0, 0, ExpandConstant('{app}\1a1\*'), ExpandConstant('{app}\1a1.pak'), 2, false ) then break;
        if not ISExec          ( 0, 0, 0, ExpandConstant('{tmp}\Arc.exe'), ExpandConstant('x -o+ "{src}\001.arc" "{app}\"'), ExpandConstant('{tmp}'), '...',false) then break;
        if not ShowChangeDiskWindow ('Пожалуйста, вставьте второй диск и дождитесь его инициализации.', ExpandConstant('{src}'),'CODMW_2.arc') then break;

//    распаковка группы файлов посредством внешнего приложения

        FindHandle1:=ISFindFiles(0,ExpandConstant('{app}\*.ogg'),ColFiles1);
        ExecError:=false;
        while not ExecError and ISPickFilename(FindHandle1,ExpandConstant('{app}\'),CurIndex1,true) do begin
          InFilePath:=ISGetName(0);
          OutFilePath:=ISGetName(1);
          OutFileName:=ISGetName(2);
          ExecError:=not ISExec(0, 0, 0, ExpandConstant('{tmp}\oggdec.exe'), '"'+InFilePath+'" -w "'+OutFilePath+'"',ExpandConstant('{tmp}'),OutFileName,false);
        end;
        ISFindFree(FindHandle1);
        if ExecError then break;
*)

        ISDoneError:=false;
      until true;
      ISDoneStop;
    end;
    HideControls;
    WizardForm.CancelButton.Visible:=true;
    WizardForm.CancelButton.Enabled:=false;
  end;
  if (CurStep=ssPostInstall) and ISDoneError then begin
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
  end;
end;

Остальные секции сам добавишь - файлы, ярлыки, и тому подобное. в коде для работы требуются много файлов - они были прописаны в обоих скриптах, эти секции нужно объединять вручную.

Gnom_aka_Lexander 14-02-2012 23:37 1858989

Цитата:

Цитата Ivan_009
почемуто щас другая ошибка »

Забыл внести этот месседж из старого скрипта. Смотри в изначальных скриптах секцию CustmMessages - там лекарство от твоей ошибки. А еще, терзают меня смутные сомненья, что справку забыл ты почитать, сев за изучение инно...

Ivan_009 15-02-2012 16:08 1859435

но почемуто невидно прогресс бара и процентов распаковки

alert30 15-02-2012 16:49 1859471

Ivan_009, похоже много скриптов в Inno Setup впихал, поэтому и потеряно прогресс-бар.

El Sanchez 16-02-2012 13:09 1860073

Цитата:

Цитата R.i.m.s.k.y.
тоже сначала хотел несколькоми одномерными массивами обойтись, криво выходит, в цикле перебирать тяжело, появляются многомерные вложенные if'ы, не кошер в общем. »

R.i.m.s.k.y., как-то не вяжется пример массива c "5 столбцов", здесь их больше.
Цитата:

Цитата R.i.m.s.k.y.
Пример массива:
['Москва','ул','Пушкарная','',''
'','','','',''
'','Ленинград','','пер','Московский'
...] »


R.i.m.s.k.y., вариант №2 способа узнать есть ли Интернет:
IsInternetActive.iss

Код:

[code]
const
    INTERNET_OPEN_TYPE_PRECONFIG = 0;
    INTERNET_FLAG_NO_CACHE_WRITE = $4000000;
    INTERNET_FLAG_PRAGMA_NOCACHE = $100;
    INTERNET_FLAG_RELOAD = $80000000;
    HTTP_QUERY_STATUS_CODE = 19;
    HTTP_STATUS_OK = 200;

function InternetOpen(lpszAgent: String; dwAccessType: DWORD; lpszProxyName, lpszProxyBypass: Variant; dwFlags: DWORD): Integer; external 'InternetOpenA@wininet.dll stdcall';
function InternetOpenUrl(hInternet: Integer; lpszUrl, lpszHeaders: String; dwHeadersLength, dwFlags: DWORD; dwContext: Integer): Integer; external 'InternetOpenUrlA@wininet.dll stdcall';
function InternetCloseHandle(hInternet: Integer): Boolean; external 'InternetCloseHandle@wininet.dll stdcall';
function HttpQueryInfo(hRequest: Integer; dwInfoLevel: DWORD; var lpvBuffer: Char; var lpdwBufferLength: DWORD; var lpdwIndex: DWORD): Boolean; external 'HttpQueryInfoA@wininet.dll stdcall';


function IsInternetActive(): Boolean;
var
    hInt, hFile: Integer;
    lpBuffer: array [0..3] of Char;
    lpdwIndex, lpdwBufferLength: DWORD;
begin
    try
        hInt := InternetOpen('', INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
        if hInt <> 0 then
        try
            hFile := InternetOpenUrl(hInt, 'http://microsoft.com', '', 0, INTERNET_FLAG_NO_CACHE_WRITE or INTERNET_FLAG_RELOAD or INTERNET_FLAG_PRAGMA_NOCACHE, 0);
            lpdwIndex := 0;
            lpdwBufferLength := sizeof(lpBuffer);
            if HttpQueryInfo(hFile, HTTP_QUERY_STATUS_CODE, lpBuffer[0], lpdwBufferLength, lpdwIndex) then
                Result := StrToInt(lpBuffer[0]+lpBuffer[1]+lpBuffer[2]) = HTTP_STATUS_OK;
        finally
            InternetCloseHandle(hFile);
        end;
    finally
        InternetCloseHandle(hInt);
    end;
end;

procedure InitializeWizard();
begin
    if IsInternetActive() then
        MsgBox('yes', mbInformation, MB_OK)
    else
        MsgBox('no', mbInformation, MB_OK);
end;



Цитата:

Цитата El Sanchez
Юникодный китайский Inno с интерфейсами может работать (см. CodeAutomation2.iss), можно попробовать портировать. »

Beginner85, попробовал - не получилось, либо access denied, либо чего-то там про токены. :(

R.i.m.s.k.y. 16-02-2012 13:23 1860078

Цитата:

Цитата El Sanchez
как-то не вяжется пример массива c "5 столбцов", здесь их больше »

а сколько их? в моем примере 3 строки 5 столбцов
блин в справке про синтаксис вообще по нулям, мой вопрос простой - как забить в Инно двумерный массив не каждую ячейку поотдельности, а общим видом
Если б я знал как правильно я бы и не спрашивал

Gnom_aka_Lexander 16-02-2012 13:51 1860098

Вложений: 1
Цитата:

Цитата El Sanchez
попробовал - не получилось, либо access denied, либо чего-то там про токены. »

Готов сделать длл-ку, но нужны тесты для отладки, у меня не получится, я платформу гаджетов удаляю сразу, как систему ставлю :)
Первый тест во вложении.

El Sanchez 16-02-2012 14:33 1860142

Цитата:

Цитата R.i.m.s.k.y.
а сколько их? в моем примере 3 строки 5 столбцов »

R.i.m.s.k.y., наличие только лишь одной пары скобок говорит о том, что перед нами пример массива с более чем 15-ю элементами, но раз так, то делай массив записей.
Цитата:

Цитата R.i.m.s.k.y.
мой вопрос простой - как забить в Инно двумерный массив не каждую ячейку поотдельности »

По отдельности.

R.i.m.s.k.y. 16-02-2012 14:44 1860149

El Sanchez, ВОТ! как при задании элементов массива отделить строки!
через точку с запятой или вот так?
['Москва','ул','Пушкарная','','']
['','','','',''']
['','Ленинград','','пер','Московский']
[...]


епт даже так не прокатывает
sss[0] := ['','Ленинград','','пер','Московский']
поотдельности забивать я идиотом сделаюсь

другой вопрос про синтаксис Инно - каким способом в инно закомментировать целый блок секции или кода?
// и ";" - это для строки

Gnom_aka_Lexander 16-02-2012 16:05 1860231

Цитата:

Цитата R.i.m.s.k.y.
каким способом в инно закомментировать целый блок секции или кода? »

{закоментированный
блок}
(*закоментированный
блок*)

както так. Вроде больше нет знаков коментария.

Johny777 16-02-2012 21:07 1860411

С точки зреня логики я поменял местами страницы
теперь страница wpSelectComponents находится перед страницей wpSelectDir
чтобы сделать ещё лучше, хотелось бы расширить возможности ComponentsDiskSpaceLabel
чтобы проверялось свободное место на диске
логика такая
например выборан только компонент 1 размером 4гб
на жёстком диске свободно 6
результат: кнопка далее активна

теперь выбраны 2 компонента общим размером 9гб
места не хватает
появляется надпись (лейбл.Show или сатикТекст.Show)
результат: кнопка далее неактивна

у меня было похожее решение, но там необходимое место на диске было "статичным" и задавалось заранее
подскажите пожалуйста как это сделать?

El Sanchez 17-02-2012 21:44 1861100

Цитата:

Цитата Лександер
Готов сделать длл-ку, но нужны тесты для отладки »

Лександер, не отработало (Win7 x64). Зато получилось через Code.
Код:

[code]
#ifndef UNICODE
    #error REQUIRES UNICODE INNO SETUP!
#endif

const
    CLSID_DesktopGadget = '{924CCC1B-6562-4C85-8657-D177925222B6}';
type
    IDesktopGadget = interface(IUnknown)
    '{924CCC1B-6562-4C85-8657-D177925222B6}'
    function RunGadget(gadgetPath: String): HResult;
end;

procedure ShowGadget(gadgetPath: String);
var
    pDG: IDesktopGadget;
    Obj: IUnknown;
begin
    if (GetWindowsVersion shr 24 > 6) or ((GetWindowsVersion shr 24 = 6) and ((GetWindowsVersion shr 16) and $FF > 0)) then
    begin
        Obj := CreateComObject(StringToGuid(CLSID_DesktopGadget));
        pDG := Obj as IDesktopGadget;
        pDG.RunGadget(gadgetPath);
        CoFreeUnusedLibraries;
    end;
end;

procedure InitializeWizard();
begin
    ShowGadget(ExpandConstant('{pf}\Windows Sidebar\Gadgets\Clock.Gadget'));
end;

P.S. Код через F7 не гонять - не отработает, на x64-системах не использовать гаджеты из {pf64} - не отработает, после закрытия гаджета дать системе 10-15 сек. сделать свои черные дела, иначе повторный запуск скрипта - ... ну, вы уже знаете.

Gnom_aka_Lexander 18-02-2012 13:45 1861357

Цитата:

Цитата El Sanchez
Зато получилось через Code. »

ИМХО, если работает из скрипта, то лучше так и оставить. Нет смысла из-за десятка строчек кода лишние 10-16 кил к инсталлу добавлять.
Единственное - стоит побороть-таки, несовместимость с АНСИ.
Вся беда в отсутствии расширенных строковых типов в инно.
Но их можно, наверное описать?

Johny777 18-02-2012 14:58 1861408

прошу прощения
в справке нашёл ответ на свой вопрос из предыдущего сообщения

вопрос в том как вместо сообщения отобразить инфомацию (выделил жирным шрифтом)
на появляющемся лейбле вместо окна
Код:

var
  Path: String;
  FreeMB, TotalMB: Cardinal;
  function GetSpaceOnDisk(const Path: String; const InMegabytes: Boolean; var Free, Total: Cardinal): Boolean;
begin
  // Get and display free megabytes on the Program Files drive
  Path := ExpandConstant('{pf}');
  if GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then
  begin
    MsgBox('There are ' + IntToStr(FreeMB) + ' megabytes free on ' +
      Path, mbInformation, MB_OK);

      WizardForm.NextButton.Enabled:=False  /// добавил
      лейбл нехватки места.Show  /// добавил
  end
  else begin
    // the function failed
  end;
end;


TROY Diamond 18-02-2012 19:37 1861545

У меня в процессе установки создаются файлы, о которых установщик "не знает". Если установку прервать или что-то случится до её завершения, то эти файлы останутся.
Что можно сделать в данном случае?

При "корректной" деинсталляции, есть способ, записать все файлы, например в секцию "UninstallDelete".

А ЕСЛИ ДО ДЕИНСТАЛЛЯЦИИ ДЕЛО "НЕ ДОЙДЁТ"?!

Как быть с сохранениями и (настройками), которые хранятся в папке установки приложения?
Мне нужно, чтобы ВСЯ папка удалялась, КРОМЕ папки с сохранениями (если пользователь решит её оставить), а если нет, то чтобы всё удалялось?

Как удалить сохранения игры "по расширению"?

В подпапке папки установки игры создаются файлы с расширением *.sav и/или *.red, а название у этих файлов любое, - какое пользователь им придумает.
Например: My Game\userdata\1.sav; My Game\userdata\1.sav.
"userdata" - это папка в которой хранятся различные "профили" пользователя, - ТУПО ЕЁ всю удалять и/или "реагировать" на неё НЕЛЬЗЯ , т.к. кроме сохранений там есть и другие файлы.
А "1.sav" и/или "1.red" - это файлы сохранения, но имя может быть любым, нужно найти их и предложить удалить если есть таковые, и ничего не предлагать если в папке "userdata" их нет!!!

читать дальше »
Как найти и предложить удалить эти файлы?

Или может быть есть вариант "проще", удалять "не глядя" ВСЮ папку установки, включая все файлы, созданные в процессе..., НО КРОМЕ файлов сохранений (если они есть и если пользователь решил их оставить)?!
И удалить ВСЁ если пользователь захочет это сделать.

Как добавить сообщение на разных языках в "ChangeCaption"

У меня в секции Files, "своё" сообщение во время распаковки фалов: "BeforeInstall: ChangeCaption('Текст сообщения...')"

Как сделать на нескольких языках - для мультиязычной установки?

Spell1999 18-02-2012 23:34 1861701

Кто знает сайтик где есть готовые скрипты инсталлеров? скиньте плиз

Devils Night 20-02-2012 02:26 1862455

Подскажите, а как сделать тоже самое:
читать дальше »
Код:

[ code]
Function InitializeSetup: Boolean;
var
res : integer;
begin
Result := True;
Exec('ping.exe ', ' 2ip.ru ', ExpandConstant('{sys}'), SW_HIDE, ewWaitUntilTerminated, res);
if res = 0 then begin
MsgBox('Найдено подключение к интернету. Установка будет прекращена!', mbInformation, MB_OK);
Result := False;
end;
end;

но только чтоб и с локалкой отрабатывало, а то когда интернет есть, всё работает, а когда интернет отключен и работает только локалка, то установщик запускается, а нужно чтоб было как и с рабочим интернетом, такое вообще возможно?

Цитата:

Цитата VASYAKRN
переимини »

Чтож ты ирод так русский язык то коверкаешь, я было чуть язык не сломал!

R.i.m.s.k.y. 20-02-2012 10:16 1862574

Devils Night, ну как вариант пинговать 127.0.0.1, это loopback адрес, если он пинугется - значит сеть есть
Кстати пинговать 2ip для определения нэта не самый кошерный вариант, ping возвращает неноль только если сети нет, если к примеру ему ДНС вернет что данный узел не найден, пинг с чистой совестью вернет 0, хотя сайты не открываются и автообновлялка отвалится с тойже ошибкой
Выше El Sanchez дал пример кошерного определения связи

vitl 20-02-2012 12:36 1862641

Цитата:

Цитата R.i.m.s.k.y.
Procedure backUp();
begin
ChangeCaption('BackUp')
If DirExists (DriveLetter +':\'+'Settings\Client\') then copyfiles(DriveLetter +':\'+'Settings\Client\', DriveLetter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\Settings\Client\');
if DirExists (DriveLetter +':\'+'utils\') then copyfiles(DriveLetter +':\'+'utils\', DriveLetter +':\'+'Backup\'+GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-')+'\utils\');
end; »

Данный код отлично работает, если бэкапятся мелкие файлы. Но когда файлы большие, то тогда создается 2 (две) папки: 'Backup\2012-02-20_12-10-10\Settings\Client\' и 'Backup\2012-02-20_12-11-22\utils\',
а нужно, чтобы папки utils\ и Settings\Client\ создавались в одном бэкапе
'Backup\2012-02-20_12-10-10\Settings\Client\' и 'Backup\2012-02-20_12-10-10\utils\'

Может можно как-то в начале процедуры задать для папки бэкапа переменную (на 'YYYYMMDD_hh:nn:ss'), а потом ниже ее подставлять, примерно так:
...+'Backup\'+'переменная_с_именем_папки_с_датой'+'\Settings\Client\');

Или есть более оптимальный выход?

Подскажите, пожалуйста, как оптимизировать код.

R.i.m.s.k.y. 20-02-2012 12:40 1862643

vitl,
Код:

Procedure backUp();
var datetime : string;
begin
ChangeCaption('BackUp');
datetime := GetDateTimeString('YYYYMMDD_hh:nn:ss', '-', '-');
If DirExists (DriveLetter +':\'+'Settings\Client\') then copyfiles(DriveLetter +':\'+'Settings\Client\', DriveLetter +':\'+'Backup\'+datetime +'\Settings\Client\');
if DirExists (DriveLetter +':\'+'utils\') then copyfiles(DriveLetter +':\'+'utils\', DriveLetter +':\'+'Backup\'+datetime +'\utils\');
end; »


Dirk Diggler 20-02-2012 17:15 1862870

В инсталляторе надо проверить, установлен ли Microsoft Visual C++ 2008 SP1 Redistributable Package, и соот-щим образом сформировать список компонентов. Вопрос - как лучше это сделать? Куда смотреть?

R.i.m.s.k.y. 20-02-2012 17:20 1862872

Dirk Diggler, я проверяю вот так
Код:

Function isvcredist():boolean;
var b1,b2,b3 : boolean;
begin
  if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\DevDiv\VC\Servicing\9.0\RED') then b1 := True;
  if IsWin64 then begin
    if RegKeyExists(HKLM64, 'SOFTWARE\Microsoft\DevDiv\VC\Servicing\9.0\RED') then b2 := True;
    if RegKeyExists(HKLM32, 'SOFTWARE\Microsoft\DevDiv\VC\Servicing\9.0\RED') then b3 := True;
  end;
  if (b1 or b2 or b3) then Result := True else Result := False;
end;


Dirk Diggler 20-02-2012 17:44 1862886

Благодарю. Расширил путь до SP1, рабоатет. А как перенос каретки сделать в сообщении?

R.i.m.s.k.y. 20-02-2012 17:50 1862893

Dirk Diggler
перенос каретки #10, c новой строкой #13#10

Ivan_009 20-02-2012 19:52 1862965

Как удалить данный текст подскажите пожалуйста

nik1967 20-02-2012 20:52 1862997

Ivan_009, а вот как ты думаешь, с одним скриптом без файлов, много народу найдётся тебе помочь?

Devils Night 21-02-2012 06:26 1863260

Цитата:

Цитата Spell1999
Кто знает сайтик где есть готовые скрипты инсталлеров? »

А зачем тебе, не есть гуд брать чужие готовые скрипты, или не судьба хотя бы по примерам самому сваять что ли? Естественно сначала уйдёт время на создание своего скрипта, но это зависит от индивидуальности. Например здесь в первом посте под спойлером Показать/скрыть: Ссылки на примеры скриптов: есть готовые примеры, остальное что не понятно можно спросить здесь же. А так же на ru-board, от 1 части, и до 14 части.

StarClock 21-02-2012 07:17 1863267

Ребят. Скиньте пожалуйста прикольный стиль. Желательно чёрный

R.i.m.s.k.y. 21-02-2012 08:13 1863277

StarClock, в шапке Ultimate Black

если кому надо - определение фреймворков
Код:

function netfw35(): Boolean;
begin
        if ( RegKeyExists(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5') )
    then Result := True else Result := False;
end;

function netfw4(): Boolean;
begin
        if ( RegKeyExists(HKLM, 'SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client') )
    then Result := True else Result := False;
end;


StarClock 21-02-2012 10:17 1863307

Мне бы желательно типо такого стиль http://cs4560.vkontakte.ru/u63041931...x_6498b93f.jpg

R.i.m.s.k.y. 21-02-2012 10:19 1863308

StarClock, инсталлер должен порхать как бабочка и жалить как пчела!
а ты рюшечками увлекаешься...

StarClock 21-02-2012 10:38 1863319

R.i.m.s.k.y., Не понял.

R.i.m.s.k.y. 21-02-2012 10:41 1863321

StarClock, инсталлер должен быть функциональным, надежным и безглючным
Единственная его цель - правильно поставить и корректно все удалить, не тронув лишнего.
Обвешивая его картинками и прочим глямуром ты резко понижаешь его надежность и переносимость разных систем.
Доказательства - на руторе в раздаче игр.

StarClock 21-02-2012 10:57 1863331

R.i.m.s.k.y., Я всё равно хочу этот стиль? У тебя он есть? Если есть дай будь добр

R.i.m.s.k.y. 21-02-2012 10:59 1863332

StarClock, нет, стили я не коллекционирую
Коллекционер у нас Лександр с сайтом http://innoultra.ru/

Gnom_aka_Lexander 21-02-2012 11:12 1863338

Стили я держу тут: Скачать Tyger (который на скрине) там тоже есть.
Цитата:

Цитата StarClock
Лександер, Спасибо. R.i.m.s.k.y., Спасибо »

Постинг спасибов является нарушением правил форума, для того мудрое рководство и придумало кнопочку - Полезное сообщение.

StarClock 21-02-2012 11:14 1863341

Лександер, Спасибо. R.i.m.s.k.y., Спасибо

StarClock 21-02-2012 11:50 1863368

Лександер, А как их в установочник вставить? :D

Gnom_aka_Lexander 21-02-2012 11:58 1863375

Тут есть все, что для этого нужно - длл, примеры кода, а так-же невероятно подробная и удивительно понятная справка по работе со скинами, прочтение которой снимает все вопросы разом. В гугле ищется за пять секунд.

YURSHAT 21-02-2012 15:33 1863576

StarClock, а хорошие люди и перевод сделали http://pastehtml.com/view/bj5zbh42r.html :)

alert30 21-02-2012 16:17 1863612

Цитата:

Цитата Devils Night
А так же на ru-board, от 1 части, и до 14 части. »

Spell1999, короче говоря, в Руборде тоже очень много скриптов, как и здесь.

Johny777 21-02-2012 19:02 1863755

скажите пожалуйста
вот такие чекбокс и радиокнопка у меня при использовании скина

хотел сделать такими (это родные. У меня они появляются, если сам создаю чекбокс)

вот наткнулся на такое стандартное решение
ComponentsListBtnImageFile=btnimage.bmp
и наложил вот такие текстуры. (или правильнее сказать глифы)

получил не то что нужно
вот

вопрос почему (неужели из-за скина, тк без него всё в порядке?) и как можно это исправить.
Если нельзя так (вот так ComponentsListBtnImageFile=btnimage.bmp), то как сделать по другому.
заранее спасибо за помощь. :)

Gnom_aka_Lexander 21-02-2012 20:07 1863804

Цитата:

Цитата Johny777
неужели из-за скина »

Мзза него, родимого. вообще криво дело с этими скинами. Просто в скине для листбоксов другой цвет указан транспарентным. Либо вообще пнг использованы. Ковыряй скин. кстати, чекбоксы (не все, правда) ты можешь и в скине затекстурировать. Открывай скин в скинбилдере - ссылка в моем посте выше, и ковыряй, ищи косяк.

Spell1999 21-02-2012 22:30 1863920

нет вы меня не так поняли. я уже себе сделал скрипт но хочеца чевото нового. и я ищю готовые скрипты всякие разные. тоесть из нескольких скриптов собираю 1 хороший.

BlackPhoenix28 21-02-2012 23:17 1863950

Добрый день ! Подскажите пожалуйста. Как сделать что-бы сразу при запуске инсталятора выводилась фоновая картинка на полный экран а потом уже при установке шло слайд шоу ? И как сделать что-бы плеер был все время виден ? Если можно то поподробнее вплоть до того что и после какой строки вставлять и чего где править.

Вот мой скрипт

[Setup]
SourceDir=.
OutputDir=Setup
AppName=The Book of Unwritten Tales
AppVerName=The Book of Unwritten Tales
AppVersion=The Book of Unwritten Tales
AppPublisher=HMN Interactive
AppCopyright=HMN Interactive
DefaultDirName={pf}\The Book of Unwritten Tales
DefaultGroupName=The Book of Unwritten Tales
AllowNoIcons=yes
InfoBeforeFile=D:\Картинки\Лицензия.rtf
OutputBaseFilename=setup
WizardImageFile=D:\Картинки\InstallLeft.bmp
WizardSmallImageFile=D:\Картинки\InstallCorner.bmp
SetupIconFile=C:\Program Files (x86)\The Book of Unwritten Tales\Book.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/ultra
DiskSpanning=yes
DiskSliceSize=524288000
SlicesPerDisk=1

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"

[Files]
Source: "D:\Картинки\1.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\10.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\2.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\3.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\4.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\5.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\6.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\7.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\8.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\9.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "bass.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\20-abspann-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\08-erzmagier_alastair-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\10-das_lied_vom_tod-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\12-unknown-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\15-unknown-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\16-ivo-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\SASHA\Desktop\Game.reg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

Source: "C:\Program Files (x86)\The Book of Unwritten Tales\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Icons]
Name: "{group}\The Book of Unwritten Tales"; Filename: "{app}\bout.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\The Book of Unwritten Tales"; Filename: "{app}\bout.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\{cm:UninstallProgram,The Book of Unwritten Tales}"; Filename: "{uninstallexe}"

[Run]
Description: "{cm:LaunchProgram, The Book of Unwritten Tales}"; Filename: "{app}\bout.exe"; WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent unchecked
Filename: {win}\regedit.exe; Parameters: /s {tmp}\Game.reg; StatusMsg: "Вносим изменения в реестр ..."; Flags: waituntilterminated runasoriginaluser

[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[code]
const
Indent=25;

function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall delayload';
function ssInitialize(hParent:HWND;ssTimeShow:integer;FadeOut:boolean;StretchMode:integer;BkgColor:DWORD):boo lean; external 'ssInitialize@files:isgsg.dll stdcall delayload';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssAddImage(FileName:PAnsiChar); external 'ssAddImage@files:isgsg.dll stdcall delayload';
procedure ssStartShow; external 'ssStartShow@files:isgsg.dll stdcall delayload';
procedure ssStopShow; external 'ssStopShow@files:isgsg.dll stdcall delayload';
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
procedure ShowMP3Panel(hMainFrm:HWND;StartVolume:integer;DefMP3Dir,BASSDir,MLabel:PAnsiChar;IsShowMP3Info,IsBk gFrmVisible:boolean;ShowTimeMP3Info:integer;dBottom:integer);external 'ShowMP3Panel@files:isgsg.dll stdcall';
procedure KillMP3Panel;external 'KillMP3Panel@files:isgsg.dll stdcall';

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('Game.reg');
ExtractTemporaryFile('20-abspann-ik.mp3');
ExtractTemporaryFile('08-erzmagier_alastair-ik.mp3');
ExtractTemporaryFile('10-das_lied_vom_tod-ik.mp3');
ExtractTemporaryFile('12-unknown-ik.mp3');
ExtractTemporaryFile('15-unknown-ik.mp3');
ExtractTemporaryFile('16-ivo-ik.mp3');
ExtractTemporaryFile('bass.dll');
Result:=True;
end;

procedure InitializeWizard;
begin
ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'Repack by BlackPhoenix',True,True,7000,Indent);
ssInitialize(GetWindowLong(MainForm.Handle,-8),10,False,1,$FF000000);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
ExtractTemporaryFile('1.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\1.jpg');
ExtractTemporaryFile('2.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\2.jpg');
ExtractTemporaryFile('3.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\3.jpg');
ExtractTemporaryFile('4.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\4.jpg');
ExtractTemporaryFile('5.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\5.jpg');
ExtractTemporaryFile('6.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\6.jpg');
ExtractTemporaryFile('7.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\7.jpg');
ExtractTemporaryFile('8.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\8.jpg');
ExtractTemporaryFile('9.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\9.jpg');
ExtractTemporaryFile('10.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\10.jpg');
ssStartShow;
end;
if CurStep=ssPostInstall then ssStopShow;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(GetSystemMetrics(0)-WizardForm.Width-Indent);
WizardForm.Top:=ScaleY(GetSystemMetrics(1)-WizardForm.Height-Indent);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end;
if (CurPageID=wpFinished) or (CurPageID=wpInfoAfter) then begin
if WizardForm.Width<>502 then begin
WizardForm.Visible:=False;
WizardForm.Width:=ScaleX(502);
WizardForm.Height:=ScaleY(392);
WizardForm.Left:=(GetSystemMetrics(0)-WizardForm.Width) div 2;
WizardForm.Top:=(GetSystemMetrics(1)-WizardForm.Height) div 2;
WizardForm.MainPanel.Visible:=True;
WizardForm.Bevel1.Visible:=True;
WizardForm.InnerNotebook.Left:=ScaleX(40);
WizardForm.InnerNotebook.Top:=ScaleY(72);
WizardForm.InnerNotebook.Width:=ScaleX(417);
WizardForm.Visible:=True;
end;
end;
end;

procedure DeinitializeSetup;
begin
KillMP3Panel;
ssDeInitialize;
end;


P.S. Подскажите пожалуйста начинающему скриптописцу.

Johny777 22-02-2012 00:20 1863986

Цитата:

Цитата BlackPhoenix28
isgsg.dll »

у тебя в скрипте
похоже ты сделал свой скрипт прораммой inno setup game script generator созданной South с форума цсмании
там всё, то ты просишь реализовано
покопайся в программе
например на странице "Фоновые рисунки" сверху указываешь свой фоновый рисунок
снизу добавляешь картинки для слайдшоу

на странице "фоновая музыка" есть чекбокс "показать плеер"

BlackPhoenix28 22-02-2012 01:06 1864007

Johny777,

Спасибо с фоновой картинкой уже разобрался. А вот с плеером как быть. Чекбокс то есть, но плеер со времен пропадает. А мне надо что-бы он все время отображался. Ну то есть что-бы отображался только плеер а название песни пропадало. Там есть задержка именно для окошка с названием песни а для плеера такого не нашел.

Devils Night 22-02-2012 01:42 1864021

Цитата:

Цитата Spell1999
и я ищю готовые скрипты всякие разные. тоесть из нескольких скриптов собираю 1 хороший. »

Ну вообще не думаю что есть сайт где лежат все скрипты, хотя пусть если даже где и есть то грубо говоря все скрипты ворованные, т.е залиты без согласования авторов, так что это придётся спрашивать лично у авторов, если они дадут добро, то поделятся, а нет, то руборд, OSZone, и поиск только поможет.

Johny777 22-02-2012 02:55 1864030

BlackPhoenix28,
попробуй выявить строки в коде отвечающие за твой нынешний плеер и потом интегрируй это http://rghost.ru/36644901
получишь вот это (оно?)

BlackPhoenix28 22-02-2012 03:36 1864046

Johny777,

Нет, не то. Я хочу что-бы тот плеер который у меня стоит был виден все время. Просто он с перемоткой и паузой + можно несколько файлов проигрывать. Да и вообще он мне подходит еще и потому что у меня же во время установки окошко с прогрессом в правом нижнем углу, весь экран открыт и видны фоновые картинки а мне именно это и нужно. Поэтому и не хочется менять плеер.

R.i.m.s.k.y. 22-02-2012 10:51 1864153

Подскажите, пожалуйста, как правильно занести в ключ реестр без Code путь, хранящийся в другом ключе
делаю так
Код:

[Registry]
...ValueName: Path; ValueData: {reg:HKLM\SOFTWARE\Classes\CLSID\{{EE30215D-164F-4A92-A4EB-9D4C13390F9F}\InprocServer32,}...

и получаю ошибку
Invalid registry constant "reg:HKLM\SOFTWARE\Classes\CLSID\{{EE30215D-164F-4A92-A4EB-9D4C13390F9F"

Где, в какой жеппе вообще расписан по человечьи синтаксис инно?


UPD: решение
Код:

..ValueName: Path; ValueData: {reg:HKLM\SOFTWARE\Classes\CLSID\{{EE30215D-164F-4A92-A4EB-9D4C13390F9F%7d\InprocServer32,};...
И кстати мой прошлый вопрос: "как закомментировать большой кусок текста в секции кода и реестра непострочно" остался без ответа, точнее ответ был неверным
Я конечно извернулся: в акелпаде меняю "конец строки" на "конец строки//" но это изврат

Johny777 22-02-2012 19:30 1864596

можно мне маленький пример?
как привязать чекбокс к компоненту
например делаю простой пример
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.7
DefaultDirName={pf}\My Program
OutputDir=.

[Components]
Name: g0; Description: 11111111; Check: make

[ъCode]
var
  X: TCheckBox;

function make: Boolean;
begin
    Result:=X.Checked;
end;

procedure InitializeWizard();
begin
X := TCheckBox.Create(WizardForm);
 with X do
  begin
    Parent := WizardForm.SelectComponentsPage;
    Caption := 'Yes';
    Left := ScaleX(0);
    Top := ScaleY(70);;
    Width := ScaleX(300);
    Height := ScaleY(15);
    TabOrder := 0;
    Checked := False;
  end;
end;

вылетает с ошибкой
---------------------------
Ошибка запуска
---------------------------
Строка 16:

Could not call proc.
---------------------------
ОК
---------------------------

Gnom_aka_Lexander 22-02-2012 19:44 1864616

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

R.i.m.s.k.y. 22-02-2012 20:47 1864671

Цитата:

Цитата Лександер
Компонентами нельзя управлять из кода »

эээ коллега, а как же я тогда делаю вот так?
Код:

procedure InitializeWizard();
...
WizardForm.ComponentsList.Checked[WizardForm.ComponentsList.Items.IndexOf(ExpandConstant('{#SVP}'))]:=True;
...

Да и прочие плюшки типа контроля за галочками в зависимости от остальных галочек?
И с задачами катит
Главное вертеть компонентами и задачами из кода после InitializeSetup

Johny777 22-02-2012 21:06 1864684

Цитата:

Цитата R.i.m.s.k.y.
Да и прочие плюшки типа контроля за галочками в зависимости от остальных галочек?
И с задачами катит »

R.i.m.s.k.y.,
можно пожалуйста более полный пример на основе моего предыдущего поста?
дальше по аналогии сделаю
у меня как раз зависимости задачи-компоненты и полностью убирать все компоненты и на странице через Check делать кучу галок с переключателями в секции файлов не самое весёлое занятие

Gnom_aka_Lexander 22-02-2012 21:12 1864689

Цитата:

Цитата R.i.m.s.k.y.
эээ коллега, а как же я тогда делаю вот так? »

Это не то.
Цитата:

Цитата Johny777
[Components] Name: g0; Description: 11111111; Check: make »

Как по твоему это называется? Инсталл, по крайней мере, думает, что это условие создания компонента, в зависимости от условия. а таковой возможности нет - компоненты при запуске инсталла уже созданы. и можно ими именно управлять. А не управлять возможностью их созданием. Что и пытался человек сделать. Я просто неточно выразился.

Serega 22-02-2012 22:47 1864749

Цитата:

Цитата R.i.m.s.k.y.
И кстати мой прошлый вопрос: "как закомментировать большой кусок текста в секции кода и реестра непострочно" остался без ответа, точнее ответ был неверным »

Лександер, насколько помню вам отвечал, много строчный текст комментируется так: { большой текст, много строк }

Цитата:

Цитата Лександер
Инсталл, по крайней мере, думает, что это условие создания компонента, в зависимости от условия. а таковой возможности нет »

Не совсем так, допустим простой пример:
Код:

[Components]
Name: test; Description: ISetup.chm; Check: make

[Code]
function make: Boolean;
begin
  Result := FileExists('{#CompilerPath}ISetup.chm');
end;

Если поставить "Check: not make", то компонент не будет создан... Ошибка возникает именно из-за попытки обращения к контролу, который ещё не создан.

Johny777 23-02-2012 02:29 1864830

подскажите пожалуйста
как сдетать TNewEdit в котором будут вводиться параметры запуска ярлыка
(как в Steam "параметры запуска")
вот строка из моего скрипта
Name: {group}\Half-Life 2; Filename: {app}\common\half-life 2\hl2.exe; WorkingDir: {app}\common\half-life 2; Parameters: -steam -game hl2 -appid 220; Components: g0\c1; IconFilename: {app}\common\half-life 2\hl2.ico
-steam -game hl2 -appid 220 менять нельзя, но дописать можно очень многое
например -console +fps_max 60 -dev
может быть вот так
дальше не знаю
Name:.......Parameters: -steam -game hl2 -appid 220 -{code:функция};.........
похожие реализации уже были при вводе ника в rev.ini

R.i.m.s.k.y. 23-02-2012 07:33 1864854

Цитата:

Цитата Serega
Лександер, насколько помню вам отвечал, много строчный текст комментируется так: { большой текст, много строк } »

это работает только в секции кода, меня интересует секция файлов и реестра

Gnom_aka_Lexander 23-02-2012 10:30 1864910

Цитата:

Цитата R.i.m.s.k.y.
меня интересует секция файлов и реестра »

там-же я и ответил - других способов коментирования строк, кроме того, что я показывал, и ты перед этим давал - нету. Совсем нету... Вообще совсем нету. Кстати, С праздником, уважаемые коллеги :)

El Sanchez 23-02-2012 11:39 1864972

Цитата:

Цитата Serega
Ошибка возникает именно из-за попытки обращения к контролу, который ещё не создан. »

Serega, совершенно верно.

Цитата:

Цитата Johny777
дальше не знаю
Name:.......Parameters: -steam -game hl2 -appid 220 -{code:функция};......... »

Это надо делать в Code с помощью CreateShellLink, когда контролы уже существуют.

Цитата:

Цитата R.i.m.s.k.y.
это работает только в секции кода, меня интересует секция файлов и реестра »

У Restools с этим просто - выделяешь строки и жмешь на клавишу /, в Code строки будут закомментированы двойным слэш, в остальных секциях точкой с запятой.

BlackPhoenix28 23-02-2012 14:07 1865119

Johny777,

Можно еще спросить по реестру. Собрал скрипт в IS GameScript generator. У меня стоит Windows 7 x64, и все игрушки пишутся вот в эту ветку реестра:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\
И так как я добавляю реестр из reg - файла (вернее просто ветку реестра с моего компа) то будут ли эти игрушки после установки работать скажем на Win XP x32 или на Win 7 x32. Или надо добавлять в скрипт какую то проверку на разрядность системы. Если надо то что и куда добавить. А главное, как ? (Вариант ручками и т.д. прошу не предлагать).
Вот мой скрипт

[Setup]
SourceDir=.
OutputDir=Setup
AppName=The Book of Unwritten Tales
AppVerName=The Book of Unwritten Tales
AppVersion=The Book of Unwritten Tales
AppPublisher=HMN Interactive
AppCopyright=HMN Interactive
DefaultDirName={pf}\The Book of Unwritten Tales
DefaultGroupName=The Book of Unwritten Tales
AllowNoIcons=yes
InfoBeforeFile=D:\Картинки\Лицензия.rtf
OutputBaseFilename=setup
WizardImageFile=D:\Картинки\InstallLeft.bmp
WizardSmallImageFile=D:\Картинки\InstallCorner.bmp
SetupIconFile=C:\Program Files (x86)\The Book of Unwritten Tales\Book.ico
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/ultra
DiskSpanning=yes
DiskSliceSize=524288000
SlicesPerDisk=1

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"

[Files]
Source: "D:\Картинки\1.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\10.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\2.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\3.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\4.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\5.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\6.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\7.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\8.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "D:\Картинки\9.jpg"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "isgsg.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "bass.dll"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\20-abspann-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\08-erzmagier_alastair-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\10-das_lied_vom_tod-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\12-unknown-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\15-unknown-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: "T:\The Book of Unwritten Tales\Soundtarck\OST-The_Book_Of_Unwritten_Tales-READNFO-2011-I_KnoW\16-ivo-ik.mp3"; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: C:\Users\SASHA\Desktop\Game.reg; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

Source: "C:\Program Files (x86)\The Book of Unwritten Tales\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension

[Icons]
Name: "{group}\The Book of Unwritten Tales"; Filename: "{app}\bout.exe"; WorkingDir: "{app}";
Name: "{userdesktop}\The Book of Unwritten Tales"; Filename: "{app}\bout.exe"; WorkingDir: "{app}"; Tasks: desktopicon;
Name: "{group}\{cm:UninstallProgram,The Book of Unwritten Tales}"; Filename: "{uninstallexe}"

[Run]
Description: "{cm:LaunchProgram, The Book of Unwritten Tales}"; Filename: "{app}\bout.exe"; WorkingDir: "{app}"; Flags: nowait postinstall skipifsilent unchecked
Filename: {win}\regedit.exe; Parameters: /s {tmp}\Game.reg; StatusMsg: "Вносим изменения в реестр ..."; Flags: waituntilterminated runasoriginaluser

[UninstallDelete]
Type: filesandordirs; Name: "{app}"

[code]
const
Indent=25;

function GetWindowLong(hWnd: HWND; nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall delayload';
function ssInitialize(hParent:HWND;ssTimeShow:integer;FadeOut:boolean;StretchMode:integer;BkgColor:DWORD):boo lean; external 'ssInitialize@files:isgsg.dll stdcall delayload';
procedure ssDeInitialize; external 'ssDeInitialize@files:isgsg.dll stdcall delayload';
procedure ssAddImage(FileName:PAnsiChar); external 'ssAddImage@files:isgsg.dll stdcall delayload';
procedure ssStartShow; external 'ssStartShow@files:isgsg.dll stdcall delayload';
procedure ssStopShow; external 'ssStopShow@files:isgsg.dll stdcall delayload';
function GetSystemMetrics(nIndex:Integer):integer; external 'GetSystemMetrics@user32.dll stdcall delayload';
procedure ShowMP3Panel(hMainFrm:HWND;StartVolume:integer;DefMP3Dir,BASSDir,MLabel:PAnsiChar;IsShowMP3Info,IsBk gFrmVisible:boolean;ShowTimeMP3Info:integer;dBottom:integer);external 'ShowMP3Panel@files:isgsg.dll stdcall';
procedure KillMP3Panel;external 'KillMP3Panel@files:isgsg.dll stdcall';

function InitializeSetup:boolean;
begin
ExtractTemporaryFile('Game.reg');
ExtractTemporaryFile('20-abspann-ik.mp3');
ExtractTemporaryFile('08-erzmagier_alastair-ik.mp3');
ExtractTemporaryFile('10-das_lied_vom_tod-ik.mp3');
ExtractTemporaryFile('12-unknown-ik.mp3');
ExtractTemporaryFile('15-unknown-ik.mp3');
ExtractTemporaryFile('16-ivo-ik.mp3');
ExtractTemporaryFile('bass.dll');
Result:=True;
end;

procedure InitializeWizard;
begin
ShowMP3Panel(WizardForm.Handle,80,ExpandConstant('{tmp}'),ExpandConstant('{tmp}'),'Repack by BlackPhoenix',True,True,7000,Indent);
ssInitialize(GetWindowLong(MainForm.Handle,-8),10,False,1,$FF000000);
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep=ssInstall then begin
ExtractTemporaryFile('1.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\1.jpg');
ExtractTemporaryFile('2.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\2.jpg');
ExtractTemporaryFile('3.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\3.jpg');
ExtractTemporaryFile('4.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\4.jpg');
ExtractTemporaryFile('5.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\5.jpg');
ExtractTemporaryFile('6.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\6.jpg');
ExtractTemporaryFile('7.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\7.jpg');
ExtractTemporaryFile('8.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\8.jpg');
ExtractTemporaryFile('9.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\9.jpg');
ExtractTemporaryFile('10.jpg');
ssAddImage(ExpandConstant('{tmp}')+'\10.jpg');
ssStartShow;
end;
if CurStep=ssPostInstall then ssStopShow;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpInstalling then begin
WizardForm.MainPanel.Visible:=False;
WizardForm.Bevel1.Visible:=False;
WizardForm.Width:=ScaleX(395);
WizardForm.Height:=ScaleY(142);
WizardForm.Left:=ScaleX(GetSystemMetrics(0)-WizardForm.Width-Indent);
WizardForm.Top:=ScaleY(GetSystemMetrics(1)-WizardForm.Height-Indent);
WizardForm.InnerNotebook.Left:=ScaleX(10);
WizardForm.InnerNotebook.Top:=ScaleY(10);
WizardForm.InnerNotebook.Width:=ScaleX(370);
WizardForm.StatusLabel.Left:=ScaleX(0);
WizardForm.StatusLabel.Top:=ScaleY(0);
WizardForm.StatusLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.FileNameLabel.Left:=ScaleX(0);
WizardForm.FileNameLabel.Top:=ScaleY(20);
WizardForm.FileNameLabel.Width:=WizardForm.InnerNotebook.Width;
WizardForm.ProgressGauge.Top:=ScaleY(40);
WizardForm.ProgressGauge.Width:=WizardForm.InnerNotebook.Width;
WizardForm.CancelButton.Left:=ScaleX(154);
WizardForm.CancelButton.Top:=ScaleY(80);
end;
if (CurPageID=wpFinished) or (CurPageID=wpInfoAfter) then begin
if WizardForm.Width<>502 then begin
WizardForm.Visible:=False;
WizardForm.Width:=ScaleX(502);
WizardForm.Height:=ScaleY(392);
WizardForm.Left:=(GetSystemMetrics(0)-WizardForm.Width) div 2;
WizardForm.Top:=(GetSystemMetrics(1)-WizardForm.Height) div 2;
WizardForm.MainPanel.Visible:=True;
WizardForm.Bevel1.Visible:=True;
WizardForm.InnerNotebook.Left:=ScaleX(40);
WizardForm.InnerNotebook.Top:=ScaleY(72);
WizardForm.InnerNotebook.Width:=ScaleX(417);
WizardForm.Visible:=True;
end;
end;
end;

procedure DeinitializeSetup;
begin
KillMP3Panel;
ssDeInitialize;
end;

Gnom_aka_Lexander 23-02-2012 14:22 1865129

BlackPhoenix28, Просто удаляй из пути подпапку Wow6432Node. Тоесть вместо
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\и так далее,
нужно HKEY_LOCAL_MACHINE\SOFTWARE\и так далее.
х32-х64 инно определяет сама, и в х64 автоматом подставит подпапку Wow6432Node в путь.
Если у тебя вдруг будет нужда внести запись без этой подпапки в х64 системе, нужно указать х64-корень.
HKLM64\SOFTWARE\
только не забыть проверку сделать - Check: IsWin64, посколько в х32 системах будет ошибка и нужно исключить такую запись из обработки установщиком.

Johny777 23-02-2012 16:45 1865225

Цитата:

Цитата El Sanchez
Это надо делать в Code с помощью CreateShellLink, когда контролы уже существуют. »

спасибо за подсказку
вот сделал,
параметры добавляются
всё работает!
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
PrivilegesRequired=none
OutputDir=.



[_code]
{ RedesignWizardFormBegin } // Íå óäàëÿòü ýòó ñòðîêó!
// Íå èçìåíÿòü ýòó ñåêöèþ. Îíà ñîçäàíà àâòîìàòè÷åñêè.
var
  Icon_hl2: TNewCheckBox;
  parameters_hl2: TNewEdit;
  s1,s2:String;

procedure parameters1OnClick(Sender: TObject); forward;

procedure RedesignWizardForm;
begin
  { Icon_hl2 }
  Icon_hl2 := TNewCheckBox.Create(WizardForm);
  with Icon_hl2 do
  begin
    Name := 'Icon_hl2';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(200);
    Top := ScaleY(208);
    Width := ScaleX(161);
    Height := ScaleY(17);
    Caption := 'create icon for Half-Life 2';
    OnClick := @parameters1OnClick;
  end;

  { parameters_hl2 }
  parameters_hl2 := TNewEdit.Create(WizardForm);
  with parameters_hl2 do
  begin
    Name := 'parameters_hl2';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(368);
    Top := ScaleY(208);
    Width := ScaleX(121);
    Height := ScaleY(21);
    Text := ' ';
  end;

  Icon_hl2.TabOrder := 2;
  parameters_hl2.TabOrder := 3;

{ ReservationBegin }
  // Âû ìîæåòå äîáàâèòü âàø êîä çäåñü.

{ ReservationEnd }
end;
// Íå èçìåíÿòü ýòó ñåêöèþ. Îíà ñîçäàíà àâòîìàòè÷åñêè.
{ RedesignWizardFormEnd } // Íå óäàëÿòü ýòó ñòðîêó!

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;

function CreateIconHL2: Boolean;
begin
  Result:=Icon_hl2.Checked;
end;

procedure parameters1OnClick(Sender: TObject);
begin
if Icon_hl2.Checked = false then
  begin
    parameters_hl2.Enabled:= false;
    parameters_hl2.visible:= false;
  end
else
  begin
    parameters_hl2.Enabled:= true;
    parameters_hl2.visible:= true;
  end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  s2:=parameters_hl2.Text;
    s1:=ExpandConstant('-steam -game hl2 -appid 220');
  if CurStep = ssPostInstall then
  begin
  if Icon_hl2.Checked then

    CreateShellLink(ExpandConstant('{commondesktop}\Half-Life 2.lnk'), '',
    ExpandConstant('{app}\common\half-life 2\hl2.exe'),s1 + s2, ExpandConstant('{app}\common\half-life 2'), ExpandConstant('{app}\common\half-life 2\hl2.ico'), 0, SW_SHOWNORMAL);
/////////////////////////////// ÿðëûê íà ðàáî÷åì ñòîëå //////////////////////////////////////// ê ôàéëó òàêîìó-òî /////////////////// ïàðàìåòðû  çàïóñêà  /////////////////////// ðàáî÷àÿ ïàïêà  ////////////////////////////////  ôàéë çíà÷êà  ///// 0 ýòî èíäåê èêîíêè ////////
  end;
end;
 procedure CurPageChanged(CurPageID: Integer);
 begin       
    if CurPageID=wpWelcome then

    begin

      parameters_hl2.Hide
    end;
 end;
[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D003010F601000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F101134F6E436F6E73747261696E6564526573697A650712706172616D6574657273314F6E436C69636B0C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C69636974486569676874033901000C544E6577436865636B426F780849636F6E5F686C32044C65667403C80003546F7003D00005576964746803A1000648656967687402110743617074696F6E061B6372656174652069636F6E20666F722048616C662D4C6966652032085461624F726465720202074F6E436C69636B0712706172616D6574657273314F6E436C69636B000008544E6577456469740E706172616D65746572735F686C32044C65667403700103546F7003D0000557696474680279064865696768740215085461624F72646572020304546578740602603F0000000000



у меня вопрос
как привязать эту функцию к кастомному чекбоксу (раньше у меня на была привязана к задаче Task чарез Check)
Код:

function Task_DirectX:boolean; /// DirectX search
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If (FileSearch('DXSETUP.exe', ExpandConstant('{src}\Redist\DirectX10'))='') then
  Result:=False
end;
end;

например к этому http://forum.ru-board.com/topic.cgi?...&limit=1&m=1#1
и если во внешней папке нет директа, то и чекбокса нет

nik1967 24-02-2012 15:00 1865706

Johny777, как то криво, но работает :wow:
Код:

If not (FileSearch('DXSETUP.exe', ExpandConstant('{src}\Redist\DirectX10'))='') then begin
  Icon_hl2 := TNewCheckBox.Create(WizardForm);

Ну или так
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
PrivilegesRequired=none
OutputDir=.

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

[_Code]
var
QuickLaunchIcon: TCheckBox;
 
function MakeQuickLaunchIcon: Boolean;
begin
    Result:=QuickLaunchIcon.Checked;
end;
 
procedure InitializeWizard();
begin
If FileExists(ExpandConstant('{src}\Redist\DirectX10\DXSETUP.exe')) then
begin
QuickLaunchIcon := TCheckBox.Create(WizardForm);
 with QuickLaunchIcon do
  begin
    Parent := WizardForm.SelectDirPage;
    Caption := 'Создать значок в Панели быстрого запуска';
    Left := ScaleX(0);
//    Left := WizardForm.DirEdit.Top + 100;
    Top := WizardForm.DirEdit.Top + 117;
    Width := ScaleX(300);
    Height := ScaleY(15);
    TabOrder := 0;
    Checked := False;
  end;
 end;
end;


R.i.m.s.k.y. 24-02-2012 15:06 1865711

Johny777, FileExists использовать религия индусская запрещает?
Код:

If (not FileExists(ExpandConstant('{src}\Redist\DirectX10\DXSETUP.exe'))) then
  begin 
  Icon_hl2 := TNewCheckBox.Create(WizardForm);
  ...


nik1967 24-02-2012 15:23 1865721

R.i.m.s.k.y., чуток подправил :)
Код:

If FileExists(ExpandConstant('{src}\Redist\DirectX10\DXSETUP.exe')) then
  begin 
  Icon_hl2 := TNewCheckBox.Create(WizardForm);
  ...

Давно Инно не занимался, и к стыду своему забыл, что есть функция "Файл существует" :blush:

R.i.m.s.k.y. 24-02-2012 15:48 1865743

nik1967, Johny777
ну это вам виднее, to not or not to be a not

Devils Night 24-02-2012 16:25 1865770

Немного сложный вопрос, интересует вот что:
В сетап имеется
Код:

[Setup]
AppName=Имя программы
DefaultDirName={pf}\Папка программы
DefaultGroupName=Папка в меню пуск

и есть компоненты
Код:

[Components]
Name: A; Description: Программа 1
Name: B; Description: Программа 2

как сделать так, чтобы например выбираю компонент Программа 1, то при установке, то что в AppName, в DefaultDirName и в DefaultGroupName, название Имя программы, папка в PF Папка программы и папка в пуске Папка в меню пуск заменялось на Программа 1, если выбираю компонент Программа 2, то Имя программы, Папка программы и папка в пуск Папка в меню пуск заменялось на Программа 2, возможно ли такое?

R.i.m.s.k.y. 24-02-2012 16:31 1865774

Devils Night
AppName - это опознаватель программы которую ты ставишь для системы
DefaultGroupName и DefaultDirName объявляются раньше страницы компонентов
Так что никак

Если бы передо мной стояла такая задача, я бы сделал 3 раздельных инсталлера: для Программа 1, для Программа 2 и третий со списком компонентов из "Программа 1, Программа 2" и выбранную прогу ставил втихую

Johny777 24-02-2012 20:06 1865910

R.i.m.s.k.y., nik1967,
спасибо
вот так всё супер
проверил
читать дальше »

Код:


[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
PrivilegesRequired=none
OutputDir=.

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

[Run]
Filename: {src}\Redist\DirectX10\DXSETUP.exe; Parameters: /silent; WorkingDir: {src}\Redist\DirectX10; StatusMsg: óñòàíîâêà äèðåêòà; Flags: skipifdoesntexist waituntilterminated; Check: MakeQuickLaunchIcon

[,Code]
var
QuickLaunchIcon: TCheckBox;

function MakeQuickLaunchIcon: Boolean;
begin
    Result:=QuickLaunchIcon.Checked;
end;

procedure InitializeWizard();
begin
If FileExists(ExpandConstant('{src}\Redist\DirectX10\DXSETUP.exe')) then
begin
QuickLaunchIcon := TCheckBox.Create(WizardForm);
 with QuickLaunchIcon do
  begin
    Parent := WizardForm.SelectDirPage;
    Caption := 'Ñîçäàòü çíà÷îê â Ïàíåëè áûñòðîãî çàïóñêà';
    Left := ScaleX(0);
//    Left := WizardForm.DirEdit.Top + 100;
    Top := WizardForm.DirEdit.Top + 117;
    Width := ScaleX(300);
    Height := ScaleY(15);
    TabOrder := 0;
    Checked := False;
  end;
 end;
end;


дальше по аналогии сделаю но с учётом своих названий чекбоксов

Devils Night,
как вариант можно сделать авторан состоящий из одной страницы с двумя переключателями, который после себя запускает одну из 2-х из внешней папки или копирует из самого себя в tmp
у обеих программ сделать полуодинаковые
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID") }_is1,InstallLocation|{pf}\program1}
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID") }_is1,InstallLocation|{pf}\program2}
и одинаковые
AppId=p12
AppId=p12
AppName=program1,2 - тоже одинаковые, но скрыть их на странице приветствия например и заменить на свои наименования
а в секции одной [InstallDelete] вписать всё, что нужно удалть от другой и наоборот (ярлыки, файлы в (app) итд)

____________________________________________
скажите пожалуйста
если один файл относится к многим чекбоксам, то нужно писать так?
[Files]
.....; Check: 1 and 2 and 3
или так
.....; Check: 1 or 2 or 3

Devils Night 25-02-2012 14:37 1866248

R.i.m.s.k.y.
Цитата:

Цитата R.i.m.s.k.y.
Так что никак »

Плохо.
Цитата:

Цитата R.i.m.s.k.y.
и третий со списком компонентов из "Программа 1, Программа 2 »

Две программмы в одну программу не вариант.

Johny777
Цитата:

Цитата Johny777
как вариант можно сделать авторан »

Только и остаётся, это как раз вариант.
Цитата:

Цитата Johny777
с двумя переключателями, который после себя запускает одну из 2-х из внешней папки »

Что то я не догнал.


В моём случае скорее подошло бы так:
Autorun

Код:

[Setup]
AppName=AutoRUN
VersionInfoDescription=AutoRUN
VersionInfoProductName=AutoRUN
AppVerName=AutoRUN
VersionInfoProductVersion=1.0.0.0
VersionInfoVersion=1.0.0.0
VersionInfoCompany=john
VersionInfoCopyright=Copyright © John
CreateAppDir=no
OutputDir=.
OutputBaseFilename=Autorun
;SetupIconFile=Icon.ico

[Languages]
Name: Russian; MessagesFile: compiler:Default.isl

[Files]
Source: 1.bmp; Flags: dontcopy

[Messages]
SetupAppTitle=AutoRUN

[ Code]
const
  BM_CLICK    = $00F5;

var
  AutoRun: TSetupForm;
  img1: TBitmapImage;
  PlayButton, InstallButton, UninstallButton, ExitButton: TButton;
  AppPath,UninsPath: string;
  ResultCode: Integer;
procedure CurPageChanged(CurPageID: Integer);
begin
  If CurPageID=wpWelcome then
  SendMessage(WizardForm.NextButton.Handle, BM_CLICK, 0, 0);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False
Cancel:=True
end;

procedure InstallButtonClick(Sender: TObject);
var
  CurPageID: Integer;
begin
  Exec(ExpandConstant('{src}\Setup.exe'),'','',SW_SHOW,ewNoWait,ResultCode)
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
end;

procedure ExitButtonClick(Sender: TObject);
var
  CurPageID: Integer;
begin
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
end;

procedure UninstallButtonClick(Sender: TObject);
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    UninsPath:=RemoveQuotes(UninsPath)
    Exec(UninsPath,'','',SW_SHOWNORMAL,ewNoWait,ResultCode)
    AutoRun.Close;
    PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
  end
end;

procedure CreateAutoRun;
begin
  //AutoRun
  AutoRun := CreateCustomForm;
  with AutoRun do begin
    Left := 498;
    Top := 75;
    Width := 495;
    Height := 200;
    BorderIcons := [];
    BorderStyle:=bsToolWindow //(bsNone, bsSingle, bsSizeable, bsDialog, bsToolWindow, bsSizeToolWin)
    Color := clBtnFace;
    Font.Color := clWindowText;
    Font.Height := -11;
    Font.Name := 'MS Sans Serif';
    Font.Style := [];
    Position := poScreenCenter;
    Caption:='AutoRUN'
  end;
  //img
  img1 := TBitmapImage.Create(AutoRun);
  ExtractTemporaryFile('1.bmp');
  with img1 do begin
    Parent := AutoRun;
    Left := 0;
    Stretch:= true;
    Top := 0;
    Width := Autorun.Width;
    Height := Autorun.Height;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  end;
  //InstallButton
  InstallButton:= TButton.Create(AutoRun);
  with InstallButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 80;
    Width := 150;
    Height := 22;
    Caption:= 'Установить';
    Cursor:= crHand;
    OnClick := @InstallButtonClick;
  end;
  //UninstallButton
  UninstallButton:= TButton.Create(AutoRun);
  with UninstallButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 110;
    Width := 150;
    Height := 22;
    Caption:= 'Удалить';
    Cursor:= crHand;
    OnClick := @UninstallButtonClick;
  end;
  //ExitButton
  ExitButton:= TButton.Create(AutoRun);
  with ExitButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 140;
    Width := 150;
    Height := 22;
    Caption:= 'Выход';
    Cursor:= crHand;
    OnClick := @ExitButtonClick;
  end;

  if not RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    InstallButton.Enabled:=true;
    UninstallButton.Enabled:=false;
  end;
  if RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    InstallButton.Enabled:=false;
    UninstallButton.Enabled:=true;
  end;

  AutoRun.ShowModal;
end;

procedure InitializeWizard;
begin
  CreateAutoRun;
end;

+
RadioButton

Код:

[ Code]var
  RadioButton1: TRadioButton;
  RadioButton2: TRadioButton;
  RadioButton3: TRadioButton;

procedure RedesignWizardForm;
begin
  RadioButton1 := TRadioButton.Create(WizardForm);
  with RadioButton1 do
  begin
    Name := 'Button1';
    Parent := WizardForm.SelectTasksPage;
    Left := 40;
    Top := 80;
    Width := 113;
    Height := 17;
  end;

  RadioButton2 := TRadioButton.Create(WizardForm);
  with RadioButton2 do
  begin
    Name := 'Button2';
    Parent := WizardForm.SelectTasksPage;
    Left := 40;
    Top := 110;
    Width := 113;
    Height := 17;
  end;

  RadioButton3 := TRadioButton.Create(WizardForm);
  with RadioButton3 do
  begin
    Name := 'Button3';
    Parent := WizardForm.SelectTasksPage;
    Left := 40;
    Top := 140;
    Width := 113;
    Height := 17;
  end;

  RadioButton1.TabOrder := 2;
  RadioButton2.TabOrder := 3;
  RadioButton3.TabOrder := 4;
end;

procedure InitializeWizard;
begin
  RedesignWizardForm;
end;

но чтоб каждый RadioButton выбирался как исключительным (не всё вместе), но чтоб все 3 были привязаны к одной кнопки установить, а вот как это сделать я незнаю.

Johny777 25-02-2012 18:58 1866415

Devils Night,
вот "автозапуск"
ищет во внешней папке program
setup_1.exe
setup_2.exe
setup_3.exe
если одного из них нет, то нет переключателя
читать дальше »
Код:

;      Скрипт создан с помощью
; IS GameScript Generator by South
;  специально для www.csmania.ru

#define MyAppName "Autorun"

[Setup]
SourceDir=.
OutputDir=Setup
AppName={#MyAppName}

AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false
//SetupIconFile=hl2.ico
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no

DisableProgramGroupPage=yes
DisableWelcomePage=yes
DisableDirPage=true

DisableFinishedPage=yes

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

[Messages]
Russian.SetupWindowTitle=%1
Russian.WizardReady=что установить?
Russian.ReadyLabel2b=

[CustomMessages]
Russian.go=Установить
English.go=Install
Russian.exit=Закрыть
English.exit=Close

[run]
Filename: {src}\program\setup_1.exe; WorkingDir: {src}\program; Flags: skipifdoesntexist nowait; Check: X;
Filename: {src}\program\setup_2.exe; WorkingDir: {src}\program; Flags: skipifdoesntexist nowait; Check: Y;
Filename: {src}\program\setup_2.exe; WorkingDir: {src}\program; Flags: skipifdoesntexist nowait; Check: Z;


[----Code]

var
  install_1: TNewRadioButton;
  install_2: TNewRadioButton;
  install_3: TNewRadioButton;

function X: Boolean;
 begin
 If FileExists(ExpandConstant('{src}\program\setup_1.exe')) then
  Result:=install_1.Checked;
  end;
    function Y: Boolean;
    begin
      If FileExists(ExpandConstant('{src}\program\setup_2.exe')) then
      Result:=install_2.Checked;
        end;
        function Z: Boolean;
          begin
          If FileExists(ExpandConstant('{src}\program\setup_3.exe')) then
            Result:=install_3.Checked;
            end;



         
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
Cancel:=True;
end;

procedure InitializeWizard();
begin
WizardForm.InnerPage.Color := clInfoBk;
 WizardForm.Color := clActiveCaption;
  WizardForm.MainPanel.Color := clActiveCaption;
  WizardForm.WizardSmallBitmapImage.Visible := False;
    WizardForm.BorderStyle := bsToolWindow;



  If FileExists(ExpandConstant('{src}\program\setup_1.exe')) then
    begin
    install_1 := TNewRadioButton.Create(WizardForm);
        with install_1 do
        begin
          Name := 'install_1';
          Parent := WizardForm.ReadyPage;
          Left := ScaleX(16);
          Top := ScaleY(24);
          Width := ScaleX(113);
          Height := ScaleY(17);
          Caption := 'program 1';

        end;
    end;
  If FileExists(ExpandConstant('{src}\program\setup_2.exe')) then
    begin
    install_2 := TNewRadioButton.Create(WizardForm);
        with install_2 do
        begin
          Name := 'install_2';
          Parent := WizardForm.ReadyPage;
          Left := ScaleX(80);
          Top := ScaleY(64);
          Width := ScaleX(113);
          Height := ScaleY(17);
          Caption := 'program 2';

        end;
    end;
  If FileExists(ExpandConstant('{src}\program\setup_3.exe')) then
    begin
    install_3 := TNewRadioButton.Create(WizardForm);
        with install_3 do
        begin
          Name := 'install_3';
          Parent := WizardForm.ReadyPage;
          Left := ScaleX(136);
          Top := ScaleY(112);
          Width := ScaleX(113);
          Height := ScaleY(17);
          Caption := 'program 3';

        end;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpReady then
    begin
    WizardForm.PageDescriptionLabel.Hide;
      WizardForm.NextButton.Caption:= ExpandConstant('{cm:go}');
      WizardForm.CancelButton.Caption:= ExpandConstant('{cm:exit}');
    end;
end;


Johny777 25-02-2012 19:41 1866438

не успел удалить првый и ты его же и взял
я переделал
в первом ошибки были
сейчас протестировал
всё работает
попробуй!
(пост выше)
или вот архивом
http://rghost.ru/36704123

Devils Night 25-02-2012 21:10 1866509

Цитата:

Цитата Johny777
попробуй! »

Всё конечно круто, но, где надпись "что установить? " идёт полоска, да и сама надпись ненужны, а так же внизу кнопки "Установить", "Закрыть", полоска тоже не нужна. Нужен фон картинка, желательно в PNG.

Что не так, как сделать?
читать дальше »
Код:

[Setup]
AppName=AutoRUN
VersionInfoDescription=AutoRUN
VersionInfoProductName=AutoRUN
AppVerName=AutoRUN
VersionInfoProductVersion=1.0.0.0
VersionInfoVersion=1.0.0.0
VersionInfoCompany=john
VersionInfoCopyright=Copyright © John
CreateAppDir=no
OutputDir=.
OutputBaseFilename=Autorun
;SetupIconFile=Icon.ico

[Languages]
Name: Russian; MessagesFile: compiler:Default.isl

[Run]
Filename: {src}\program\setup_1.exe; WorkingDir: {src}\program; Flags: skipifdoesntexist nowait; Check: X;
Filename: {src}\program\setup_2.exe; WorkingDir: {src}\program; Flags: skipifdoesntexist nowait; Check: Y;
Filename: {src}\program\setup_3.exe; WorkingDir: {src}\program; Flags: skipifdoesntexist nowait; Check: Z;

[Files]
Source: 1.bmp; Flags: dontcopy

[Messages]
SetupAppTitle=AutoRUN

[ Code]
const
  BM_CLICK    = $00F5;

var
  AutoRun: TSetupForm;
  img1: TBitmapImage;
  PlayButton, InstallButton, UninstallButton, ExitButton: TButton;
  AppPath,UninsPath: string;
  ResultCode: Integer;
 
 
procedure CurPageChanged(CurPageID: Integer);
begin
  If CurPageID=wpWelcome then
//  if CurPageID=wpReady then  //
//    begin
//    WizardForm.PageDescriptionLabel.Hide;
//      WizardForm.NextButton.Caption:= ExpandConstant('{cm:go}');
//      WizardForm.CancelButton.Caption:= ExpandConstant('{cm:exit}');
//    end;
  SendMessage(WizardForm.NextButton.Handle, BM_CLICK, 0, 0);
end;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False
Cancel:=True
end;

procedure InstallButtonClick(Sender: TObject);
var
  CurPageID: Integer;
begin
  Exec(ExpandConstant('{src}\Setup.exe'),'','',SW_SHOW,ewNoWait,ResultCode)
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
end;

procedure ExitButtonClick(Sender: TObject);
var
  CurPageID: Integer;
begin
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
end;

procedure UninstallButtonClick(Sender: TObject);
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    UninsPath:=RemoveQuotes(UninsPath)
    Exec(UninsPath,'','',SW_SHOWNORMAL,ewNoWait,ResultCode)
    AutoRun.Close;
    PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
  end
end;

procedure CreateAutoRun;
begin
  //AutoRun
  AutoRun := CreateCustomForm;
  with AutoRun do begin
    Left := 498;
    Top := 75;
    Width := 495;
    Height := 200;
    BorderIcons := [];
    BorderStyle:=bsToolWindow //(bsNone, bsSingle, bsSizeable, bsDialog, bsToolWindow, bsSizeToolWin)
    Color := clBtnFace;
    Font.Color := clWindowText;
    Font.Height := -11;
    Font.Name := 'MS Sans Serif';
    Font.Style := [];
    Position := poScreenCenter;
    Caption:='AutoRUN'
  end;
  //img
  img1 := TBitmapImage.Create(AutoRun);
  ExtractTemporaryFile('1.bmp');
  with img1 do begin
    Parent := AutoRun;
    Left := 0;
    Stretch:= true;
    Top := 0;
    Width := Autorun.Width;
    Height := Autorun.Height;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  end;
  //InstallButton
  InstallButton:= TButton.Create(AutoRun);
  with InstallButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 80;
    Width := 150;
    Height := 22;
    Caption:= 'Install';
    Cursor:= crHand;
    OnClick := @InstallButtonClick;
  end;
  //UninstallButton
  UninstallButton:= TButton.Create(AutoRun);
  with UninstallButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 110;
    Width := 150;
    Height := 22;
    Caption:= 'Удалить';
    Cursor:= crHand;
    OnClick := @UninstallButtonClick;
  end;
  //ExitButton
  ExitButton:= TButton.Create(AutoRun);
  with ExitButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 140;
    Width := 150;
    Height := 22;
    Caption:= 'Выход';
    Cursor:= crHand;
    OnClick := @ExitButtonClick;
  end;

  if not RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    InstallButton.Enabled:=true;
    UninstallButton.Enabled:=false;
  end;
  if RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    InstallButton.Enabled:=false;
    UninstallButton.Enabled:=true;
  end;

  AutoRun.ShowModal;
end;




var
  RadioButton1: TRadioButton;
  RadioButton2: TRadioButton;
  RadioButton3: TRadioButton;
 
function X: Boolean;
 begin
 If FileExists(ExpandConstant('{src}\program\setup_1.exe')) then
  Result:=RadioButton1.Checked;
  end;
    function Y: Boolean;
    begin
      If FileExists(ExpandConstant('{src}\program\setup_2.exe')) then
      Result:=RadioButton2.Checked;
        end;
        function Z: Boolean;
          begin
          If FileExists(ExpandConstant('{src}\program\setup_3.exe')) then
            Result:=RadioButton3.Checked;
            end;


//**********************Закоментировал дубль*****************************
//procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
//begin
//Confirm:=False;
//Cancel:=True;
//end;
//**********************Закоментировал дубль*****************************

procedure InitializeWizard();
begin
WizardForm.InnerPage.Color := clInfoBk;
WizardForm.Color := clActiveCaption;
WizardForm.MainPanel.Color := clActiveCaption;
WizardForm.WizardSmallBitmapImage.Visible := False;
WizardForm.BorderStyle := bsToolWindow;
   
   
   
If FileExists(ExpandConstant('{src}\program\setup_1.exe')) then
  begin
  RadioButton1 := TRadioButton.Create(WizardForm);
    with RadioButton1 do
    begin
      Name := 'RadioButton1';
      Parent := WizardForm.ReadyPage;
      Left := 40;
      Top := 80;
      Width := 113;
      Height := 17;
      Caption := 'program 1';
    end;
  end;

If FileExists(ExpandConstant('{src}\program\setup_2.exe')) then
  begin
    RadioButton2 := TRadioButton.Create(WizardForm);
      with RadioButton2 do
      begin
      Name := 'RadioButton2';
      Parent := WizardForm.ReadyPage;
      Left := 40;
      Top := 110;
      Width := 113;
      Height := 17;
      Caption := 'program 2';
    end;
  end;

  If FileExists(ExpandConstant('{src}\program\setup_3.exe')) then
    begin
    RadioButton3 := TRadioButton.Create(WizardForm);
        with RadioButton3 do
        begin
          Name := 'RadioButton3';
          Parent := WizardForm.ReadyPage;
    Left := 40;
    Top := 140;
    Width := 113;
    Height := 17;
    Caption := 'program 3';
        end;
    end;
    CreateAutoRun;
end;



Нужен авторан на основе:
читать дальше »
Код:

[Setup]
AppName=AutoRUN
VersionInfoDescription=AutoRUN
VersionInfoProductName=AutoRUN
AppVerName=AutoRUN
VersionInfoProductVersion=1.0.0.0
VersionInfoVersion=1.0.0.0
VersionInfoCompany=john
VersionInfoCopyright=Copyright © John
CreateAppDir=no
OutputDir=.
OutputBaseFilename=Autorun
;SetupIconFile=Icon.ico

[Languages]
Name: Russian; MessagesFile: compiler:Default.isl

[Files]
Source: 1.bmp; Flags: dontcopy

[Messages]
SetupAppTitle=AutoRUN

[ Code]
const
  BM_CLICK    = $00F5;

var
  AutoRun: TSetupForm;
  img1: TBitmapImage;
  PlayButton, InstallButton, UninstallButton, ExitButton: TButton;
  AppPath,UninsPath: string;
  ResultCode: Integer;
procedure CurPageChanged(CurPageID: Integer);
begin
  If CurPageID=wpWelcome then
  SendMessage(WizardForm.NextButton.Handle, BM_CLICK, 0, 0);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False
Cancel:=True
end;

procedure InstallButtonClick(Sender: TObject);
var
  CurPageID: Integer;
begin
  Exec(ExpandConstant('{src}\Setup.exe'),'','',SW_SHOW,ewNoWait,ResultCode)
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
end;

procedure ExitButtonClick(Sender: TObject);
var
  CurPageID: Integer;
begin
  AutoRun.Close;
  PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
end;

procedure UninstallButtonClick(Sender: TObject);
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    UninsPath:=RemoveQuotes(UninsPath)
    Exec(UninsPath,'','',SW_SHOWNORMAL,ewNoWait,ResultCode)
    AutoRun.Close;
    PostMessage(WizardForm.CancelButton.Handle, BM_CLICK, 0, 0);
  end
end;

procedure CreateAutoRun;
begin
  //AutoRun
  AutoRun := CreateCustomForm;
  with AutoRun do begin
    Left := 498;
    Top := 75;
    Width := 495;
    Height := 200;
    BorderIcons := [];
    BorderStyle:=bsToolWindow //(bsNone, bsSingle, bsSizeable, bsDialog, bsToolWindow, bsSizeToolWin)
    Color := clBtnFace;
    Font.Color := clWindowText;
    Font.Height := -11;
    Font.Name := 'MS Sans Serif';
    Font.Style := [];
    Position := poScreenCenter;
    Caption:='AutoRUN'
  end;
  //img
  img1 := TBitmapImage.Create(AutoRun);
  ExtractTemporaryFile('1.bmp');
  with img1 do begin
    Parent := AutoRun;
    Left := 0;
    Stretch:= true;
    Top := 0;
    Width := Autorun.Width;
    Height := Autorun.Height;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\1.bmp'));
  end;
  //InstallButton
  InstallButton:= TButton.Create(AutoRun);
  with InstallButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 80;
    Width := 150;
    Height := 22;
    Caption:= 'Установить';
    Cursor:= crHand;
    OnClick := @InstallButtonClick;
  end;
  //UninstallButton
  UninstallButton:= TButton.Create(AutoRun);
  with UninstallButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 110;
    Width := 150;
    Height := 22;
    Caption:= 'Удалить';
    Cursor:= crHand;
    OnClick := @UninstallButtonClick;
  end;
  //ExitButton
  ExitButton:= TButton.Create(AutoRun);
  with ExitButton do begin
    Parent:= AutoRun;
    Left := 300;
    Top := 140;
    Width := 150;
    Height := 22;
    Caption:= 'Выход';
    Cursor:= crHand;
    OnClick := @ExitButtonClick;
  end;

  if not RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    InstallButton.Enabled:=true;
    UninstallButton.Enabled:=false;
  end;
  if RegQueryStringValue(HKLM, 'SOFTWARE\Game','UninstallString', UninsPath) then
  begin
    InstallButton.Enabled:=false;
    UninstallButton.Enabled:=true;
  end;

  AutoRun.ShowModal;
end;

procedure InitializeWizard;
begin
  CreateAutoRun;
end;

но с RadioButton.

Johny777 25-02-2012 21:32 1866534

Devils Night,
в дизайнере открой
на странице Ready сдвинь влево на 1000 пикселей что не нужно или visible= false
картинку можешь встаить bmp там же
пнг это через ботву, которую я ни разу не использовал
можно бмп в фотошопе полупрозрачным сделать
...или позже сам доделаю
Цитата:

Цитата Devils Night
ненужны, а так же внизу кнопки "Установить", "Закрыть", »

ладно кнопка "закрыть", но без "установить" с тремя переключателями как им пользоваться? o_O

Devils Night 25-02-2012 21:43 1866544

Цитата:

Цитата Johny777
в дизайнере открой
на странице Ready сдвинь влево на 1000 пикселей что не нужно или visible= false »

Да причём здесь инсталл, когда хочу с автораном из справки разобраться?!
нужно не из авторана в инсталятор функции добавить, а в авторан, в котором уже почти всё присутствует кроме RadioButton.
Цитата:

Цитата Johny777
ладно кнопка "закрыть", но без "установить" с тремя переключателями как им пользоваться? »

Я вообще то не про кнопки, а про обрамление вокруг них.

Johny777 26-02-2012 02:28 1866706

Цитата:

Цитата Devils Night
Я вообще то не про кнопки, а про обрамление вокруг них. »

используй скин (добавил)
добавил всплывающие подсказки
добавил константы названий и всплывающих подсказок/описаний переключателей
не зная как сделать чекбоксы и их названия прозрачными разместил их все на панели
вот код
читать дальше »
Код:

;      Скрипт создан с помощью
; IS GameScript Generator by South
;  специально для www.csmania.ru

#define MyAppName "Autorun"

[Setup]
SourceDir=.
OutputDir=Setup
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false
//SetupIconFile=hl2.ico
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no
DisableProgramGroupPage=yes
DisableWelcomePage=yes
DisableDirPage=true
DisableFinishedPage=yes


[Files]
DestName: "WizardForm.Image.bmp"; Source: "Image.bmp"; Flags: dontcopy solidbreak
Source: ISSkin.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: skin.cjstyles; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

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

[Messages]
Russian.SetupWindowTitle=%1
WizardReady=
ReadyLabel2b=

[CustomMessages]
Russian.go=Установить
English.go=Install
Russian.exit=Закрыть
English.exit=Close

Russian.desc1=описание первой программы
English.desc1=
Russian.desc2=описание второй программы
English.desc3=
Russian.desc3=описание третьей программы
English.desc3=

Russian.p1=название первой программы
English.p1=
Russian.p2=название второй программы
English.p2=
Russian.p3=название третьей программы
English.p3=

[run]
Filename: {src}\program\setup_1.exe; WorkingDir: {src}\program; Flags: skipifdoesntexist nowait; Check: X;
Filename: {src}\program\setup_2.exe; WorkingDir: {src}\program; Flags: skipifdoesntexist nowait; Check: Y;
Filename: {src}\program\setup_2.exe; WorkingDir: {src}\program; Flags: skipifdoesntexist nowait; Check: Z;

[.......Code]
var
 install_1: TNewRadioButton;
 install_2: TNewRadioButton;
 install_3: TNewRadioButton;
 Initialize:Boolean;
 Image: TBitmapImage;
 Panel1: TPanel;
 
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
function ShowWindow(hWnd: Integer; uType: Integer): Integer; external 'ShowWindow@user32.dll stdcall';

function InitializeSetup:boolean;
begin
Initialize:=False;
  ExtractTemporaryFile('skin.cjstyles');
  LoadSkin(ExpandConstant('{tmp}')+'\skin.cjstyles', '');
  Result:=True;
Result:=True;
end;

function X: Boolean;
 begin
 If FileExists(ExpandConstant('{src}\program\setup_1.exe')) then
  Result:=install_1.Checked;
  end;
    function Y: Boolean;
    begin
      If FileExists(ExpandConstant('{src}\program\setup_2.exe')) then
      Result:=install_2.Checked;
        end;
        function Z: Boolean;
          begin
          If FileExists(ExpandConstant('{src}\program\setup_3.exe')) then
            Result:=install_3.Checked;
            end;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=False;
Cancel:=True;
end;

procedure InitializeWizard();
begin
WizardForm.CancelButton.BringToFront;
WizardForm.NextButton.BringToFront;
WizardForm.CancelButton.Left := ScaleX(120);
WizardForm.CancelButton.Top := ScaleY(30);
WizardForm.NextButton.Left := ScaleX(20);
WizardForm.NextButton.Top := ScaleY(30);
WizardForm.BorderStyle := bsToolWindow;
WizardForm.InnerNotebook.Hide;
WizardForm.OuterNotebook.Hide;
WizardForm.ClientHeight := ScaleY(539);
WizardForm.ClientWidth := ScaleX(719);
  Panel1 := TPanel.Create(WizardForm);
        with Panel1 do
        begin
          Name := 'Panel1';
          Parent := WizardForm;
          Left := ScaleX(20);
          Top := ScaleY(60);
          Width := ScaleX(180);
          Height := ScaleY(90);
          BevelOuter := bvLowered;
          Caption := '';
      end;
  Image := TBitmapImage.Create(WizardForm);
        with Image do
        begin
          Name := 'Image';
          Parent := WizardForm;
          Left := ScaleX(0);
          Top := ScaleY(0);
          Width := ScaleX(719);
          Height := ScaleY(539);
          ExtractTemporaryFile('WizardForm.Image.bmp');
          Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardForm.Image.bmp'));
      end;
  If FileExists(ExpandConstant('{src}\program\setup_1.exe')) then
    begin
    install_1 := TNewRadioButton.Create(WizardForm);
        with install_1 do
        begin
          Name := 'install_1';
          Parent := Panel1;
          Left := ScaleX(10);
          Top := ScaleY(10);
          Width := ScaleX(190);
          Height := ScaleY(17);
          Caption := ExpandConstant('{cm:p1}');
          Hint := ExpandConstant('{cm:desc1}');
          ShowHint := True;
          Checked:= True;
        end;
    end;
  If FileExists(ExpandConstant('{src}\program\setup_2.exe')) then
    begin
    install_2 := TNewRadioButton.Create(WizardForm);
        with install_2 do
        begin
          Name := 'install_2';
          Parent := Panel1;
          Left := ScaleX(10);
          Top := ScaleY(35);
          Width := ScaleX(190);
          Height := ScaleY(17);
          Caption := ExpandConstant('{cm:p2}');
          Hint := ExpandConstant('{cm:desc2}');
          ShowHint := True;
          Checked:= True;
        end;
    end;
  If FileExists(ExpandConstant('{src}\program\setup_3.exe')) then
    begin
    install_3 := TNewRadioButton.Create(WizardForm);
        with install_3 do
        begin
          Name := 'install_3';
          Parent := Panel1;
          Left := ScaleX(10);
          Top := ScaleY(60);
          Width := ScaleX(190);
          Height := ScaleY(17);
          Caption := ExpandConstant('{cm:p3}');
          Hint := ExpandConstant('{cm:desc3}');
          ShowHint := True;
          Checked:= True;
        end;
    end;
  Initialize:=True;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpReady then
    begin
    WizardForm.PageDescriptionLabel.Hide;
      WizardForm.NextButton.Caption:= ExpandConstant('{cm:go}');
      WizardForm.CancelButton.Caption:= ExpandConstant('{cm:exit}');
    end;
end;

procedure DeinitializeSetup;
begin
 if Initialize then
  begin
    ShowWindow(WizardForm.Handle,0);
    UnloadSkin();
  end;
end;


или архив с картинкой :), библиотекой и скином
http://rghost.ru/36712056

R.i.m.s.k.y. 28-02-2012 10:00 1868188

Подскажите, пожалуйста, как в реестр записать путь к программе в формате 8.3, т.е. не C:\\Program FIles\\Prog, а C:\\PROGRA~1\\Prog
Я знаю есть функция GetShortName, но в коде не хочется переписывать 15 параметров.
ValueData: GetShortName(ExpandConstant('app')) не прокатывает, в реестр пишется это как строчка, а не как результат (что неудивительно)
не прокатывает и {code:GetShortName(ExpandConstant('app'))}, ругается что такой функции не найдено (этож хранимка, какой не найдено?!)

И еще, как удалить не из кода значение в реестре, про флаг deletevalue я знаю, но он удаляет перед записью значение в реестре, хотелось бы чтобы удалил и не записал.

Заранее благодарю

Devils Night 28-02-2012 18:00 1868539

Подскажите, как сделать так чтобы писалось не регистрация файлов, а регистрация DLL
Код:

[Files]
Source: shell32.dll; DestDir: {app}; Flags: regserver

?

R.i.m.s.k.y. 28-02-2012 18:07 1868548

Devils Night, это монопениссуально!

Devils Night 28-02-2012 18:56 1868594

Цитата:

Цитата R.i.m.s.k.y.
это монопениссуально! »

Чего?

R.i.m.s.k.y. 28-02-2012 19:26 1868623

Devils Night, ну изочленно
в смысле регистрация файлов и регистрация DLL одно и тоже
Или ты видишь разницу?

nik1967 29-02-2012 10:10 1869020

Цитата:

Цитата Devils Night
Подскажите, как сделать так чтобы писалось не регистрация файлов, а регистрация DLL »

Если очень хочется, то открываешь Russian.isl, находишь в нём
StatusRegisterFiles=Регистрация файлов... и меняешь на StatusRegisterFiles=Регистрация DLL...

R.i.m.s.k.y. 29-02-2012 10:19 1869024

nik1967, Devils Night,
можно проще
Код:

[Messages]
StatusRegisterFiles=Регистрация DLL...

или если инсталл многоязыковый
Код:

[Messages]
russian.StatusRegisterFiles=Регистрация DLL...

я даже и не подумал что нужно слова поправить


на мой вопрос выше кто-нибудь внимание обратит?

vitl 29-02-2012 12:55 1869117

Подскажите, пожалуйста, как создать папки с определенными правами следующим образом:

Folder1\ - группе 'Все' разрешения на "Чтение и выполнение", "Список содержимого папки", "Чтение".
Folder1\Folder2\ - группе 'Все' разрешения на всё, кроме "Полного доступа".

ПРИМЕЧАНИЕ: На вкладке Безопасность кроме группы "Все" никого не должно быть.

El Sanchez 29-02-2012 14:05 1869177

Цитата:

Цитата R.i.m.s.k.y.
не прокатывает и {code:GetShortName(ExpandConstant('app'))}, ругается что такой функции не найдено »

R.i.m.s.k.y.,
Код:

...ValueData: {code:GetShortName|{app}}
Цитата:

Цитата R.i.m.s.k.y.
И еще, как удалить не из кода значение в реестре, про флаг deletevalue я знаю, но он удаляет перед записью значение в реестре, хотелось бы чтобы удалил и не записал. »

R.i.m.s.k.y.,
Цитата:

dontcreatekey
When this flag is specified, Setup will not attempt to create the key or any value if the key did not already exist on the user's system. No error message is displayed if the key does not exist.

R.i.m.s.k.y. 29-02-2012 14:35 1869202

El Sanchez, ключевое слово if the key did not already exist
у меня наоборот already exist и надо его стереть при установке

El Sanchez 29-02-2012 14:57 1869223

R.i.m.s.k.y., ну так используй совместно с deletevalue. deletevalue перед записью значения попытается его удалить и ведь запишет же, если бы не dontcreatekey, который это значение не даст прописать.

cliff99 29-02-2012 15:26 1869248

Добрый день требуется помощь я обрыл всё но ничего не нашёл по своей проблеме:

Мне знать как это окно растянуть или на середну переместить.
Где изменить его размер ?
Помогите пожалуйста.
Какие команды отвечают за его размер ?

Serega 29-02-2012 15:45 1869262

Цитата:

Цитата R.i.m.s.k.y.
И еще, как удалить не из кода значение в реестре »

Через секцию [Run], командой "reg delete HKLM\Software\My Company /f", подробнее можно глянуть здесь.
Цитата:

Цитата vitl
Подскажите, пожалуйста, как создать папки с определенными правами следующим »

Посмотрите в Справке про секцию [Dirs]

ARS_23 29-02-2012 16:51 1869307

cliff99,
примерно так можно центрировать (размеры конечно под себя подгоняй)
а вообще можно легко все это в форм дизайнере сделать.

Код:

with WizardForm.OuterNotebook do begin
  Width := ScaleX(785); Height := ScaleY(521);
end;
with WizardForm.InnerNotebook do begin
  Left := ScaleX(200); Top := ScaleY(150);
end;


cliff99 29-02-2012 17:20 1869329

Да эта штука перенеслась на центр.

Но зато изображения с предыдущих страниц тоже перетянулись.

А где взять форм дизайнер ?

cliff99 29-02-2012 18:08 1869353

Блин пол дня убил и ничего не добился.
И форм дизайнер не могу найти..

valyok666 29-02-2012 20:22 1869482

cliff99, Cкачай Inno Ultra там всё что душе угодно=)Скачать тут

Devils Night 29-02-2012 22:55 1869618

Цитата:

Цитата R.i.m.s.k.y.
в смысле регистрация файлов и регистрация DLL одно и тоже »

А, ну это понятно, то что регистрация DLL, OCX и.т.д.
Цитата:

Цитата nik1967
StatusRegisterFiles »

Цитата:

Цитата R.i.m.s.k.y.
StatusRegisterFiles »

В IStool то начало искал по Reg а не по Status, вот и подумал что может как то иначе всё это делается, может даже через код, Inno то замудрёная.
nik1967, R.i.m.s.k.y., Спасибо.

Цитата:

Цитата cliff99
Блин пол дня убил и ничего не добился.
И форм дизайнер не могу найти.. »

А если бы залез сюда и почитал бы под спойлером Расширенная версия Inno Setup от Restools -> Инструкция по установке то думаю понял бы, почему не добился, и если не ошибаюсь должна появится вкладка Редактор форм.

Цитата:

Цитата valyok666
Cкачай Inno Ultra там всё что душе угодно Скачать тут »

Новичкам и не только самое оно :good:!

cliff99 29-02-2012 23:39 1869660

valyok666,
Спасибо скачал но проблему не могу решить свою хоть убей...
Всё -Огромное вам спасибо наконец удалось передвинуть куда нужно
Только что - то изображение туда добавить не получается через этот редактор никак.
BMP
Всё - разобрался.

FanN 03-03-2012 05:22 1871320

Привет. Мне интересно повышения скорость распаковки.. Полазал по разным ссылка, даже скачал какие-то примеры скрипта с freearc, но толком ничего не понял.. Не могли бы вы подробно разъяснить как увеличить скорость распаковки с примерами? Спасибо.

FanN 03-03-2012 06:57 1871324

И еще вопрос: как вшить в инсталлятор свой шрифт? Как я понял, форточка не распознает шрифт просто так, его нужно вначале установить, а для этого нужно добавить строку в реестре и скопировать сам шрифт на системный диск.. Хотело бы увидеть как это будет выглядеть.. Спасибо.

З.Ы. в виде батника и рэг-файла не подходит, хотелось, чтобы все было прописано а инталляторе

Johny777 03-03-2012 19:08 1871654

Цитата:

Цитата FanN
И еще вопрос: как вшить в инсталлятор свой шрифт? Как я понял, форточка не распознает шрифт просто так, его нужно вначале установить, а для этого нужно добавить строку в реестре и скопировать сам шрифт на системный диск.. Хотело бы увидеть как это будет выглядеть.. Спасибо. »

2 примера

читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
OutputBaseFilename=setup
 
[Files]
Source: Alterna.ttf; Flags: dontcopy
 
[_Code]
function AddFontResource(FileName: PAnsiChar): Integer; external 'AddFontResourceA@gdi32.dll stdcall';
function RemoveFontResource(FileName: PAnsiChar): BOOL; external 'RemoveFontResourceA@gdi32.dll stdcall';
 
function InitializeSetup(): boolean;
begin
  ExtractTemporaryFile('Alterna.ttf');
  Result:=AddFontResource(ExpandConstant('{tmp}')+'\Alterna.ttf')>0; //добавляем шрифт в таблицу шрифтов
  if Result then SendMessage(HWND_BROADCAST,$1D,0,0); //оповещаем окна верхнего уровня о том, что изменилась таблица шрифтов
end;
 
procedure InitializeWizard();
begin
  WizardForm.WelcomeLabel1.Font.Name:= 'a_AlternaBrk';
  WizardForm.WelcomeLabel1.Font.Style:= [fsBold];
end;
 
procedure DeinitializeSetup();
begin
  //удаляем свой шрифт и оповещаем окна верхнего уровня о том, что изменилась таблица шрифтов
  if RemoveFontResource(ExpandConstant('{tmp}')+'\Alterna.ttf') then SendMessage(HWND_BROADCAST,$1D,0,0);
end;


,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,


#define Font "Zombie.ttf"
#define FontName "DS Zombie Cyr"

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

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

[Files]
Source: {#Font}; Flags: dontcopy;

[_code]
var
IsCustomFontInstalled: boolean;
FontName: string;

function AddFontResource(FileName: PAnsiChar): Integer; external 'AddFontResourceA@gdi32.dll stdcall';
function RemoveFontResource(FileName: PAnsiChar): BOOL; external 'RemoveFontResourceA@gdi32.dll stdcall';

Procedure InitializeWizard();
begin
ExtractTemporaryFile('{#Font}');
IsCustomFontInstalled:=AddFontResource(ExpandConstant('{tmp}')+'\{#Font}')>0;
if IsCustomFontInstalled then SendMessage(HWND_BROADCAST,$1D,0,0);
if FontExists('{#FontName}') then FontName:='{#FontName}' else FontName:='Arial';
WizardForm.Font.Name:= FontName;
end;

procedure DeInitializeSetup();
begin
WizardForm.Free
if IsCustomFontInstalled then
if RemoveFontResource(ExpandConstant('{tmp}')+'\{#Font}') then SendMessage(HWND_BROADCAST,$1D,0,0);
end;


Ivan_009 04-03-2012 15:57 1872109

Как мне сделать страницу с выбором программной группы помогите пожалуйста вот скрипт

Rikill 04-03-2012 16:14 1872123

Johny777, это кривые варианты. У некоторых не будет работать.

Johny777 04-03-2012 18:55 1872251

Rikill,
у тебя есть лучше?
(сам один пример использую)
Цитата:

Цитата Rikill
некоторых не будет работать »

от чего зависит?

FanN 04-03-2012 20:24 1872324

Johny777, спасибо, второй вариант помог.

FanN 04-03-2012 22:46 1872432

А как сделать так, чтобы фон текста был прозрачен? Что прописывать? Заранее благодарю.

Johny777 05-03-2012 00:34 1872515

не уверен, но припиши на каждом тексте
Transparent:=True;

DragonTander@fb 05-03-2012 04:33 1872578

уже ничего, удалите это сообщение пожалуйста

Rikill 05-03-2012 19:34 1873026

Johny777, у меня есть лучше. Закрытый вариант.
Зависит не известно от чего.
DragonTander@fb, а самому удалить сообщение не судьба?

Johny777 05-03-2012 22:33 1873133

Цитата:

Цитата Rikill
Закрытый вариант. »

?
Цитата:

Цитата Rikill
у меня есть лучше »

можешь поделиться?
Цитата:

Цитата Rikill
Зависит не известно от чего. »

там где я нашёл эти решения писали, что зависит от уровня убитости виндоуса

YURSHAT 06-03-2012 01:49 1873238

Цитата:

Цитата Rikill
ohny777, это кривые варианты. У некоторых не будет работать. »

Если немного подправить, то заработает у всех :)

Цитата:

Цитата FanN
И еще вопрос: как вшить в инсталлятор свой шрифт? »

Установка временного шрифта
Код:

#define Font "Alterna.ttf"
#define FontName "Alterna"

[Setup]
AppName=SetTemporaryFont
AppVerName=SetTemporaryFont
DefaultDirName={pf}\SetTemporaryFont
OutputBaseFilename=setup

[Files]
Source: {#Font}; Flags: dontcopy

[Code ]

var
  IsCustomFontInstalled: boolean;
  FontName: string;

function AddFontResource(FileName: PAnsiChar): Integer; external 'AddFontResourceA@gdi32.dll stdcall';
function RemoveFontResource(FileName: PAnsiChar): BOOL; external 'RemoveFontResourceA@gdi32.dll stdcall';

function InitializeSetup: boolean;
begin
  FontName:='Tahoma';
  ExtractTemporaryFile('{#Font}');
  IsCustomFontInstalled:=AddFontResource(ExpandConst  ant('{tmp}')+'\{#Font}')>0;
  if IsCustomFontInstalled then PostMessage(HWND_BROADCAST,$1D,0,0);
  if FontExists('{#FontName}') then FontName:='{#FontName}' else FontName:='Arial';
  if IsCustomFontInstalled then FontName:='{#FontName}';
  Result:=True;
end;

procedure InitializeWizard;
begin
  WizardForm.Font.Name:=FontName;
end;

procedure DeinitializeSetup;
begin
  WizardForm.Free
  if IsCustomFontInstalled then
  if RemoveFontResource(ExpandConstant('{tmp}')+'\{#Font}') then PostMessage(HWND_BROADCAST,$1D,0,0);
end;


Aquila 06-03-2012 13:50 1873468

Я бы хотел спросить можно ли сжать файлы лучше чем ultra ? Может быть 7z'ом запаковать и можно чтобы он извлекал из файла .7z но показывал как обычную распаковку программой ?

R.i.m.s.k.y. 06-03-2012 14:16 1873483

Aquila, Inno и сам использует 7z, так что смысла нет

Aquila 06-03-2012 14:25 1873493

R.i.m.s.k.y., А файлы .arc - это что ? Замечал что есть инсталяторы inno setup с использованием этих архивов.

R.i.m.s.k.y. 06-03-2012 14:27 1873495

Aquila, не поверишь - freearc!
но лично я не вижу смысла в нем, места занимают не намного меньше, а калорийности требуют сильно больше, при установке требуется для распаковки рама, место на жеском и время.
Это не твой выбор, бро!

кстати про 7зип: я делал дистр Ведьмака1 на инно с максимальным сжатием, и для сравнения сжал эту же папку 7зипом с теми же настройками, так вот инно утоптал на 100 метров сильнее, хотя при общем весе почти 9 гиг эти 100 метров что слону булочка

Aquila 06-03-2012 14:38 1873501

R.i.m.s.k.y., Спасибо за подробное пояснение :up

R.i.m.s.k.y. 06-03-2012 14:44 1873506

Aquila, да пожалста!
"полезное сообщение" давануть не забудь!

Johny777 06-03-2012 15:57 1873551

Aquila,
настройка стндартных средств на максимальное сжатие
сожми с разными размерами словаря и узнаешь что тебе лучше
Compression=lzma2/ultra64
LZMAUseSeparateProcess=yes
LZMAMatchFinder=BT
LZMANumFastBytes=273
LZMADictionarySize=262144
///LZMADictionarySize=131072
InternalCompressLevel=ultra64
///SolidCompression=true
MergeDuplicateFiles=true
___________________________________________________________

сделал деинсталятор с выбором компонентов:
1. в основной установщик вписать это
читать дальше »
Код:

[Setup]
/// привык держать деинсталятор в отдельной папке
UninstallFilesDir={app}\uninstall

[Files]
/// эта строка в конце секции, тк наш заранее скомпилированный деинсталятор пакуется вместе с файлами основного инсталятора и разумно будет распаковать его в конце
Source: uninstall\Setup\Uninstall.exe; DestDir: {app}\uninstall; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension;

[UninstallDelete]
/// удаление приложени нацелено на удаление всей папки!
Type: filesandordirs; Name: {app}

[_Code]
procedure CurPageChanged(CurPageID: Integer);
  begin
    if CurPageID=wpInstalling then
      begin
/// переименовываем созданный автоматом родной деинсталятор в например unins007.exe и unins007.dat
        if FileExists(ExpandConstant('{app}\uninstall\unins000.exe')) then
        RenameFile(ExpandConstant('{app}\uninstall\unins000.exe'), ExpandConstant('{app}\uninstall\unins007.exe'))
        if FileExists(ExpandConstant('{app}\uninstall\unins000.dat')) then
        RenameFile(ExpandConstant('{app}\uninstall\unins000.dat'), ExpandConstant('{app}\uninstall\unins007.dat'))
/// теперь переименовываем наш деинсталятор в родное название (см выше) unins000.exe
        if FileExists(ExpandConstant('{app}\uninstall\Uninstall.exe')) then
        RenameFile(ExpandConstant('{app}\uninstall\Uninstall.exe'), ExpandConstant('{app}\uninstall\unins000.exe'))
      end;
end;

в основном скрипте мы закончили



2. сам деинсталятор
читать дальше »
Код:

#define MyAppName "Uninstall"

[Setup]
AppId=proto15
SourceDir=.
OutputDir=Setup
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false
//SetupIconFile=hl2.ico

ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no
DisableProgramGroupPage=yes
DisableWelcomePage=yes
DisableDirPage=yes
DisableReadyPage=yes
DisableFinishedPage=yes




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




[Components]
Name: hl2; Description: Half-life 2; Check: del_hl2
Name: ep1; Description: Half-life 2 Episode One; Check: del_ep1
Name: ep2; Description: Half-life 2 Eposode Two; Check: del_ep2
Name: portal; Description: Portal; Check: del_portal

///всё как с обычно - файлы помеченные одним компонентов или несколькими, если фай общий, но заде для секции [InstallDelete], которая выполняется перед установкой
[InstallDelete]
Type: filesandordirs; Name: {src}\..\common\half-life 2; Components: hl2
Type: filesandordirs; Name: {src}\..\common\half-life 2 episode one; Components: ep1
Type: filesandordirs; Name: {src}\..\common\half-life 2 episode two; Components: ep2
Type: filesandordirs; Name: {src}\..\common\portal; Components: portal

Type: files; Name: {src}\..\half-life 2 buka russian.gcf; Components: hl2
Type: files; Name: {src}\..\half-life 2 2007 base content.gcf; Components: hl2
Type: files; Name: {src}\..\half-life 2 content.gcf; Components: hl2
Type: files; Name: {src}\..\half-life 2 game dialog.gcf; Components: hl2
Type: files; Name: {src}\..\episode one 2007 content.gcf; Components: ep1
Type: files; Name: {src}\..\half-life 2 episode one.gcf; Components: ep1
Type: files; Name: {src}\..\episode two content.gcf; Components: ep2
Type: files; Name: {src}\..\episode two maps.gcf; Components: ep2
Type: files; Name: {src}\..\episode two materials.gcf; Components: ep2

Type: files; Name: {src}\..\source 2007 binaries 2.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\half-life 2_russian.gcf; Components: hl2 and ep1 and ep2
Type: files; Name: {src}\..\portal content.gcf; Components: portal
Type: files; Name: {src}\..\portal english.gcf; Components: portal
Type: files; Name: {src}\..\portal russian.gcf; Components: portal
Type: files; Name: {src}\..\source 2007 shared materials.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source 2007 shared models.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source 2007 shared sounds.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source materials.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source models.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source sounds.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\episode 1 shared.gcf; Components: ep1 and ep2
Type: files; Name: {src}\..\episodic 2007 shared.gcf; Components: ep1 and ep2
Type: files; Name: {src}\..\half-life 2 episode one russian.gcf; Components: ep1 and ep2
Type: files; Name: {src}\..\half-life 2 episode two english.gcf; Components: ep2
Type: files; Name: {src}\..\half-life 2 episode two russian.gcf; Components: ep2

Name: {commondesktop}\Half-Life 2.lnk; Type: files; Components: hl2
Name: {commondesktop}\Half-Life 2 Episode One.lnk; Type: files; Components: ep1
Name: {commondesktop}\Half-Life 2 Episode Two.lnk; Type: files; Components: ep2
Name: {commondesktop}\Portal.lnk; Type: files; Components: portal

[_Code]
/// здесь начинается проверка устанолен компонент или нет. Лучше всего проверять уникальный файл, но в моём случае проверяются одинаковые файлы, но в разных директориях /// начало ///провнрки
function del_hl2:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') then
  Result:=False
end;
end;


function del_ep1:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') then
  Result:=False
end;
end;


function del_ep2:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') then
  Result:=False
end;
end;


function del_portal:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\portal'))='') then
  Result:=False
end;
end;

/// конец проверки.//// если какого то файла нет, то и нет чекбокса в окне списка компонентов

Var
  ResultCode: integer;
/// а теперь главное. Если удалить один компонет, то общие файлы не удаляться, тк используются другим компонентом. Я столкнулся с проблемой, что удалил всё, но основа остаётся, поэтому идёт такая же проверка как и сверху и если нет ни одного компонента (уникального файла, подтверждающего наличие компонента), то выпоняется родное удаление в очень тихом режиме и удаляется вся
///папка. Разберём пример. При инициализации деинсталятор "видит" 2 компонента - hl2 и портал. При удалении только портала удаляется всё уникальное от портала, но hl2 и общие файлы ///остаются, тут же доходит до дейстий кода ниже. Идёт вторая проверка, но не нацеленная не на создание чекбокса, а на проверку есть ли хоть один компонент и он есть - это hl2. Вызываем //деинстаятор ещё раз и видим в списке только hl2. Удаляем и снова доходит до второй проверки на шаге ssDone. Он не видит не одного hl2.exe в разных директория, и вызывает другой //деинсталятор, который трёт всё
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssDone then
    If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') and (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and
    (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') and (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\portal'))='')
    then
  Exec(ExpandConstant('{src}\unins007.exe'),'/VERYSILENT','', SW_SHOW, ewNoWait, ResultCode);
end;
 
чтобы данный деинсталятор работал нужно знать общие,  и уникальные файлы приложения. А также нужен хотя бы оди уникальный файл на проверку наличия компонента.



проверено
работает как часы

R.i.m.s.k.y. 06-03-2012 16:05 1873557

Johny777, тож вариант, но для разбора компонентов можно использовать ключ реестра \\\Registry\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{AppName}_is1\Inn o Setup[colon] Selected Components
ну и SolidCompression=true лучше не комментировать, а в секции Files для мелких файлов указывать флаг SolidBreak
Ну и можно добавить CompressionThreads=4

Johny777 06-03-2012 16:24 1873571

Цитата:

Цитата R.i.m.s.k.y.
CompressionThreads=4 ... а в секции Files для мелких файлов указывать флаг SolidBreak»

спасибо попробую
Цитата:

Цитата R.i.m.s.k.y.
SolidCompression=true лучше не комментировать »

в случае если есть компоненты оно лишнее, но когда компонент 1, то это может неплохо уменьшить размер

R.i.m.s.k.y. 06-03-2012 16:28 1873575

Johny777, ну вот и указывай в каждой новой строчке с другой компонентой флаг SolidBreak

This flag instructs the compiler to finalize the current compression stream and begin a new one before compressing the file(s) matched by Source. This allows Setup to seek to the file instantly without having to decompress any preceding files first. May be useful in a large, multi-component installation if you find too much time is being spent decompressing files belonging to components that weren't selected.

ToBeLife 06-03-2012 22:24 1873885

Здравствуйте.

помогите пожалуйста разобраться в проблеме.
сделал инсталятор с возможностью выбора компонентов, установка и все манипуляции проходят нормально, а вот удаление программы происходит корректно, только при условии, что были выбраны все компоненты, иначе Internal error: Cannot find utCompiledCode record for this version of the uninstaller

R.i.m.s.k.y. 06-03-2012 22:28 1873888

ToBeLife, код клещами вытаскивать?

ToBeLife 06-03-2012 22:40 1873891

извиняюсь
код
Код:

#define MyAppName "Tiberian Sun Pack"
#define MyAppVersion "1.1"
#define MyAppPublisher "Westwood Studios ©®"
#define MyAppURL "http://www.ea.com/"
#define MyAppExeName "Game.exe"

[Setup]
; ПРИМЕЧАНИЕ: Значение AppId является уникальным для каждой программы.
; Не используйте одинаковые значения для разных программ.
; (Для создания уникальных значений используйте Инструменты | Генерация GUID.)
AppID={{6E21E69C-C140-45B7-BFDD-E716A72F446E}
AppName={#MyAppName}
;AppVersion={#MyAppVersion}
AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=C:\Games\Westwood\{#MyAppName}
DefaultGroupName=Games\Tiberian Sun
AllowNoIcons=true
OutputDir=C:\Users\user one\Desktop\tis\outpath2
OutputBaseFilename=setup
SetupIconFile=C:\Users\DeCien\Desktop\tis\Extras\Shortcut icons\tibsun.ico
Compression=lzma2/Ultra64
SolidCompression=false
WizardImageFile=C:\Users\user one\Desktop\tis\embedded\WizardImage.bmp
WizardSmallImageFile=C:\Users\user one\Desktop\tis\embedded\WizardsmallImage.bmp
PrivilegesRequired=none
InternalCompressLevel=Ultra64
DiskSpanning=true
DiskSliceSize=735000000
DisableReadyPage=true
UninstallFilesDir={app}
UninstallDisplayIcon={app}\Game.exe
VersionInfoVersion=1.1
VersionInfoCompany="Westwood Studios 1985-2003©"

VersionInfoProductName=Tiberian Sun Pack
VersionInfoProductVersion=1.1

UserInfoPage=false

[Files]
Source: "C:\Users\user one\Desktop\tis\{app}\Game.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Users\user one\Desktop\tis\{app}\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "{tmp}\isxdl.dll"; DestDir: "{tmp}"; Flags: deleteafterinstall dontcopy
Source: compiler:innocallback.dll; DestDir: "{tmp}"; Flags: dontcopy;
Source: "{app}\Internet\WOLBrowser.dll"; DestDir: "{app}\Internet"; Flags: regserver
Source: "{app}\Internet\WOLAPI.DLL"; DestDir: "{app}\Internet"; Flags: regserver
; *************************** Компоненты
Source:  "components\rus\*"; DestDir: "{app}"; Components: a\a ; Flags: ignoreversion
Source:  "components\briefing\*"; DestDir: "{app}"; Components: a\b
Source:  "components\speech\*"; DestDir: "{app}"; Components: a\c
Source:  "components\mov\*"; DestDir: "{app}"; Components: b\a

[Types]
Name: full; Description: Основная установка;
Name: compact1; Description: Полная Русификация;
Name: compact2; Description: Компактная установка [Rus];
Name: compact3; Description: Компактная установка [Eng];
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Полдень Тиберия [Eng]; Types: full compact1 compact2 compact3 custom; flags: fixed
Name: a\a; Description: Русификация субтитров [Siberian Studio]; Types: full compact1 compact2;
Name: a\b; Description: Русифицированый Брифинг TS[Фаргус]; Types: compact1;
Name: a\c; Description: Русификация Звука TS и FS[Фаргус]; Types: compact1;
Name: b; Description: Сюжетные Видео Ролики [Rus]; Types: full custom; flags: fixed
Name: b\a; Description: Сюжетное Видео TS[Фаргус] и FS[Русский Проект]; Types: full compact1;



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

[Name]
Name: Russian; Name: compiler:\Russian.isl

[CustomMessages]
Russian.hour= часов
Russian.min= мин
Russian.sec= сек


[UninstallDelete]
Type: filesandordirs; Name: "{app}"

__Code]
// ******************************* all components

var
  i, k, count: Integer;

procedure btnClick(Sender: TObject);
begin
  count:= WizardForm.ComponentsList.Items.Count-1;
  for i:= count downto 0 do
    begin
      case TButton(Sender).Tag of
        0: WizardForm.ComponentsList.Checked[i]:= True;
        1: WizardForm.ComponentsList.Checked[i]:= False;
      end;
      WizardForm.ComponentsList.OnClickCheck(WizardForm.ComponentsList.ItemObject[i]);
    end;
end;

procedure InitializeWizard1();
begin
  for i:= 0 to 1 do
  with TButton.Create(WizardForm) do
    begin
      SetBounds(295+k,210,60,25);
      OnClick:= @btnClick;
      Parent:= WizardForm.SelectComponentsPage;
      Tag:= i;
      case i of
        0: Caption:= 'Все';
        1: Caption:= 'Ничего';
      end;
      k:= 62;
    end;
end;

// ************** время до окончания

type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
StartInstall: Integer;
TimeLabel: TLabel;
TimerID: Longword;

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

Function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') End;

Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail then            {hh: mm:ss format}
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000 then    {more than hour}
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000 then    {1..60 minutes}
        Result:= IntToStr(Ticks/60000) +m+' '+ IntToStr(Ticks/1000 - Ticks/1000/60*60) +s
    else Result:= Format('%.1n', [Abs(Ticks/1000)]) +s    {less than one minute}
End;

procedure GetTime(HandleW, Msg, idEvent, TimeSys: LongWord);
var Remaining: Integer;
begin
with WizardForm.ProgressGauge do begin
  if position > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((max - position)/position))
    TimeLabel.Caption:= 'Осталось: ' + TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)
    if (Remaining = 0) then TimeLabel.Caption:= 'Завершение...'
  end;
end;

procedure InitializeWizard2();
begin
TimeLabel:= TLabel.Create(WizardForm)
TimeLabel.SetBounds(ScaleX(0), ScaleY(80), ScaleX(457), ScaleY(20));
TimeLabel.AutoSize:= False
TimeLabel.Transparent:= True;
TimeLabel.Parent:= WizardForm.InstallingPage;
end;

procedure CurStepChanged2(CurStep: TSetupStep);
begin
If CurStep = ssInstall then
  begin
    StartInstall:= GetTickCount
    TimerID:= SetTimer(0,0, 500, WrapTimerProc(@GetTime, 4))
  end;
end;

procedure DeinitializeSetup2();
begin
KillTimer(0, TimerID)
end;


// ******************** Дерево папок
var 
 TDV: TFolderTreeView; 
 TFV: TStartMenuFolderTreeView; 
 
 procedure TDVOnChange(Sender: TObject); 
 begin 
 WizardForm.DirEdit.Text:= AddBackslash(TDV.Directory)+'MyApp'; 
 end; 
 
 procedure TFVOnChange(Sender: TObject); 
 begin 
 WizardForm.GroupEdit.Text:= AddBackslash(TFV.Directory)+'MyApp'; 
 end; 
 
 procedure InitializeWizard3(); 
 begin 
 TDV:= TFolderTreeView.Create(WizardForm); 
 TDV.Top:= WizardForm.DirEdit.Top+28; 
 TDV.Width:= 417; 
 TDV.Height:= 100; 
 TDV.OnChange:= @TDVOnChange; 
 TDV.Parent:= WizardForm.SelectDirPage; 
 
 
 TFV:= TStartMenuFolderTreeView.Create(WizardForm); 
 TFV.Top:= WizardForm.GroupEdit.Top+28; 
 TFV.Width:= 417; 
 TFV.Height:= 100; 
 TFV.SetPaths(ExpandConstant('{userprograms}'),ExpandConstant('{commonprograms}'),ExpandConstant('{userstartup}'),ExpandConstant('{commonstartup}')); 
 TFV.OnChange:= @TFVOnChange; 
 TFV.Parent:= WizardForm.SelectProgramGroupPage; 
 end;


// *********** кликабельная ссылка
 var 
 MouseLabel,SiteLabel: TLabel; 
 
 procedure SiteLabelOnClick(Sender: TObject); 
 var 
 ErrorCode: Integer; 
 begin 
 ShellExec('open', 'http://TiberianSun.ru', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode) 
 end; 
 
 procedure SiteLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
 begin 
 SiteLabel.Font.Color:=clRed 
 end; 
 
 procedure SiteLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
 begin 
 SiteLabel.Font.Color:=clBlue 
 end; 
 
 procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
 begin 
 SiteLabel.Font.Color:=clGreen 
 end; 
 
 procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
 begin 
 SiteLabel.Font.Color:=clBlue 
 end; 
 
 procedure InitializeWizard4(); 
 begin 
 MouseLabel:=TLabel.Create(WizardForm) 
 MouseLabel.Width:=WizardForm.Width 
 MouseLabel.Height:=WizardForm.Height 
 MouseLabel.Autosize:=False 
 MouseLabel.Transparent:=True 
 MouseLabel.OnMouseMove:=@SiteLabelMouseMove2 
 MouseLabel.Parent:=WizardForm 
 
 SiteLabel:=TLabel.Create(WizardForm) 
 SiteLabel.Left:=10 
 SiteLabel.Top:=330 
 SiteLabel.Cursor:=crHand 
 SiteLabel.Font.Color:=clBlue 
 SiteLabel.Caption:='Tiberian Sun Pack' 
 SiteLabel.OnClick:=@SiteLabelOnClick 
 SiteLabel.OnMouseDown:=@SiteLabelMouseDown 
 SiteLabel.OnMouseUp:=@SiteLabelMouseUp 
 SiteLabel.OnMouseMove:=@SiteLabelMouseMove 
 SiteLabel.Parent:=WizardForm 
 end; 


//; --- Dispatching code ------------------------------------------------------------

procedure InitializeWizard();
begin
  InitializeWizard1();
  InitializeWizard2();
  InitializeWizard3();
  InitializeWizard4();
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  CurStepChanged2(CurStep);
end;

procedure DeinitializeSetup();
begin
  DeinitializeSetup2();
end;


MarkusEVO 07-03-2012 07:44 1874009

Уважаемые ГУРУ Инно Скриптов! Очень нужна Ваша помощь плохо знающего Скрипты Инно, помогите разобраться.....
Вот часть моего скрипта:
читать дальше »

// Распаковка всех необходимых файлов в папку {tmp}.
#ifdef facompress
ExtractTemporaryFile('facompress.dll'); //ускоряет распаковку .arc архивов
#endif
#ifdef SrepInside
ExtractTemporaryFile('arc.ini');
ExtractTemporaryFile('srep.exe');
#endif
#ifdef records
ExtractTemporaryFile('records.inf');
#endif
#ifdef precomp
#if precomp == "0.38"
ExtractTemporaryFile('precomp038.exe');
#else
#if precomp == "0.4"
ExtractTemporaryFile('precomp040.exe');
#else
#if precomp == "0.41"
ExtractTemporaryFile('precomp041.exe');
#else
ExtractTemporaryFile('precomp038.exe');
ExtractTemporaryFile('precomp040.exe');
ExtractTemporaryFile('precomp041.exe');
#endif
#endif
#endif
#endif
#ifdef unrar
ExtractTemporaryFile('Unrar.dll');
#endif
#ifdef XDelta
ExtractTemporaryFile('XDelta3.dll');
#endif
#ifdef PackZIP
ExtractTemporaryFile('7z.dll');
ExtractTemporaryFile('PackZIP.exe');
#endif

// Подготавливаем переменную, содержащую всю информацию о выделенных компонентах для ISDone.dll
// максимум 96 компонентов.
Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
TmpValue:=1;
if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue; //компонент 1
TmpValue:=TmpValue*2;
if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue; //компонент 2
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue; //компонент 3
TmpValue:=TmpValue*2;
if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue; //компонент 4
// .....
// см. справку
#endif

#ifdef precomp
PCFVer:={#precomp};
#else
PCFVer:=0;
#endif
ISDoneError:=true;
if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
repeat
if not SrepInit('',512,0) then break;
if not PrecompInit(PCFVer) then break;
if not FileSearchInit(false) then break;

if not ISArcExtract ( 0, 0, ExpandConstant('{src}\data1.arc'), ExpandConstant('{app}\'), '', false, '', '', ExpandConstant('{app}\'), PCFonFLY) then break;

// далее находятся закомментарованые примеры различных функций распаковки
(*
if not ISArcExtract ( 0, 0, ExpandConstant('{src}\arc.arc'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
if not IS7ZipExtract ( 0, 0, ExpandConstant('{src}\CODMW2.7z'), ExpandConstant('{app}\data1'), false, '') then break;
if not ISRarExtract ( 0, 0, ExpandConstant('{src}\data_*.rar'), ExpandConstant('{app}'), false, '') then break;
if not ISSRepExtract ( 0, 0, ExpandConstant('{app}\data1024_1024.srep'),ExpandConstant('{app}\data1024.arc'), true) then break;
if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\data.pcf'), ExpandConstant('{app}\data.7z'), true) then break;
if not ISxDeltaExtract ( 0, 0, 0, 640, ExpandConstant('{app}\in.pcf'), ExpandConstant('{app}\*.diff'), ExpandConstant('{app}\out.dat'), false) then break;
if not ISPackZIP ( 0, 0, ExpandConstant('{app}\1a1\*'), ExpandConstant('{app}\1a1.pak'), 2, false ) then break;
if not ISExec ( 0, 0, 0, ExpandConstant('{tmp}\Arc.exe'), ExpandConstant('x -o+ "{src}\001.arc" "{arr}\"'), ExpandConstant('{tmp}'), '...') then break;
if not ShowChangeDiskWindow ('Ïîæàëóéñòà, âñòàâüòå âòîðîé äèñê è äîæäèòåñü åãî èíèöèàëèçàöèè.', ExpandConstant('{src}'),'CODMW_2.arc') then break;

// распакр=овка группы файлов посредством внешнего приложения

FindHandle1:=ISFindFiles(0,ExpandConstant('{app}\*.ogg'),ColFiles1);
ExecError:=false;
while not ExecError and ISPickFilename(FindHandle1,ExpandConstant('{app}\'),CurIndex1,true) do begin
InFilePath:=ISGetName(0);
OutFilePath:=ISGetName(1);
OutFileName:=ISGetName(2);
ExecError:=not ISExec(0, 0, 0, ExpandConstant('{tmp}\oggdec.exe'), '"'+InFilePath+'" "'+OutFilePath+'"',ExpandConstant('{tmp}'),OutFileName);
end;
ISFindFree(FindHandle1);
if ExecError then break;
*)

ISDoneError:=false;
until true;
ISDoneStop;
end;
HideControls;
DeinitializeSlideShow;
KillTimer(0, TimerID);
end;
if (CurStep=ssPostInstall) and ISDoneError then begin
DeinitializeSlideShow;
KillTimer(0, TimerID);
Exec2(ExpandConstant('{uninstallexe}'), '/SILENT', false);
end;
end;

Запаковываю файл при помощи FreARC и переименновываю в data1.arc

Затем делаю компиляцию, она проходит без ошибок!
После чего пытаюсь установить, выдаёт ошибку
Не найдено ни одного файла, указанного для ISArcExtract
Помогите пожалуйста разобраться во всем этом...
может я не правильно вставляю или еще где-нибудь надо....

R.i.m.s.k.y. 07-03-2012 10:00 1874060

ToBeLife, я криминала не вижу, но слова for this version of the uninstaller наводят на мысль что в {app} лежат не те unins000.exe & unins000.dat.
Проверь нет ли в папке Source левых деинсталляторов.

MarkusEVO, если плохо знаешь инно зачем за фриарк взялся? пакуй стандартными средствами инно, он и жмет хорошо (выше отличные настройки сжатия) и поддерживает разбиение на диски
Я вот как с фриарком бороться не знаю, картинки всятавлять не умею, и прекрасно себя чуйствую!

MarkusEVO 07-03-2012 10:19 1874070

Цитата:

Цитата R.i.m.s.k.y.
MarkusEVO, если плохо знаешь инно зачем за фриарк взялся? пакуй стандартными средствами инно, он и жмет хорошо (выше отличные настройки сжатия) и поддерживает разбиение на диски
Я вот как с фриарком бороться не знаю, картинки всятавлять не умею, и прекрасно себя чуйствую! »

Уважаемый, я как бы просто чайник в этом, но не совсем)
я разобрался в чем проблема...
проблема была что я забюыл указать директорию OutputDir=. в самом начале =)

Johny777 07-03-2012 14:24 1874234

всё довёл денинсталятор до финальной стадии
выполняется так
1. поверка наличия уникального файла и создание соответствующего чекбокса (R.i.m.s.k.y., список компонентов из реестра взять не могу, тк у меня их нет. везде вручную созданные чекбоксы и переключатели, привязанные к секции файлов через Check)
2. при отмеченном чекбоксе(-ах) выполняется [InstallDelete] и удадяются уникальные файлы
3. шаг ssPostInstall, на котором удаляются "полуэксклюзивные" файлы, относящиеся только к 2 или 3 из 4 имеющихся (в моём случае) компонентов
4. шаг ssDone, нак котором проверяется отсутствие всех компонентов и если их нет удаляется основная папка и общие файлы, относящиеся ко всем 4 компонентам
читать дальше »
Код:

#define MyAppName "Uninstall"

[Setup]

SourceDir=.
OutputDir=Setup
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false
//SetupIconFile=hl2.ico

ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no
DisableProgramGroupPage=yes
DisableWelcomePage=yes
DisableDirPage=yes
DisableReadyPage=yes
DisableFinishedPage=yes




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




[Components]
Name: hl2; Description: Half-life 2; Check: del_hl2
Name: ep1; Description: Half-life 2 Episode One; Check: del_ep1
Name: ep2; Description: Half-life 2 Eposode Two; Check: del_ep2
Name: portal; Description: Portal; Check: del_portal

[InstallDelete]
Type: filesandordirs; Name: {src}\..\common\half-life 2; Components: hl2
Type: filesandordirs; Name: {src}\..\common\half-life 2 episode one; Components: ep1
Type: filesandordirs; Name: {src}\..\common\half-life 2 episode two; Components: ep2
Type: filesandordirs; Name: {src}\..\common\portal; Components: portal

Type: files; Name: {src}\..\half-life 2 buka russian.gcf; Components: hl2
Type: files; Name: {src}\..\half-life 2 2007 base content.gcf; Components: hl2
Type: files; Name: {src}\..\half-life 2 content.gcf; Components: hl2
Type: files; Name: {src}\..\half-life 2 game dialog.gcf; Components: hl2
Type: files; Name: {src}\..\episode one 2007 content.gcf; Components: ep1
Type: files; Name: {src}\..\half-life 2 episode one.gcf; Components: ep1
Type: files; Name: {src}\..\episode two content.gcf; Components: ep2
Type: files; Name: {src}\..\episode two maps.gcf; Components: ep2
Type: files; Name: {src}\..\episode two materials.gcf; Components: ep2

Type: files; Name: {src}\..\source 2007 binaries 2.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\half-life 2_russian.gcf; Components: hl2 and ep1 and ep2
Type: files; Name: {src}\..\portal content.gcf; Components: portal
Type: files; Name: {src}\..\portal english.gcf; Components: portal
Type: files; Name: {src}\..\portal russian.gcf; Components: portal
Type: files; Name: {src}\..\source 2007 shared materials.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source 2007 shared models.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source 2007 shared sounds.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source materials.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source models.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\source sounds.gcf; Components: hl2 and ep1 and ep2 and portal
Type: files; Name: {src}\..\episode 1 shared.gcf; Components: ep1 and ep2
Type: files; Name: {src}\..\episodic 2007 shared.gcf; Components: ep1 and ep2
Type: files; Name: {src}\..\half-life 2 episode one russian.gcf; Components: ep1 and ep2
Type: files; Name: {src}\..\half-life 2 episode two english.gcf; Components: ep2
Type: files; Name: {src}\..\half-life 2 episode two russian.gcf; Components: ep2

Name: {commondesktop}\Half-Life 2.lnk; Type: files; Components: hl2
Name: {commondesktop}\Half-Life 2 Episode One.lnk; Type: files; Components: ep1
Name: {commondesktop}\Half-Life 2 Episode Two.lnk; Type: files; Components: ep2
Name: {commondesktop}\Portal.lnk; Type: files; Components: portal

[?Code]
function del_hl2:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') then
  Result:=False
end;
end;


function del_ep1:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') then
  Result:=False
end;
end;


function del_ep2:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') then
  Result:=False
end;
end;


function del_portal:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\portal'))='') then
  Result:=False
end;
end;

Var
  ResultCode: integer;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
  begin
    if (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and
      (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='')
    then
    DeleteFile(ExpandConstant('{src}\..\episode 1 shared.gcf'));
    DeleteFile(ExpandConstant('{src}\..\episodic 2007 shared.gcf'));
    DeleteFile(ExpandConstant('{src}\..\half-life 2 episode one russian.gcf'));
  end
//////
  begin
    If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') and
      (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and
      (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='')
    then
    DeleteFile(ExpandConstant('{src}\..\half-life 2_russian.gcf'));
  end
//////
  if CurStep = ssDone then
    If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') and
      (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and
      (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') and
      (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\portal'))='')
    then
  Exec(ExpandConstant('{src}\unins007.exe'),'/VERYSILENT','', SW_SHOW, ewNoWait, ResultCode);
end;





MarkusEVO,
при использовании внешних упаковщиков ты можешь потерять целую пачку функций, а точнее умных флагов для секции файлов, как наприер пропуск уже существующих файлов
если только не настроить командную строку фриарка, чтобы при наличии приложения в реестре находил путь и пропускал их
вот у меня после распаковки 16 гигов из которых около 5 общие. как представлю себе, что он каждый раз перезаписывает, то что установлено....
и тот же фриарк жмёт не намного сильнее 7-zip, Не понимаю, что его все так лелеют
а как быть с флагами говорящими, что этот файл для 64 битной системы, а этот для 32-х?

ToBeLife 07-03-2012 15:42 1874282

R.i.m.s.k.y., Cпасибо. Нашел ошибку. следовало удалить секцию [uninstalldelete]. Благодарствую.

R.i.m.s.k.y. 07-03-2012 15:47 1874287

ToBeLife, а она то каким паровозом?

LinkOFF 07-03-2012 22:19 1874481

Всем добрый вечер!Помогите пожалуйста! Я никак не могу сделать разбиение на диски в скрипте ISDone. Я пробовал сделать так, как написано в справке, но у меня нечего не получается.Просто пишет что FreeArc-архив не найден.Помогите пожалуйста решить проблему.И не получается с распаковкой архивов в зависимости от выбранных компонентов.Наверно что-то со скриптом не так(делал как сказано в справке).
Вот скрипт - http://rghost.ru/36901450

FX-DENIS 08-03-2012 00:24 1874550

всем привет,я не один год использую инно,конечно простые скрипты,без наворотов.Постепенно коплю знания.Скачал кучи примеров ,программ,архивов тем,но там или или.Вчера наткнулся на скрипт прогресс бар+размер текущего файла,но проблема в том,что он пишет размер в байтах например 12345678 байт,как сделать отображение в было мегабайтах например 25.8 МБ?Вот секция код моя
читать дальше »
Код:

[_Code]
const
oneMB=1024*1024;

var
ProgressLabel, SizeLabel: TLabel;

procedure Progress();
var
size: integer;

begin
with WizardForm.ProgressGauge do
ProgressLabel.Caption:= IntToStr((Position-Min)/((Max - Min)/100)) + '%';
FileSize(ExpandConstant(CurrentFileName), size);
SizeLabel.Caption:= IntToStr(size) + ' байт'; 
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;



Конечно этот вопрос затерт до дыр,но на чтение архивов форума уйдет неделя.Как я понял надо изменить тут SizeLabel.Caption:= IntToStr(size) + ' байт'; что то?константу const oneMB=1024*1024; добавил сам,думал поможет мне.

FX-DENIS 08-03-2012 00:47 1874556

Вложений: 1
Совсем забыл,вот скриншот установки моего простого инсталлятора,с этой проблемкой.Сразу прощу прощения ,если кому-то показалось,что я хочу что бы всё сделали за меня,нет,просто подскажите новичку,что нужно изменить или добавить в какую строку для решения.Заранее благодарен знатокам,нажму полезное сообщение)

alert30 08-03-2012 06:41 1874611

FX-DENIS, а как ты сделал скрипт прохождения процентов (6% в окне) скинь.

al70 08-03-2012 14:27 1874834

Добрый день. Есть скрипт, который ставит приложение, а так же dll расширением проводника. После деинсталляции папка приложения остается в Program Files пустой, т.к. расширение провдоника удалились при перезагрузке. Мне очень нужно удалить и папку приложения тоже. Спасибо.

Johny777 08-03-2012 14:30 1874838

alert30,
держи
читать дальше »
Код:

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

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

[Files]
Source: C:\Program Files (x86)\Inno Setup 5\*; DestDir: {app}; AfterInstall: Progress
[UninstallDelete]
Type: files; Name: {app}
[_Code]
var
  ProgressLabel, SizeLabel: TLabel;

procedure Progress;
var
  size: Integer;
begin
  with WizardForm.ProgressGauge do
    ProgressLabel.Caption:= IntToStr((Position-Min)/((Max - Min)/100)) + ' %';
  FileSize(ExpandConstant(CurrentFileName), size);
  SizeLabel.Caption:= 'размер ' + ExtractFileName(ExpandConstant(CurrentFileName)) + ': ' +
                      IntToStr(size) + ' байт';
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;


R.i.m.s.k.y. 08-03-2012 15:25 1874866

al70,
Код:

procedure RD(Dir:string);
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + AddQuotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep=usDone then begin
  if DirExists(ExpandConstant('{app}')) then begin
    RD(ExpandConstant('{app}'))
  end;
end;
end;


al70 08-03-2012 17:54 1874969

R.i.m.s.k.y., на Win 7 x64 не помогло. На XP отработало без проблем. Может еще какой способ есть? Но все равно спасибо

alert30 08-03-2012 18:22 1874986

Johny777, спасибо, попробую.

R.i.m.s.k.y. 08-03-2012 18:55 1874994

Цитата:

Цитата al70
на Win 7 x64 не помогло. На XP отработало без проблем »

Это работает на всех виндах, проверено не только мной. Сам видишь вызывается стандартная для всех виндов команда консоли RD, которой передается путь {app}
Как вариант вставь MSGBox
Код:

...
if CurUninstallStep=usDone then begin
  MsgBox(ExpandConstant('{app}'), mbError, mb_Ok);
  if DirExists(ExpandConstant('{app}')) then begin
    RD(ExpandConstant('{app}'))
  end;

...

увидишь может путь не такой

Rikill 08-03-2012 22:57 1875181

Johny777, у меня на совсем новой машине не запускался инсталлятор. Закрытый вариант - значит не для публики.

P.S. Скучал по форуму. Буду иногда появляться, если нужен вам. :)

Johny777 09-03-2012 01:52 1875262

Rikill,
забил,
тк на день раз 20 запускаю для теста основы и очень часто оба примера перестают работать через несколько повторных запусков
у меня шрифт только в 6-8 местах использовался (как в главном меню халфы 2 с лямбдой)
вот наглядный пример

заменю на картинки
разницы не будет никакой, а качество поднимется :)
Цитата:

Цитата Rikill
если нужен вам »

нужен.

единственное, что для меня остаётся нерешённой проблемой (на руборде тоже спрашивал, как и здесь) - как добавить прокрутку скроллбокса колесом мыши
вот такого например

http://rghost.ru/36630976

El Sanchez 09-03-2012 11:48 1875376

Цитата:

Цитата Johny777
тк на день раз 20 запускаю для теста основы и очень часто оба примера перестают работать через несколько повторных запусков »

Johny777, Несколько замечаний по обоим примерам кастомного шрифта:
1. Совсем не обязательно рассылать сообщение WM_FONTCHANGE всем top-level окнам, достаточно послать форме. А можно и вообще Send/PostMessage убрать.
2. FontExists лучше делать до вызова AddFontResource, т.к. шрифт может быть уже установленым в системе и повторное его добавление это не есть хорошо.
3. Булев флаг IsCustomFontInstalled лишний.
4. Все это лучше не делать в функции InitializeSetup, когда формы еще нет.
5. Применить для уверенности функцию AddFontResourceEx, зная что шрифт будет использован только вызываемым приложением.
читать дальше »

Код:

#define Font "Edisson.ttf"
#define FontName "Edisson"

[Files]
Source: {#Font}; Flags: dontcopy

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

const
    FR_PRIVATE = $10;

function AddFontResource(lpszFilename: String; fl, pdv: DWORD): Integer; external 'AddFontResourceEx{#A}@gdi32.dll stdcall';
function RemoveFontResource(lpFileName: String; fl, pdv: DWORD): BOOL; external 'RemoveFontResourceEx{#A}@gdi32.dll stdcall';

procedure InitializeWizard();
begin
    if not FontExists('{#FontName}') then
    begin
        ExtractTemporaryFile('{#Font}');
        AddFontResource(ExpandConstant('{tmp}\{#Font}'), FR_PRIVATE, 0);
    end;
    WizardForm.Font.Name := '{#FontName}';
end;

procedure DeinitializeSetup();
begin
    RemoveFontResource(ExpandConstant('{tmp}\{#Font}'), FR_PRIVATE, 0);
    WizardForm.Free;
end;


Gnom_aka_Lexander 09-03-2012 12:00 1875380

El Sanchez, одна беда - шрифт остается во временной папке. А рабочесть примера подтверждаю - у меня как раз такая система, на которой классический пример использования кастомного шрифта не работает, не зависимо от степени убитости системы. Повисает оповещательное сообщение. Немного исправляло положение замена SendMessage на PostMessage но результат нестабилен. Причина, как объяснили, какая-то программа ловит это сообщение и не пересылает его дальше. От степени убитости системы, повторюсь, это никак не зависит. Виноват криворукий программер, который написал какую-то обслуживающую утилитку, по всей видимости.

by_gangster 09-03-2012 13:18 1875429

Здравствуйте, помогите поправить скрипт (с распаковкой arc), надо что бы он нормально распаковывался, а то он только сам архив расспаковывает, а надо что бы ещё он всё что в архиве расспаковывал. Пожалуйста помогите!!!!

[Setup]
AppName=Sigerous Mod для COP
AppVerName=Sigerous Mod v2.2
DefaultDirName=stalker
InfoBeforeFile=embedded\InfoBefore.rtf
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp
Compression=zip

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

[Files]
Source: *.arc; DestDir: {app}; Flags: ignoreversion
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy

[Icons]
Name: {group}\Uninstall; IconFilename: {app}\unins000.exe; Filename: {app}\unins000.exe

[code]


const
PM_REMOVE = 1;

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';

procedure AppProcessMessage;
var
Msg: TMsg;
begin
while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;



type

TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;

function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword;
external 'wrapcallback@files:innocallback.dll stdcall';

function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';



var
ProgressBar: TNewProgressBar;
ExtractFile: TNewStaticText;
Button1: TButton;
Cancel: Integer;

procedure InitializeWizard();
begin
ProgressBar := TNewProgressBar.Create(WizardForm);
ExtractFile:=TNewStaticText.Create(WizardForm);
with WizardForm.ProgressGauge do
begin
ProgressBar.Left := Left;
ProgressBar.Top := Top + ScaleX(55);
ProgressBar.Width := Width;
ProgressBar.Height := Height;
ProgressBar.Parent := WizardForm.InstallingPage;
ProgressBar.max := 1000;
ProgressBar.Position := 0;
ExtractFile.parent:=WizardForm.InstallingPage;
ExtractFile.autosize:=false;
ExtractFile.Width := Width;
ExtractFile.top:=Top + ScaleX(35);
ExtractFile.caption:='Распаковка архива FreeArc';
end;
end;

procedure Button1OnClick(Sender: TObject);
begin
Cancel := -1;
end;

function FreeArcCallback (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
var percents: Integer;
begin
if string(what)='filename' then
//ExtractFile.Caption:=str
else if (string(what)='progress') and (int2>0) then begin
percents := (int1*1000) div int2;
ProgressBar.Position := percents;
ExtractFile.Caption:='Распаковано '+IntToStr(int1)+' из '+IntToStr(int2)+' мб ('+FloatToStr(percents/10)+'%)';
end;
AppProcessMessage;
Result := Cancel;
end;

procedure ExtractFreeArcArchive(arcname: String; destpath: String);
var callback: longword;
res: Integer;
begin
AppProcessMessage;
callback:=WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4 arguments
Cancel := 0;
try
res := FreeArcExtract (callback, 'x', '-o+', '-dp'+destpath, '--', arcname, '', '', '', '', '');
if cancel<0 then
MsgBox('Installation cancelled', mbInformation, MB_OK);
if res<0 then
MsgBox('Decompression failed with error code '+IntToStr(res)+'!', mbError, MB_OK);
Button1.visible:=false;
except
MsgBox('Decompression failed!', mbError, MB_OK);
Button1.visible:=false;
end;
DeleteFile(arcname);
end;

procedure CurStepChanged(CurStep: TSetupStep);
var app: String;
begin
If CurStep=ssPostInstall then
begin
Button1:=TButton.create(WizardForm);
Button1.parent:=WizardForm;
Button1.width:=135;
Button1.caption:='Cancel installation';
Button1.left:=260;
Button1.top:=WizardForm.cancelbutton.top;
Button1.OnClick:=@Button1OnClick;

app := ExpandConstant('{app}');
ExtractFreeArcArchive(app+'\data.arc', app);
ExtractFreeArcArchive(app+'\data.arc', app);
end;
end;

fackir 09-03-2012 13:58 1875455

Добрый ден, перерыл все 3 Предыдущие ветки и эту, так и несмог найти ответна, вроде, элементарный вопрос:

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

Код:

[Run]
Filename: "http://mi_site.ru/"

так не работает :), Спасибо

LinkOFF 09-03-2012 14:02 1875458

Всем добрый день!Помогите пожалуйста! Я никак не могу сделать разбиение на диски в скрипте ISDone. Я пробовал сделать так, как написано в справке, но у меня нечего не получается.Просто пишет что FreeArc-архив не найден.Помогите пожалуйста решить проблему.И не получается с распаковкой архивов в зависимости от выбранных компонентов.Наверно что-то со скриптом не так(делал как сказано в справке).
Вот скрипт - http://rghost.ru/36901450

R.i.m.s.k.y. 09-03-2012 14:19 1875472

fackir,
Код:

[CustomMessages]
english.runSVPTeam=Visit SVP-Team web-site
russian.runSVPTeam=Зайти на сайт SVP-Team

[Run]
Filename: http://www.SVP-Team.com; Description: {cm:runSVPTeam}; Flags: shellexec skipifsilent postinstall nowait Unchecked


nik1967 09-03-2012 14:27 1875478

fackir, или так
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var 
  ErrorCode: Integer; 
begin 
  if CurStep = ssDone then
  ShellExec('open', 'http://mi_site.ru', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); 
end;


R.i.m.s.k.y. 09-03-2012 14:30 1875485

nik1967, это хреновый пример, сайт откроется не спрашивая
А за такое надо насмерть закармливать печеньками

by_gangster 09-03-2012 14:39 1875492

Здравствуйте, помогите поправить скрипт (с распаковкой arc), надо что бы он нормально распаковывался, а то он только сам архив расспаковывает, а надо что бы ещё он всё что в архиве расспаковывал. Пожалуйста помогите!!!!
читать дальше »
Код:

[Setup]
 AppName=Sigerous Mod для COP
 AppVerName=Sigerous Mod v2.2
 DefaultDirName=stalker
 InfoBeforeFile=embedded\InfoBefore.rtf
 WizardImageFile=embedded\WizardImage.bmp
 WizardSmallImageFile=embedded\WizardSmallImage.bmp
 Compression=zip

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

 [Files]
 Source: *.arc; DestDir: {app}; Flags: ignoreversion
 Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy
 Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy

 [Icons]
 Name: {group}\Uninstall; IconFilename: {app}\unins000.exe; Filename: {app}\unins000.exe

 [_code]


 const
 PM_REMOVE = 1;

 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';

 procedure AppProcessMessage;
 var
 Msg: TMsg;
 begin
 while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do begin
 TranslateMessage(Msg);
 DispatchMessage(Msg);
 end;
 end;



 type

 TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;

 function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword;
 external 'wrapcallback@files:innocallback.dll stdcall';

 function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';



 var
 ProgressBar: TNewProgressBar;
 ExtractFile: TNewStaticText;
 Button1: TButton;
 Cancel: Integer;

 procedure InitializeWizard();
 begin
 ProgressBar := TNewProgressBar.Create(WizardForm);
 ExtractFile:=TNewStaticText.Create(WizardForm);
 with WizardForm.ProgressGauge do
 begin
 ProgressBar.Left := Left;
 ProgressBar.Top := Top + ScaleX(55);
 ProgressBar.Width := Width;
 ProgressBar.Height := Height;
 ProgressBar.Parent := WizardForm.InstallingPage;
 ProgressBar.max := 1000;
 ProgressBar.Position := 0;
 ExtractFile.parent:=WizardForm.InstallingPage;
 ExtractFile.autosize:=false;
 ExtractFile.Width := Width;
 ExtractFile.top:=Top + ScaleX(35);
 ExtractFile.caption:='Распаковка архива FreeArc';
 end;
 end;

 procedure Button1OnClick(Sender: TObject);
 begin
 Cancel := -1;
 end;

 function FreeArcCallback (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
 var percents: Integer;
 begin
 if string(what)='filename' then
 //ExtractFile.Caption:=str
 else if (string(what)='progress') and (int2>0) then begin
 percents := (int1*1000) div int2;
 ProgressBar.Position := percents;
 ExtractFile.Caption:='Распаковано '+IntToStr(int1)+' из '+IntToStr(int2)+' мб ('+FloatToStr(percents/10)+'%)';
 end;
 AppProcessMessage;
 Result := Cancel;
 end;

 procedure ExtractFreeArcArchive(arcname: String; destpath: String);
 var callback: longword;
 res: Integer;
 begin
 AppProcessMessage;
 callback:=WrapFreeArcCallback(@FreeArcCallback,4); //FreeArcCallback has 4 arguments
 Cancel := 0;
 try
 res := FreeArcExtract (callback, 'x', '-o+', '-dp'+destpath, '--', arcname, '', '', '', '', '');
 if cancel<0 then
 MsgBox('Installation cancelled', mbInformation, MB_OK);
 if res<0 then
 MsgBox('Decompression failed with error code '+IntToStr(res)+'!', mbError, MB_OK);
 Button1.visible:=false;
 except
 MsgBox('Decompression failed!', mbError, MB_OK);
 Button1.visible:=false;
 end;
 DeleteFile(arcname);
 end;

 procedure CurStepChanged(CurStep: TSetupStep);
 var app: String;
 begin
 If CurStep=ssPostInstall then
 begin
 Button1:=TButton.create(WizardForm);
 Button1.parent:=WizardForm;
 Button1.width:=135;
 Button1.caption:='Cancel installation';
 Button1.left:=260;
 Button1.top:=WizardForm.cancelbutton.top;
 Button1.OnClick:=@Button1OnClick;

 app := ExpandConstant('{app}');
 ExtractFreeArcArchive(app+'\data.arc', app);
 ExtractFreeArcArchive(app+'\data.arc', app);
 end;
 end;


fackir 09-03-2012 14:43 1875497

R.i.m.s.k.y., nik1967, Спасибо за оперативный ответ, седня попробую

Johny777 09-03-2012 14:47 1875500

fackir, nik1967, R.i.m.s.k.y.,
мне кажется вот так проще всего (через гугл нашёл)
[Run]
Filename: http://forum.oszone.net; Description: Посетить форум OSzone.net; Flags: nowait postinstall shellexec
правда не знаю насколько нужен флаг postinstall

R.i.m.s.k.y. 09-03-2012 14:48 1875502

Цитата:

Цитата Johny777
правда не знаю насколько нужен флаг postinstall »

этот флаг формирует на последней странице чекбокс с описанием "Посетить форум OSzone.net"
Без него - см выше про печеньки

Johny777 09-03-2012 14:51 1875507

R.i.m.s.k.y.,
да я знаю :)
просто из этого примера fackir трудно понять
[Run]
Filename: "http://mi_site.ru/"
может ему не нужен чекбокс и он хочет как у K-Lite кодек пака

Цитата:

Цитата by_gangster
а то он только сам архив расспаковывает, а надо что бы ещё он всё что в архиве расспаковывал. »

а как это?
я правильно понимаю, что в архиве лежат ещё архивы. которые должны быть распакованы?

by_gangster 09-03-2012 16:10 1875549

Johny777, нет он сначала распаковывает сам arc архив а потом файлы внём, вот проблема с распаковкой файлов

Gnom_aka_Lexander 09-03-2012 16:13 1875551

Цитата:

Цитата by_gangster
[Files] Source: *.arc; DestDir: {app}; Flags: ignoreversion »

by_gangster, Вот по кой черт ты архивы в инсталл пихаешь? Где ты вообще увидел, что их нужно пихать в инсталл? Покажи мне того дебила, который сказал, что именно так и нужно сделать. И не говори, что так в примере - там точно не так!

nik1967 09-03-2012 16:16 1875554

Цитата:

Цитата R.i.m.s.k.y.
nik1967, это хреновый пример, сайт откроется не спрашивая
А за такое надо насмерть закармливать печеньками »

Хе, ну или так:
читать дальше »
Код:

[Setup]
AppName=sdads
AppVerName=sdads
DefaultDirName={pf}\splash

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

[_Code]
var
  NewCheckBox2: TCheckBox;

procedure InitializeWizard(); 
begin 
  NewCheckBox2 := TNewCheckBox.Create(WizardForm); 
  with NewCheckBox2 do 
  begin 
    Name := 'NewCheckBox2'; 
    Parent := WizardForm.FinishedPage; 
    Left := ScaleX(220); 
    Top := ScaleY(200); 
    Width := ScaleX(288); 
    Height := ScaleY(33); 
    Caption := 'Посетить сайт'; 
    Checked := True; 
  end; 
end; 
 
procedure CurStepChanged(CurStep: TSetupStep);
var 
  ErrorCode: Integer; 
begin 
  if CurStep = ssDone then
  if NewCheckBox2.Checked then 
  ShellExec('open', 'http://www.site.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); 
end;


valyok666 09-03-2012 16:18 1875556

by_gangster, вопрос почему у тебя 2жды архив прописан?
читать дальше »
app := ExpandConstant('{app}');
ExtractFreeArcArchive(app+'\data.arc', app);
ExtractFreeArcArchive(app+'\data.arc', app)

лучше используй исдоне))

by_gangster 09-03-2012 17:00 1875578

Лександер, я пример скачал с сайта http://freearc.org/ru/InnoSetup.aspx

Gnom_aka_Lexander 09-03-2012 17:06 1875588

Покажи мне оригинал примера, в котором файлы архивов пихаются в инсталлятор. Я лично из множества примеров, не нашел ни одного.
Цитата:

Цитата by_gangster
и архивы в инстал много кто пихает »

:o :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:

by_gangster 09-03-2012 17:29 1875604

Лександер, внизу в самом, а сжатие в arc я сделал так как он лучше сжимает, и архивы в инстал много кто пихает

by_gangster 09-03-2012 17:46 1875614

Лександер, что ты ржош??? если бы не пихали не создавали бы эти все скрипты!!!!!!!!! ты вместо того что бы ржать помоги всё исправить!!!!!!!

Gnom_aka_Lexander 09-03-2012 17:52 1875617

Цитата:

Цитата by_gangster
помоги всё исправить »

В твоем случае - проще было не ломать. Удали архивы из инсталла - это-же логично. Не вставай на скользкий путь школо-репакеров.
Цитата:

Цитата by_gangster
так перепиши пожалуйста мой скрипт »

Сколько платишь?

by_gangster 09-03-2012 18:35 1875647

Лександер, так перепиши пожалуйста мой скрипт

alert30 09-03-2012 18:47 1875654

Цитата:

Цитата Лександер
Сколько платишь? »

Согласен - $ 10 долларов (шутка). :)

Johny777 09-03-2012 18:59 1875662

by_gangster,
Цитата:

Цитата by_gangster
нет он сначала распаковывает сам arc архив а потом файлы внём »

теперь я понял
не нужно
зачем сначала распаковывать архив из инсталла, а потом его же ещё раз извлекть в конечную папку
это напоминает мне один репак, который мне попался. Там для установки где то 25 гигов нужно было. Причем никаких компонентов и это был распак Orange Box с весом больше 10 гигов и многими тысячами файлов.
двойная распаковка была :(
____________________________________________________________________________________________________ ______________________
#define ArcLocation "{src}\*.arc" красного цвета определяет расположение архивов по отношению к инсталлятору
сейчас они лежат рядом с ним
тк у меня нет части твоих файлов, то я закоментировал некоторые строки
ты их у себя раскомментируй (зелёного цвета)

читать дальше »
Код:

;[English]
;Example of using unarc.dll for decompression of FreeArc archives with displaying of progress indicator in Inno Setup window.
;In order to use the script compile it and put *.arc archives to the same directory as installer executable before running it.
;The script requires Inno Setup QuickStart Pack 5.2.3 and above (http://files.jrsoftware.org)
;You will also need InnoCallback.dll that may be found at the http://www.sherlocksoftware.org/page.php?id=54

;[Russian]
;Пример распаковки FreeArc архива при помощи unarc.dll, с отображением прогресса распаковки в окне Inno Setup.
;Для использования скрипта откомпилируйте его и поместите архивы *.arc в один каталог с инсталятором перед тем как запустить его.
;Скрипт совместим с Inno Setup QuickStart Pack 5.2.3 и выше (http://files.jrsoftware.org)
;Вам также потребуется InnoCallback.dll (http://www.sherlocksoftware.org/page.php?id=54)

; Версия 3.5 от Bulat Ziganshin, 21-12-2009
;  - поддержка опций -ap/-ld/-cfg в FreeArcExtract()
;  - ускорена распаковка при большом количестве wav-файлов (метод TTA)
;  - можно передавать NULL в качестве первого параметра (callback) в FreeArcExtract()
;  - исправлена ошибка: обрабатывались опции после '--'
;
; Версия 3.4 от Bulat Ziganshin, 18-11-2009
;  - улучшение в unarc.dll - не создаёт временные файлы при распаковке rep:1gb и фрагментированной памяти
;  - поддержка метода 4x4
;
; Версия 3.3 от Bulat Ziganshin, 13-09-2009
;  - ускорение распаковки на 10%
;  - FreeArcExtract() поддерживает опцию '-wPATH' для задания каталога для временных файлов
;  - при прерывании распаковки стирает временные файлы
;  - исправлена ошибка в unarc.dll - вылетала при распаковке с использованием временных файлов
;
; Версия 3.2 от Bulat Ziganshin, 31-07-2009
;  - исправлена unarc.dll - теперь она не вылетает на сбойных архивах
;
; Версия 3.1 от Bulat Ziganshin, 29-07-2009
;  - более плавный индикатор прогресса (данные из LZMA пишутся кусками по 8 мб вместо dictsize)
;  - больше не грузятся всякие левые facompress.dll из PATH
;
; Версия 3.0 от Bulat Ziganshin, 29-07-2009
;  - функция ArchiveOrigSize возвращает объём данных в архиве
;  - наименования колбэков изменены на read и write (было progress и written)
;
; Версия 2.1 от Bulat Ziganshin, 10-07-2009
;  - Кнопка 'Отмена установки' теперь по расположению, размеру и надписи точно дублирует стандартную кнопку Отмена
;  - В unarc.dll исправлена ошибка, чреватая потенциальными проблемами при распаковке множества архивов
;
; Версия 2.0 от Bulat Ziganshin, 08-07-2009
;  - Корректно отображает общий объём установки и сколько данных уже распаковано
;  - Индикатор прогресса теперь основан на объёме распакованных и записанных на диск данных
;  - Дополнительно отображается сколько осталось времени
;  - FreeArcCallback вызывается не менее 100 раз в секунду, что заменяет вызов по таймеру
;  - Добавлен placeholder для периодически выполняемого кода (в начале процедуры FreeArcCallback)
;  - Исправлена проблема с удалением последнего распакованного файла при отмене инсталяции
;  - Исправлена проблема с русскими именами/путями распаковываемых архивов
;  - Кнопка 'Отменить распаковку' масштабируется в зависимости от размеров формы
;  - Исправлено вычисление оставшегося времени (теперь отсчёт начинается в момент начала распаковки)
;  - За пределами процесса распаковки все лишние надписи убираются с экрана
;
; Изменения от Victor_Dobrov, 02-07-2009
;  - Кнопка инсталлятора в панели задач отображает время до завершения обработки всех архивов и общий процент распаковки.
;  - В Unicode-версиях инсталлятора правильно отображаются имена файлов.
;
; Изменения от CTACKo & SotM'а. 01-07-2009
;  - Правильно создаются папки, если в пути установки встречаются русские буквы
;  - При компиляции определяется использование PAnsiChar/PChar. Можно использовать как обычную так и UNICODE версию с установленным препроцессором.
;
; Изменения от SotM'а. 23-06-2009
;  - Нижний прогресс бар сместил чуть-чуть вниз, чтобы было видно имя распаковываемого файла.
;  - Русские имена файлов теперь правильно отображаются.
;  - При нажатии "отмены" при распаковке теперь появляется запрос на подтверждение отмены.
;  - Переименовал некоторые переменные, чтобы их имена несли больше информации.
;  - Немного переформатировал сам исходный код для более удобного и понятного чтения.
;  - Исправил пару сообщений на английском языке.

; Изменения от Victor_Dobrov, 15-06-2009
;  - Оптимизация и локализация скрипта, более подробная строка статуса, общий прогресс-бар, при неудачной распаковке выполняется откат (деинсталляция) и показывается текст ошибки.

; Bulat Ziganshin, 13-06-2009
;  - Создание библиотеки unarc.dll и скрипта распаковки freearc_example.iss.

#define ArcLocation "{src}\*.arc"
/// архивы лежат рядом с инсталятором и имеют расширение .arc

[Setup]
AppName=Sigerous Mod для COP
AppVerName=Sigerous Mod v2.2
DefaultDirName=stalker
//InfoBeforeFile=embedded\InfoBefore.rtf
//WizardImageFile=embedded\WizardImage.bmp
//WizardSmallImageFile=embedded\WizardSmallImage.bmp
Compression=lzma2/ultra
DiskSpanning=false
OutputDir=.

[Icons]
//Name: {group}\Uninstall; IconFilename: {app}\unins000.exe; Filename: {app}\unins000.exe



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

[CustomMessages]
eng.ArcBreak=Installation cancelled!
eng.ExtractedInfo=Extracted %1 Mb of %2 Mb
eng.ArcInfo=Archive: %1 of %2
eng.ArcTitle=Extracting FreeArc archive
eng.ArcError=Decompression failed with error code %1
eng.ArcFail=Decompression failed!
eng.AllProgress=Overall extraction progress: %1%%
eng.ArcBroken=Archive %1 is damaged%nor not enough free space.
eng.Extracting=Extracting: %1
eng.taskbar=%1%%, %2 remains
eng.remains=Remaining time: %1
eng.LongTime=at no time
eng.ending=ending
eng.hour= hours
eng.min= mins
eng.sec= secs

rus.ArcBreak=Установка прервана!
rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб
rus.ArcInfo=Архив: %1 из %2
rus.ArcTitle=Распаковка архивов FreeArc
rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1
rus.ArcFail=Распаковка не завершена!
rus.AllProgress=Общий прогресс распаковки: %1%%
rus.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения.
rus.Extracting=Распаковывается: %1
rus.taskbar=%1%%, жди %2
rus.remains=Осталось ждать %1
rus.LongTime=вечно
rus.ending=завершение
rus.hour= часов
rus.min= мин
rus.sec= сек

[Files]
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy

[UninstallDelete]
Type: filesandordirs; Name: {app}

[+Code]
const
    Archives = '{#ArcLocation}';    // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно

    PM_REMOVE = 1;
    CP_ACP = 0; CP_UTF8 = 65001;
    oneMb = 1048576;

type
#ifdef UNICODE  ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
    #define A "W"
#else
    #define A "A"  ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
#endif
#if Ver < 84018176
    AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and above (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif

    TMyMsg = record
        hwnd: HWND;
        message: UINT;
        wParam: Longint;
        lParam: Longint;
        time: DWORD;
        pt: TPoint;
    end;

    TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
    TArc = record Path: string; OrigSize: Integer; Size: Extended; end;

var
    ExtractFile: TLabel;
    lblExtractFileName: TLabel;
    btnCancelUnpacking: TButton;
    CancelCode, n, UnPackError, StartInstall: Integer;
    Arcs: array of TArc;
    msgError: string;
    lastMb: Integer;
    baseMb: Integer;
    totalUncompressedSize: Integer;            // total uncompressed size of archive data in mb
    LastTimerEvent: DWORD;

Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

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

// Перевод числа в строку с точностью 3 знака (%.3n) с округлением дробной части, если она есть
Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do
        SetLength(Result, Length(Result)-1);
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') 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;

// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировку
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
    nRet : longint;
begin
    SetLength( Result, Length( strSource ) );
    nRet:= OemToChar( strSource, Result );
end;

// Converts ANSI encoded string into UTF-8
// Преобразует строку из ANSI в UTF-8 кодировку
function AnsiToUtf8( strSource: string ): string;
var
    nRet : integer;
    WideCharBuf: string;
    MultiByteBuf: string;
begin
    strSource:= strSource + chr(0);
    SetLength( WideCharBuf, Length( strSource ) * 2 );
    SetLength( MultiByteBuf, Length( strSource ) * 2 );

    nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
    nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

    Result:= MultiByteBuf;
end;

// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
    if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
        CancelCode:= -127;
end;

var origsize: Integer;
// The callback function for getting info about FreeArc archive
function FreeArcInfoCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
begin
    if string(what)='origsize'    then origsize := Mb else
    if string(what)='compsize'    then                else
    if string(what)='total_files' then                else
    Result:= CancelCode;
end;

// Returns decompressed size of files in archive
function ArchiveOrigSize(arcname: string): Integer;
var
    callback: longword;
Begin
    callback:= WrapFreeArcCallback(@FreeArcInfoCallback,4);  //FreeArcInfoCallback has 4 arguments
    CancelCode:= 0;
    AppProcessMessage;
    try
        // Pass the specified arguments to 'unarc.dll'
        Result:= FreeArcExtract (callback, 'l', '--', AnsiToUtf8(arcname), '', '', '', '', '', '', '');
        if CancelCode < 0 then Result:= CancelCode;
        if Result >= 0 then Result:= origsize;
    except
        Result:= -63;  //    ArcFail
    end;
end;

// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
    FSR: TFindRec;
Begin
    Result:= 0;
    if FindFirst(ExpandConstant(dir), FSR) then begin
        try
            repeat
                // Skip everything but the folders
                if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
                n:= GetArrayLength(Arcs);
                // Expand the folder list
                SetArrayLength(Arcs, n +1);
                Arcs[n].Path:= ExtractFilePath(ExpandConstant(dir)) + FSR.Name;
                Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
                Result:= Result + Arcs[n].Size;
                Arcs[n].OrigSize := ArchiveOrigSize(Arcs[n].Path)
                totalUncompressedSize := totalUncompressedSize + Arcs[n].OrigSize
            until not FindNext(FSR);
        finally
            FindClose(FSR);
        end;
    end;
End;

// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
    h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;

// Converts milliseconds to human-readable time
// Конвертирует милисекунды в человеко-читаемое изображение времени
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail                              {hh:mm:ss format} then
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000              {more than hour}  then
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000                {1..60 minutes}  then
        Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
  else Result:= IntToStr(Ticks/1000) +s    {less than one minute}
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
    percents, Remaining: Integer;
    s: String;
begin
    if GetTickCount - LastTimerEvent > 1000 then begin
        // This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
        //  ....
        // End of code executed by timer
        LastTimerEvent := LastTimerEvent+1000;
    end;
   
    if string(what)='filename' then begin
        // Update FileName label
        lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
    end else if (string(what)='write') and (totalUncompressedSize>0) and (Mb>lastMb) then begin
        // Assign to Mb *total* amount of data extracted to the moment from all archives
        lastMb := Mb;
        Mb := baseMb+Mb;
   
        // Update progress bar
        WizardForm.ProgressGauge.Position:= Mb;

        // Show how much megabytes/archives were processed up to the moment
        percents:= (Mb*1000) div totalUncompressedSize;
        s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalUncompressedSize)]);
        if GetArrayLength(Arcs)>1 then
            s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))])
        ExtractFile.Caption := s

        // Calculate and show current percents
        percents:= (Mb*1000) div totalUncompressedSize;
        s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
        if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalUncompressedSize - Mb)/Mb)) else Remaining:= 0;
        if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
            s:= s + '.  '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
            SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
        end;
        WizardForm.FileNameLabel.Caption := s
    end;
    AppProcessMessage;
    Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
    totalCompressedSize: Extended;
    callback: longword;
    FreeMB, TotalMB: Cardinal;
begin
    // Display 'Extracting FreeArc archive'
    lblExtractFileName.Caption:= '';
    lblExtractFileName.Show;
    ExtractFile.caption:= cm('ArcTitle');
    ExtractFile.Show;
    // Show the 'Cancel unpacking' button and set it as default button
    btnCancelUnpacking.Caption:= WizardForm.CancelButton.Caption;
    btnCancelUnpacking.Show;
    WizardForm.ActiveControl:= btnCancelUnpacking;
    WizardForm.ProgressGauge.Position:= 0;
    // Get the size of all archives
    totalUncompressedSize := 0;
    totalCompressedSize := FindArcs(Archives);
    WizardForm.ProgressGauge.Max:= totalUncompressedSize;
    // Other initializations
    callback:= WrapFreeArcCallback(@FreeArcCallback,4);  //FreeArcCallback has 4 arguments
    StartInstall:= GetTickCount;    {время начала распаковки}
    LastTimerEvent:= GetTickCount;
    baseMb:= 0

    for n:= 0 to GetArrayLength(Arcs) -1 do
    begin
        lastMb := 0
        CancelCode:= 0;
        AppProcessMessage;
        try
            // Pass the specified arguments to 'unarc.dll'
            Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
            if CancelCode < 0 then Result:= CancelCode;
        except
            Result:= -63;  //    ArcFail
        end;
        baseMb:= baseMb+lastMb

        // Error occured
        if Result <> 0 then
        begin
            msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
            GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
            case Result of
                -1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
                    else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
                -127:  msgError:= cm('ArcBreak');    //Cancel button
                -63:    msgError:= cm('ArcFail');
            end;
//          MsgBox(msgError, mbInformation, MB_OK);    //сообщение показывается на странице завершения
            Log(msgError);
            Break;    //прервать цикл распаковки
        end;
    end;
    // Hide labels and button
    WizardForm.FileNameLabel.Caption:= '';
    lblExtractFileName.Hide;
    ExtractFile.Hide;
    btnCancelUnpacking.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
        UnPackError:= UnPack(Archives)
        if UnPackError = 0 then
            SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
        else
        begin
            // Error occured, uninstall it then
            Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);    //откат установки из-за ошибки unarc.dll
            SetTaskBarTitle(SetupMessage(msgErrorTitle))
            WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
        end;
    end;
end;

//    стандартный способ отката (не нужна CurPageChanged), но архивы распаковываются до извлечения файлов инсталлятора
//    if CurStep = ssInstall then
//      if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if (CurPageID = wpFinished) and (UnPackError <> 0) then
    begin // Extraction was unsuccessful (распаковщик вернул ошибку)
        // Show error message
        WizardForm.FinishedLabel.Font.Color:= $0000C0;    // red (красный)
        WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
        WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
    end;
End;

procedure InitializeWizard();
begin
    with WizardForm.ProgressGauge do
    begin
        // Create a label to show current FileName being extracted
        lblExtractFileName:= TLabel.Create(WizardForm);
        lblExtractFileName.parent:=WizardForm.InstallingPage;
        lblExtractFileName.autosize:=false;
        lblExtractFileName.Width:= Width;
        lblExtractFileName.top:=Top + ScaleY(35);
        lblExtractFileName.Caption:= '';
        lblExtractFileName.Hide;

        // Create a label to show percentage
        ExtractFile:= TLabel.Create(WizardForm);
        ExtractFile.parent:=WizardForm.InstallingPage;
        ExtractFile.autosize:=false;
        ExtractFile.Width:= Width;
        ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
        ExtractFile.caption:= '';
        ExtractFile.Hide;
    end;

    // Create a 'Cancel unpacking' button and hide it for now.
    btnCancelUnpacking:=TButton.create(WizardForm);
    btnCancelUnpacking.Parent:= WizardForm;
    btnCancelUnpacking.SetBounds(WizardForm.CancelButton.Left, WizardForm.CancelButton.top, WizardForm.CancelButton.Width, WizardForm.CancelButton.Height);
    btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
    btnCancelUnpacking.Hide;
end;



эта версия не самая новая, но рабочая
и как понимать вот это?
DefaultDirName=stalker
может имелось в виду
DefaultDirName={pf}\stalker

by_gangster 09-03-2012 20:26 1875714

Johny777, 1 спасибо, 2
Цитата:

Цитата Johny777
Compression=lzma2/ultra »

сжимает плохо и 3 как указывать расположение архива???

Johny777 09-03-2012 21:17 1875745

by_gangster,
не смешно...:diablo: :diablo:
ты мой пост читал?
Цитата:

Цитата Johny777
#define ArcLocation "{src}\*.arc" красного цвета определяет расположение архивов по отношению к инсталлятору »

я специально тебе вынес настройку расположения архивов в начало скрипта, чтобы даже в код заглядывать не нужно было
ты вообще скрипт просматривал?
и
Цитата:

Цитата by_gangster
lzma2/ultr сжимает плохо »

этим жмутся всего 2 библиотеки инсталлера и твой пролог + картинки
тебе и их нужно ужимать по максимуму?

да и вообще
Цитата:

Цитата by_gangster
сжимает плохо »

это бред
у тебя стояло вообще zip

valyok666 10-03-2012 03:46 1875931

repacksman, не понимаю смысл выкладки его

repacksman 10-03-2012 04:26 1875938

valyok666, Может ктото не может из крінкелса скачать

valyok666 10-03-2012 05:28 1875946

repacksman, смотрю русским языком ты не блещешь, как и Vasyakrn

repacksman 10-03-2012 09:38 1875999

valyok666, Я и есть vasyakrn. Мне просто профиль взломали

R.i.m.s.k.y. 10-03-2012 09:48 1876005

У меня такой вопрос - можно ли как-то изменить через код Description в списке компонентов?

И маленький вопросик: на последней странице у меня две птички "посетить сайт", если выбрать обе-две, открывается в броузере только первая. Я так понимаю браузер не может переварить сразу два урла и открывает первый переданный. Как это обойти?

by_gangster 10-03-2012 09:51 1876006

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

Gnom_aka_Lexander 10-03-2012 10:42 1876026

Цитата:

Цитата repacksman
Может ктото не может из крінкелса скачать »

Изза тебя, вора, пришлось пойти на эти ограничения. Тебе кстати, никто не разрешал этот скрипт у себя выкладывать.

R.i.m.s.k.y. 10-03-2012 10:43 1876028

блин
за такими спорами про меня забудут
Цитата:

Цитата R.i.m.s.k.y.
У меня такой вопрос - можно ли как-то изменить через код Description в списке компонентов?
И маленький вопросик: на последней странице у меня две птички "посетить сайт", если выбрать обе-две, открывается в броузере только первая. Я так понимаю браузер не может переварить сразу два урла и открывает первый переданный. Как это обойти? »


Gnom_aka_Lexander 10-03-2012 10:51 1876029

R.i.m.s.k.y.,
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Components]
Name: text; Description: Язык субтитров;
Name: text\rus; Description: Русский;
Name: text\eng; Description: Английский;

[*Code]
procedure ComponentsListClick(Sender: TObject);
var
  s: string;
  n: Integer;
begin
  with WizardForm.ComponentsList do
  begin
    s := '';
    ItemCaption[0] := '';
    for n := 0 to ItemCount - 1 do
    begin
      if Checked[n] then
        s := s + ItemCaption[n] + ' ' + '|' + ' ' + #32;
    end;
    Delete(s, Length(s) - 2, 2);
    if s = '' then s := 'Ничего не выбрано';
    ItemCaption[0] := s;
  end;
end;

procedure InitializeWizard();
begin
  with WizardForm.ComponentsList do
  begin
    OnClick := @ComponentsListClick;
  end;
end;

По второму вопросу - на птичках не стоит фалаг ожидания?

R.i.m.s.k.y. 10-03-2012 11:40 1876049

Цитата:

Цитата Лександер
По второму вопросу - на птичках не стоит фалаг ожидания? »

нет
Код:

Filename: http://www.SVP-Team.com; Description: Зайти на сайт SmoothVideo Project; Flags: shellexec skipifsilent postinstall nowait Unchecked
Check: IsRus; Filename: http://svp-team.com/wiki/Mailing_list/ru; Description: Подписаться на рассылку; Flags: shellexec skipifsilent postinstall nowait Unchecked

по первому что-то я не вижу чтобы что-то менялось

by_gangster 10-03-2012 11:43 1876051

Люди да помогите создать инсталятор с максимальным сжатием, плиииииззз :help: :help:

R.i.m.s.k.y. 10-03-2012 11:47 1876054

by_gangster, парой страниц назад были настройки на максимальное сжатие

Gnom_aka_Lexander 10-03-2012 11:49 1876055

R.i.m.s.k.y., могу порекомендовать использовать способ nick1967 создавать чекбокс и через шеллэкзек запускать.
Цитата:

Цитата by_gangster
с максимальным сжатием »

здесь это не обсуждается.
Цитата:

Цитата El Sanchez
Внимание! Данная тема предназначена только для обсуждения написания скриптов ! »

Не вижу ни одного слова про обсуждение способов сжатия.

by_gangster 10-03-2012 11:51 1876056

R.i.m.s.k.y., да чё я тока не делал, я весь форум перерыл, Compression=lzma почему он сжимает лучше чем lzma/ultra и т.д надо МАКСиМАлЬНО :help:

я ставил lzma2/ultra64 но инсталятор после этого стал ещё больше а если lzma то чуть-чуть поменьше становится
Возможные значения:
zip
zip/1 до zip/9
bzip
bzip/1 до bzip/9
lzma
lzma/fast
lzma/normal
lzma/max
lzma/ultra (рассмотрите требования к памяти ниже перед использованием)
lzma/ultra64 (рассмотрите требования к памяти ниже перед использованием)
lzma2
lzma2/fast
lzma2/normal
lzma2/max
lzma2/ultra (рассмотрите требования к памяти ниже перед использованием)
lzma2/ultra64 (рассмотрите требования к памяти ниже перед использованием)
none

R.i.m.s.k.y. 10-03-2012 11:59 1876063

Цитата:

Цитата Лександер
могу порекомендовать использовать способ nick1967 создавать чекбокс и через шеллэкзек запускать. »

а нельзя на шаге ssDone просто проверить какие чекбоксы были выбраны на FinishedPage?
Догадываюсь что можно, но я абсолютно не знаю названия всех этих внутренностей

alert30 10-03-2012 12:17 1876073

repacksman, молодец что в твоем сайте много готовых скриптов, но какой смысл здесь выкладывать?

Gnom_aka_Lexander 10-03-2012 12:17 1876074

можно. if WizardForm.RunList.Checked[0] then

R.i.m.s.k.y. 10-03-2012 12:20 1876076

Цитата:

Цитата Лександер
можно. if WizardForm.RunList.Checked[0] then »

а как этот НОЛЬ узнать? т.е. порядковый номер?
я вот наваял но ругается что неизвестный Items
Код:

if CurStep=ssDone  then begin
#if Full == True
if NeedRestart_my() then MsgBox(ExpandConstant('{cm:code9}'), mbInformation, MB_OK);
#endif

web1 := WizardForm.FinishedPage.Items.IndexOf(ExpandConstant('{cm:runSVPTeam}'));
web2 := WizardForm.FinishedPage.Items.IndexOf(ExpandConstant('{cm:runsubscribe}'));
if (WizardForm.FinishedPage.Checked[web1]) then ShellExec('open', 'http://www.SVP-Team.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
if (WizardForm.FinishedPage.Checked[web2]) then begin
  if IsRus then ShellExec('open', 'http://svp-team.com/wiki/Mailing_list/ru', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
  else ShellExec('open', 'http://svp-team.com/wiki/Mailing_list', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;
end; // CurStep=ssDone

хотя c ComponentsList и TasksList это работает

Gnom_aka_Lexander 10-03-2012 12:22 1876078

только нужно это вешать не на ssDone а в NextButtonClick:

Код:

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;
  if CurPageID=wpFinished then
  begin
    if WizardForm.RunList.Checked[0] then
.............................................
    Result := True;
  end;
end;

просто на ssDone итемы ранлиста еще не созданы, видимо.

R.i.m.s.k.y. 10-03-2012 12:27 1876079

Лександер, блин, последний список называется RunList, а я влупил FinishedPage
Теперь работает

El Sanchez 10-03-2012 13:19 1876123

Цитата:

Цитата Лександер
El Sanchez, одна беда - шрифт остается во временной папке »

Лександер, мерси, поправил. Не удалялся, потому что форма, его использующая, еще существовала.

Цитата:

Цитата Лександер
Причина, как объяснили, какая-то программа ловит это сообщение и не пересылает его дальше »

Попахивает грязным хуком. Антивирь как всегда спит при работе таких "обслуживающих утилиток"? :)

Gnom_aka_Lexander 10-03-2012 13:41 1876133

Цитата:

Цитата El Sanchez
Антивирь как всегда спит при работе таких "обслуживающих утилиток"? »

В том-то и дело, что ничего не говорит. Стоит лицензионный доктор веб на параноидальных настройках. Лично ничего такого не ставил, софт стараюсь с официальных сайтов качать. Но есть товарищь, у которого на чистой лицензионной семерке такая-же беда была. Что говорит о косяке мелких. видимо срабатывает комплекс железо+ос+драйвера.

by_gangster 10-03-2012 13:44 1876135

Люди да помогите чайнику :sorry: исправить хоть и тупой но скрипт, нодо что бы он распаковывал arc архив, и всё что внём. Я сделал что бы он расспаковывал сам .arc архив но он не распаковывает всё что внём,помогите поправить :dont-know
Вот скриншот

Код:

[Setup]
AppName=Sigerous Mod для COP
AppVerName=Sigerous Mod v2.2
DefaultDirName=stalker
InfoBeforeFile=embedded\InfoBefore.rtf
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp


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

[Files]
Source: *.arc; DestDir: {app}; Flags: ignoreversion
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy

[Icons]
Name: {group}\Uninstall; IconFilename: {app}\unins000.exe; Filename: {app}\unins000.exe

[_Code]


const
  PM_REMOVE      = 1;

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';

procedure AppProcessMessage;
var
  Msg: TMsg;
begin
  while PeekMessage(Msg, WizardForm.Handle, 0, 0, PM_REMOVE) do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end;



type
 
  TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;

function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword;
  external 'wrapcallback@files:innocallback.dll stdcall';

function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';



var
 ProgressBar: TNewProgressBar;
 ExtractFile: TNewStaticText;
 Button1:    TButton;
 Cancel:      Integer;

procedure InitializeWizard();
begin
  ProgressBar := TNewProgressBar.Create(WizardForm);
  ExtractFile:=TNewStaticText.Create(WizardForm);
  with WizardForm.ProgressGauge do
    begin
      ProgressBar.Left := Left;
      ProgressBar.Top := Top + ScaleX(55);
      ProgressBar.Width := Width;
      ProgressBar.Height := Height;
      ProgressBar.Parent := WizardForm.InstallingPage;
      ProgressBar.max := 1000;
      ProgressBar.Position := 0;
      ExtractFile.parent:=WizardForm.InstallingPage;
      ExtractFile.autosize:=false;
      ExtractFile.Width := Width;
      ExtractFile.top:=Top + ScaleX(35);
      ExtractFile.caption:='Распаковка архива FreeArc';
    end;
end;

procedure Button1OnClick(Sender: TObject);
begin
  Cancel := -1;
end;

function FreeArcCallback (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
var percents: Integer;
begin
  if string(what)='filename' then
      //ExtractFile.Caption:=str
  else if (string(what)='progress') and (int2>0) then begin
      percents := (int1*1000) div int2;
      ProgressBar.Position := percents;
      ExtractFile.Caption:='Распаковано '+IntToStr(int1)+' из '+IntToStr(int2)+' мб ('+FloatToStr(percents/10)+'%)';
  end;
  AppProcessMessage;
  Result := Cancel;
end;

procedure ExtractFreeArcArchive(arcname: String; destpath: String);
var callback: longword;
    res: Integer;
begin
  AppProcessMessage;
  callback:=WrapFreeArcCallback(@FreeArcCallback,4);  //FreeArcCallback has 4 arguments
  Cancel := 0;
  try
  res := FreeArcExtract (callback, 'x', '-o+', '-dp'+destpath, '--', arcname, '', '', '', '', '');
  if cancel<0 then
    MsgBox('Installation cancelled', mbInformation, MB_OK);
  if res<0 then
    MsgBox('Decompression failed with error code '+IntToStr(res)+'!', mbError, MB_OK);
  Button1.visible:=false;
  except
  MsgBox('Decompression failed!', mbError, MB_OK);
  Button1.visible:=false;
  end;
  DeleteFile(arcname);
end;

procedure CurStepChanged(CurStep: TSetupStep);
var app: String;
begin
  If CurStep=ssPostInstall then
  begin
    Button1:=TButton.create(WizardForm);
    Button1.parent:=WizardForm;
    Button1.width:=135;
    Button1.caption:='Cancel installation';
    Button1.left:=260;
    Button1.top:=WizardForm.cancelbutton.top;
    Button1.OnClick:=@Button1OnClick;

    app := ExpandConstant('{app}');
    ExtractFreeArcArchive(app+'\data.arc', app);
  end;
end;


Johny777 10-03-2012 14:11 1876146

R.i.m.s.k.y.,
вот как это реализовано Inno Setup GameScript Generator от South http://forum.csmania.ru/viewtopic.php?t=4688
читать дальше »
Код:

procedure RunListClickCheck(Sender: TObject);
var
  i:integer;
begin
  if WizardForm.RunList.Checked[WizardForm.RunList.ItemIndex] then begin
    for i:=0 to WizardForm.RunList.Items.Count-1 do
      WizardForm.RunList.Checked[i]:=False;
    WizardForm.RunList.Checked[WizardForm.RunList.ItemIndex]:=True;
  end;
end;

procedure InitializeWizard;
begin
  WizardForm.RunList.OnClickCheck:=@RunListClickCheck;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if (CurPageID=wpFinished) or (CurPageID=wpInfoAfter) then
    WizardForm.RunList.Checked[0]:=True;
end;


R.i.m.s.k.y. 10-03-2012 14:38 1876159

Johny777, спасибо, но я уже сделал как выше привел пример

repacksman 10-03-2012 15:36 1876196

alert30, Просто рекламма

alert30 10-03-2012 17:00 1876244

Цитата:

Цитата repacksman
alert30, Просто рекламма »

Ясно. ОК.

by_gangster 10-03-2012 22:14 1876438

Archives = '{#ArcLocation}'; как сдесь указывать расположение архивов arc ???

Johny777 10-03-2012 23:38 1876498

by_gangster,
ты прости, но это уже не в какие ворота
кажись я писал вот это
Цитата:

Цитата Johny777
я специально тебе вынес настройку расположения архивов в начало скрипта, чтобы даже в код заглядывать не нужно было »

Цитата:

Цитата Johny777
#define ArcLocation "{src}\*.arc" красного цвета определяет расположение архивов по отношению к инсталлятору »

а что в скрипте?


будь немного внимательнее! :butcher:

valyok666 11-03-2012 00:42 1876533

by_gangster, используй исдоне проще в обращении))

by_gangster 11-03-2012 10:23 1876659

Johny777, просто я ничего в нём не изменял но он выделяет мне строку Archives = '{#ArcLocation}';

R.i.m.s.k.y. 11-03-2012 10:26 1876663

by_gangster, т.е. код ошибки писать необязательно, типа сами догадывайтесь?
но раз выделает то скорее всего она неопределена
# define ArcLocation "путь до архивов"
Или путь неверный

Хосподя, сколько же этих репаков ждалкера развелось

by_gangster 11-03-2012 10:44 1876677

R.i.m.s.k.y., а как надо правильно указывать путь? :sorry:

R.i.m.s.k.y. 11-03-2012 10:54 1876681

by_gangster, ну это уж тебе решать где что ты раскладываешь
Ты ж скрипт пишешь, не я

by_gangster 11-03-2012 10:55 1876682

R.i.m.s.k.y., я просто вообще нифига не понимаю, ты хоть пример какой приведи :(

R.i.m.s.k.y. 11-03-2012 10:57 1876683

by_gangster, я с фриарком, исдоне и формами никак, сам спрашиваю
Вон выше рожал кусок чтобы через CurStepChanged открывалось пара сайтов. Просто да, но не для меня

by_gangster 11-03-2012 10:58 1876684

R.i.m.s.k.y., понятно, извени....

R.i.m.s.k.y. 11-03-2012 11:00 1876685

by_gangster, да не за что
ты бы лучше положил скрипт полностью и ошибку компилятора, вдруг кто помочь захочет

Кстати. как правило мимо проходящие отвечают если видят сразу в чем проблема, а вот вникать ломы - проходят мимо
И видеть сразу позволяет полностью выложенная инфа по ошибке

by_gangster 11-03-2012 11:03 1876687

R.i.m.s.k.y., да я вылаживал на этой стр

by_gangster 11-03-2012 13:51 1876805

всё люди нашёл нормальный скрипт, только помогите сделать так что бы он после распаковки arc архивов удалял сами архивы,
вот скрипт
Код:

[Setup]
AppName=FreeArc Example
AppVerName=FreeArc Example 2.0
DefaultDirName={pf}\FreeArc Example
UsePreviousAppDir=false
DirExistsWarning=no
ShowLanguageDialog=auto
OutputBaseFilename=FreeArcExample
OutputDir=.
VersionInfoCopyright=Bulat Ziganshin, Victor Dobrov, SotM, CTACKo

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

[CustomMessages]
eng.ArcCancel=Cancel installation
eng.ArcBreak=Installation cancelled!
eng.ExtractedInfo=Extracted %1 Mb of %2 Mb
eng.ArcInfo=Archive: %1 of %2
eng.ArcTitle=Extracting FreeArc archive
eng.ArcError=Decompression failed with error code %1
eng.ArcFail=Decompression failed!
eng.AllProgress=Overall extraction progress: %1%%
eng.ArcBroken=Archive %1 is damaged%nor not enough free space.
eng.Extracting=Extracting: %1
eng.taskbar=%1%%, %2 remains
eng.remains=Remaining time: %1
eng.LongTime=at no time
eng.ending=ending
eng.hour= hours
eng.min= mins
eng.sec= secs

rus.ArcCancel=Отменить распаковку
rus.ArcBreak=Установка прервана!
rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб
rus.ArcInfo=Архив: %1 из %2
rus.ArcTitle=Распаковка архивов FreeArc
rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1
rus.ArcFail=Распаковка не завершена!
rus.AllProgress=Общий прогресс распаковки: %1%%
rus.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения.
rus.Extracting=Распаковывается: %1
rus.taskbar=%1%%, жди %2
rus.remains=Осталось %1
rus.LongTime=вечно
rus.ending=завершение
rus.hour= часов
rus.min= мин
rus.sec= сек

[Files]
Source: *.arc; DestDir: {app}; Flags: nocompression
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy

[UninstallDelete]
Type: filesandordirs; Name: {app}

[_Code]
const
    Archives = '{src}\*.arc';    // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно
    totalSize = 200;            // total uncompressed size of archive data in mb, REQUIRED for correct progress displaying

    PM_REMOVE = 1;
    CP_ACP = 0; CP_UTF8 = 65001;

type
#ifdef UNICODE  ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
    #define A "W"
#else
    #define A "A"  ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
   
#endif
#if Ver < 84018176
    AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and below (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif

    TMyMsg = record
        hwnd: HWND;
        message: UINT;
        wParam: Longint;
        lParam: Longint;
        time: DWORD;
        pt: TPoint;
    end;

    TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
    TArc = record Path: string; Size: Extended; end;

var
    ExtractFile: TLabel;
    lblExtractFileName: TLabel;
    btnCancelUnpacking: TButton;
    CancelCode, n, UnPackError, StartInstall: Integer;
    Arcs: array of TArc;
    msgError: string;
    lastMb: Integer;
    baseMb: Integer;
    LastTimerEvent: DWORD;

Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

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

// Перевод числа в строку с точностью 3 знака (%.3n) с округлением дробной части, если она есть
Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do
        SetLength(Result, Length(Result)-1);
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') 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;

// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
    if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
        CancelCode:= -127;
end;

// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
    FSR: TFindRec;
Begin
    if FindFirst(ExpandConstant(dir), FSR) then
        try
            repeat
                // Skip everything but the folders
                if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
                n:= GetArrayLength(Arcs);
                // Expand the folder list
                SetArrayLength(Arcs, n +1);
                Arcs[n].Path:= ExtractFilePath(ExpandConstant(Archives)) + FSR.Name;
                Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
                Result:= Result + Arcs[n].Size;
            until not FindNext(FSR);
        finally
            FindClose(FSR);
        end;
End;

// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировку
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
    nRet : longint;
begin
    SetLength( Result, Length( strSource ) );
    nRet:= OemToChar( strSource, Result );
end;

// Converts ANSI encoded string into UTF-8
// Преобразует строку из ANSI в UTF-8 кодировку
function AnsiToUtf8( strSource: string ): string;
var
    nRet : integer;
    WideCharBuf: string;
    MultiByteBuf: string;
begin
    strSource:= strSource + chr(0);
    SetLength( WideCharBuf, Length( strSource ) * 2 );
    SetLength( MultiByteBuf, Length( strSource ) * 2 );

    nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
    nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

    Result:= MultiByteBuf;
end;

// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
    h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;

// Converts milliseconds to human-readable time
// Конвертирует милисекунды в человеко-читаемое изображение времени
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail then                          {hh:mm:ss format}
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000              {more than hour} then
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000 then          {1..60 minutes}
        Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
  else Result:= IntToStr(Ticks/1000) +s    {less than one minute}
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
    percents, Remaining: Integer;
    s: String;
begin
    if GetTickCount - LastTimerEvent > 1000 then begin
        // This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
        //  ....
        // End of code executed by timer
        LastTimerEvent := LastTimerEvent+1000;
    end;
   
    if string(what)='filename' then begin
        // Update FileName label
        lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
    end else if (string(what)='written') and (totalSize>0) and (Mb>lastMb) then begin
        // Assign to Mb *total* amount of data extracted to the moment from all archives
        lastMb := Mb;
        Mb := baseMb+Mb;
   
        // Update progress bar
        WizardForm.ProgressGauge.Position:= Mb;

        // Show how much megabytes/archives were processed up to the moment
        percents:= (Mb*1000) div totalSize;
        s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalSize)]);
        if GetArrayLength(Arcs)>1 then
            s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))])
        ExtractFile.Caption := s

        // Calculate and show current percents
        percents:= (Mb*1000) div totalSize;
        s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
        if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalSize - Mb)/Mb)) else Remaining:= 0;
        if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
            s:= s + '.  '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
            SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
        end;
        WizardForm.FileNameLabel.Caption := s
    end;
    AppProcessMessage;
    Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
    allSize: Extended;
    callback: longword;
    FreeMB, TotalMB: Cardinal;
begin
    // Display 'Extracting FreeArc archive'
    lblExtractFileName.Caption:= '';
    lblExtractFileName.Show;
    ExtractFile.caption:= cm('ArcTitle');
    ExtractFile.Show;
    // Show the 'Cancel unpacking' button and set it as default button
    btnCancelUnpacking.Show;
    WizardForm.ActiveControl:= btnCancelUnpacking;
    WizardForm.ProgressGauge.Position:= 0;
    WizardForm.ProgressGauge.Max:= totalSize;
    // Get the size of all archives
    allSize:= FindArcs(Archives);
    // Other initializations
    callback:= WrapFreeArcCallback(@FreeArcCallback,4);  //FreeArcCallback has 4 arguments
    StartInstall:= GetTickCount;    {время начала распаковки}
    LastTimerEvent:= GetTickCount;
    baseMb:= 0

    for n:= 0 to GetArrayLength(Arcs) -1 do
    begin
        lastMb := 0
        CancelCode:= 0;
        AppProcessMessage;
        try
            // Pass the specified arguments to 'unarc.dll'
            Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
            if CancelCode < 0 then Result:= CancelCode;
        except
            Result:= -63;  //    ArcFail
        end;
        baseMb:= baseMb+lastMb

        // Error occured
        if Result <> 0 then
        begin
            msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
            GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
            case Result of
                -1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
                    else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
                -127:  msgError:= cm('ArcBreak');    //Cancel button
                -63:    msgError:= cm('ArcFail');
            end;
//          MsgBox(msgError, mbInformation, MB_OK);    //сообщение показывается на странице завершения
            Log(msgError);
            Break;    //прервать цикл распаковки
        end;
    end;
    // Hide labels and button
   
    lblExtractFileName.Hide;
    ExtractFile.Hide;
    btnCancelUnpacking.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
        UnPackError:= UnPack(Archives)
        if UnPackError = 0 then
            SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
        else
        begin
            // Error occured, uninstall it then
            Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);    //откат установки из-за ошибки unarc.dll
            SetTaskBarTitle(SetupMessage(msgErrorTitle))
            WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
        end;
    end;
end;

//    стандартный способ отката (не нужна CurPageChanged), но архивы распаковываются до извлечения файлов инсталлятора
//    if CurStep = ssInstall then
//      if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if (CurPageID = wpFinished) and (UnPackError <> 0) then
    begin // Extraction was unsuccessful (распаковщик вернул ошибку)
        WizardForm.FinishedLabel.Font.Color:= $0000C0;    // red (красный)
        WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
        WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
    end;
End;

procedure InitializeWizard();
begin
    with WizardForm.ProgressGauge do
    begin
        // Create a label to show current FileName being extracted
        lblExtractFileName:= TLabel.Create(WizardForm);
        lblExtractFileName.parent:=WizardForm.InstallingPage;
        lblExtractFileName.autosize:=false;
        lblExtractFileName.Width:= Width;
        lblExtractFileName.top:=Top + ScaleY(35);
        lblExtractFileName.Caption:= '';
        lblExtractFileName.Hide;

        // Create a label to show percentage
        ExtractFile:= TLabel.Create(WizardForm);
        ExtractFile.parent:=WizardForm.InstallingPage;
        ExtractFile.autosize:=false;
        ExtractFile.Width:= Width;
        ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
        ExtractFile.caption:= '';
        ExtractFile.Hide;
    end;

    // Create a 'Cancel unpacking' button and hide it for now.
    btnCancelUnpacking:=TButton.create(WizardForm);
    btnCancelUnpacking.Parent:= WizardForm;
    btnCancelUnpacking.SetBounds(ScaleX(260), WizardForm.cancelbutton.top, ScaleX(140), WizardForm.cancelbutton.Height);
    btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
    btnCancelUnpacking.Caption:= cm('ArcCancel');
    btnCancelUnpacking.Hide;
end;


Snap_Suzun 11-03-2012 15:42 1876874

Всем Доброго времени суток! Меня интересует такой вот вопрос: Как сделать так чтобы путь установки выбирался по записи в реестре? Если это уже где - то решалось ткните меня носом туда=) Заранее премного благодарен!

nik1967 11-03-2012 15:50 1876882

Snap_Suzun,
Путь установки из реестра
Код:

[Setup]
AppName=GetDeviceInfo
AppVerName=GetDeviceInfo
DefaultDirName={code:GetInstallDir}
 
[_Code]
Function GetInstallDir( AppID: String ): String; var dir: String;
begin
  if not RegQueryStringValue(HKLM, 'SOFTWARE\Company\ProgramNamePro', 'InstallLocation', dir) then
    RegQueryStringValue(HKLM, 'SOFTWARE\Company\ProgramNameLight', 'InstallLocation', dir);
  Result:= dir;
end;
 
function InitializeSetup(): Boolean;
begin
 Result:= True;
 if not RegKeyExists(HKLM, 'SOFTWARE\Company\ProgramNamePro') then
 begin
  if not RegKeyExists(HKLM, 'SOFTWARE\Company\ProgramNameLight') then
  begin
  MsgBox('Программа не найдена!', mberror, mb_ok);
  Result:=False;
  exit;
  end
 end
end;


R.i.m.s.k.y. 11-03-2012 15:51 1876883

Snap_Suzun, как то так
Код:

[Setup]
DefaultDirName={code:Path|{pf}\appp}

[*Code]
function Path(String: String): String;
var s1, path : string;
begin
path := ExpandConstant('{pf}\appp');
if RegQueryStringValue(HKCU, 'Software\www', 'Path', s1) then path := s1;
end;


by_gangster 11-03-2012 16:00 1876892

R.i.m.s.k.y., а по моему вопросу не знаешь как сделать??

nik1967 11-03-2012 16:07 1876899

by_gangster, а скажи, зачем тебе удалять архивы фриарк, если у тебя в скрипте прописано
Код:

Archives = '{src}\*.arc';    // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно
{src}
Папка, в котором находится инсталлятор.
Цитата:

Цитата valyok666
by_gangster, используй исдоне проще в обращении)) »


R.i.m.s.k.y. 11-03-2012 16:14 1876904

Цитата:

Цитата by_gangster
а по моему вопросу не знаешь как сделать?? »

Цитата:

Цитата R.i.m.s.k.y.
я с фриарком, исдоне и формами никак »


Johny777 11-03-2012 16:52 1876931

R.i.m.s.k.y., nik1967,
можно так
проще
AppID=myAppSuperID
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID") }_is1,InstallLocation|{pf}\program}
каждый раз при повторной установки ищет саму себя же.

by_gangster 11-03-2012 18:14 1876992

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

R.i.m.s.k.y. 11-03-2012 18:19 1876995

by_gangster, епт у тебя вызов в скрипте {src}\*.arc!!11
ты запустишь инсталлер, он поставит и потом добросовестно смахнет исходник!!!

by_gangster 11-03-2012 18:25 1877000

R.i.m.s.k.y., ну так бл**ть объясни чайнику как всё по нормальному сделать :tomato2:

R.i.m.s.k.y. 11-03-2012 18:56 1877022

Цитата:

Цитата R.i.m.s.k.y.
{src}\*.arc »

не надо это удалять

nik1967 11-03-2012 20:28 1877060

by_gangster,
вот смотри:
для указания расположения архивов ты использовал константу {src}, которая определяет место, из которого был запущен инсталлятор (setup.exe), то есть получается, что архивы находятся рядом с setup.exe. И если ты не прописывал архивы в секции [Files], то инсталлятор распакует архивы по пути {src}\, то есть находящиеся рядом с setup.exe. А если ты записал, например, инсталлятор (setup.exe) и архивы на диск, или создал образ ISO, то как ты удалишь эти архивы? Поправь меня, если это не так.
P.S. Сейчас только заметил: закомментируй, или удали из секции [Files] строчку
Код:

Source: *.arc; DestDir: {app}; Flags: ignoreversion
У тебя получается, что инсталлятор запаковывает архивы, затем их распаковывает в {app} и лишь только потом распаковывает сами архивы.
P.P.S. А лучше прислушайся и используй для распаковки ISDone - он более универсален и по функционалу гораздо лучше.
Удачи!

by_gangster 11-03-2012 20:46 1877072

а куда вписывать доп. код????

nik1967, я уже по своему сделал

by_gangster 11-03-2012 21:02 1877084

nik1967, ты случайно не знаешь???? :)

nik1967 11-03-2012 21:05 1877088

Цитата:

Цитата by_gangster
а куда вписывать доп. код???? »

А что это?

by_gangster 11-03-2012 21:08 1877089

nik1967, сдесь я нашёл Кликабельная текстовая http-ссылка в левом нижнем углу инсталлера, так как второй [_Code] вписать????

nik1967 11-03-2012 21:54 1877134

by_gangster,
Как то так
Код:

[Setup]
AppName=FreeArc Example
AppVerName=FreeArc Example 2.0
DefaultDirName={pf}\FreeArc Example
UsePreviousAppDir=false
DirExistsWarning=no
ShowLanguageDialog=auto
OutputBaseFilename=FreeArcExample
OutputDir=.
VersionInfoCopyright=Bulat Ziganshin, Victor Dobrov, SotM, CTACKo

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

[CustomMessages]
eng.ArcCancel=Cancel installation
eng.ArcBreak=Installation cancelled!
eng.ExtractedInfo=Extracted %1 Mb of %2 Mb
eng.ArcInfo=Archive: %1 of %2
eng.ArcTitle=Extracting FreeArc archive
eng.ArcError=Decompression failed with error code %1
eng.ArcFail=Decompression failed!
eng.AllProgress=Overall extraction progress: %1%%
eng.ArcBroken=Archive %1 is damaged%nor not enough free space.
eng.Extracting=Extracting: %1
eng.taskbar=%1%%, %2 remains
eng.remains=Remaining time: %1
eng.LongTime=at no time
eng.ending=ending
eng.hour= hours
eng.min= mins
eng.sec= secs

rus.ArcCancel=Отменить распаковку
rus.ArcBreak=Установка прервана!
rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб
rus.ArcInfo=Архив: %1 из %2
rus.ArcTitle=Распаковка архивов FreeArc
rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1
rus.ArcFail=Распаковка не завершена!
rus.AllProgress=Общий прогресс распаковки: %1%%
rus.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения.
rus.Extracting=Распаковывается: %1
rus.taskbar=%1%%, жди %2
rus.remains=Осталось %1
rus.LongTime=вечно
rus.ending=завершение
rus.hour= часов
rus.min= мин
rus.sec= сек

[Files]
;Source: *.arc; DestDir: {app}; Flags: nocompression
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy

[UninstallDelete]
Type: filesandordirs; Name: {app}

[_Code]
const
    Archives = '{src}\*.arc';    // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно
    totalSize = 200;            // total uncompressed size of archive data in mb, REQUIRED for correct progress displaying

    PM_REMOVE = 1;
    CP_ACP = 0; CP_UTF8 = 65001;

type
#ifdef UNICODE  ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
    #define A "W"
#else
    #define A "A"  ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
   
#endif
#if Ver < 84018176
    AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and below (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif

    TMyMsg = record
        hwnd: HWND;
        message: UINT;
        wParam: Longint;
        lParam: Longint;
        time: DWORD;
        pt: TPoint;
    end;

    TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
    TArc = record Path: string; Size: Extended; end;

var
    ExtractFile: TLabel;
    lblExtractFileName: TLabel;
    btnCancelUnpacking: TButton;
    CancelCode, n, UnPackError, StartInstall: Integer;
    Arcs: array of TArc;
    msgError: string;
    lastMb: Integer;
    baseMb: Integer;
    LastTimerEvent: DWORD;

    MouseLabel,SiteLabel: TLabel; // Кликабельная текстовая http-ссылка в левом нижнем углу инсталлера //

Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

///////////////// Кликабельная текстовая http-ссылка в левом нижнем углу инсталлера /////////////////
procedure SiteLabelOnClick(Sender: TObject); 
var 
ErrorCode: Integer; 
begin 
ShellExec('open', 'http://forum.ru-board.com', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode); 
end; 
 
procedure SiteLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
SiteLabel.Font.Color:=clRed; 
end; 
 
procedure SiteLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
begin 
SiteLabel.Font.Color:=clBlue; 
end; 
 
procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
begin 
SiteLabel.Font.Color:=clGreen; 
end; 
 
procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer); 
begin 
SiteLabel.Font.Color:=clBlue; 
end;
///////////////// Кликабельная текстовая http-ссылка в левом нижнем углу инсталлера ///////////////// 

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

// Перевод числа в строку с точностью 3 знака (%.3n) с округлением дробной части, если она есть
Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do
        SetLength(Result, Length(Result)-1);
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') 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;

// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
    if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
        CancelCode:= -127;
end;

// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
    FSR: TFindRec;
Begin
    if FindFirst(ExpandConstant(dir), FSR) then
        try
            repeat
                // Skip everything but the folders
                if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
                n:= GetArrayLength(Arcs);
                // Expand the folder list
                SetArrayLength(Arcs, n +1);
                Arcs[n].Path:= ExtractFilePath(ExpandConstant(Archives)) + FSR.Name;
                Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
                Result:= Result + Arcs[n].Size;
            until not FindNext(FSR);
        finally
            FindClose(FSR);
        end;
End;

// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировку
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
    nRet : longint;
begin
    SetLength( Result, Length( strSource ) );
    nRet:= OemToChar( strSource, Result );
end;

// Converts ANSI encoded string into UTF-8
// Преобразует строку из ANSI в UTF-8 кодировку
function AnsiToUtf8( strSource: string ): string;
var
    nRet : integer;
    WideCharBuf: string;
    MultiByteBuf: string;
begin
    strSource:= strSource + chr(0);
    SetLength( WideCharBuf, Length( strSource ) * 2 );
    SetLength( MultiByteBuf, Length( strSource ) * 2 );

    nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
    nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

    Result:= MultiByteBuf;
end;

// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
    h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;

// Converts milliseconds to human-readable time
// Конвертирует милисекунды в человеко-читаемое изображение времени
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail then                          {hh:mm:ss format}
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000              {more than hour} then
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000 then          {1..60 minutes}
        Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
  else Result:= IntToStr(Ticks/1000) +s    {less than one minute}
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
    percents, Remaining: Integer;
    s: String;
begin
    if GetTickCount - LastTimerEvent > 1000 then begin
        // This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
        //  ....
        // End of code executed by timer
        LastTimerEvent := LastTimerEvent+1000;
    end;
   
    if string(what)='filename' then begin
        // Update FileName label
        lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
    end else if (string(what)='written') and (totalSize>0) and (Mb>lastMb) then begin
        // Assign to Mb *total* amount of data extracted to the moment from all archives
        lastMb := Mb;
        Mb := baseMb+Mb;
   
        // Update progress bar
        WizardForm.ProgressGauge.Position:= Mb;

        // Show how much megabytes/archives were processed up to the moment
        percents:= (Mb*1000) div totalSize;
        s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalSize)]);
        if GetArrayLength(Arcs)>1 then
            s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))]);
        ExtractFile.Caption := s;

        // Calculate and show current percents
        percents:= (Mb*1000) div totalSize;
        s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
        if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalSize - Mb)/Mb)) else Remaining:= 0;
        if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
            s:= s + '.  '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
            SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
        end;
        WizardForm.FileNameLabel.Caption := s
    end;
    AppProcessMessage;
    Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
    allSize: Extended;
    callback: longword;
    FreeMB, TotalMB: Cardinal;
begin
    // Display 'Extracting FreeArc archive'
    lblExtractFileName.Caption:= '';
    lblExtractFileName.Show;
    ExtractFile.caption:= cm('ArcTitle');
    ExtractFile.Show;
    // Show the 'Cancel unpacking' button and set it as default button
    btnCancelUnpacking.Show;
    WizardForm.ActiveControl:= btnCancelUnpacking;
    WizardForm.ProgressGauge.Position:= 0;
    WizardForm.ProgressGauge.Max:= totalSize;
    // Get the size of all archives
    allSize:= FindArcs(Archives);
    // Other initializations
    callback:= WrapFreeArcCallback(@FreeArcCallback,4);  //FreeArcCallback has 4 arguments
    StartInstall:= GetTickCount;    {время начала распаковки}
    LastTimerEvent:= GetTickCount;
    baseMb:= 0

    for n:= 0 to GetArrayLength(Arcs) -1 do
    begin
        lastMb := 0
        CancelCode:= 0;
        AppProcessMessage;
        try
            // Pass the specified arguments to 'unarc.dll'
            Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
            if CancelCode < 0 then Result:= CancelCode;
        except
            Result:= -63;  //    ArcFail
        end;
        baseMb:= baseMb+lastMb

        // Error occured
        if Result <> 0 then
        begin
            msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
            GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
            case Result of
                -1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
                    else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
                -127:  msgError:= cm('ArcBreak');    //Cancel button
                -63:    msgError:= cm('ArcFail');
            end;
//          MsgBox(msgError, mbInformation, MB_OK);    //сообщение показывается на странице завершения
            Log(msgError);
            Break;    //прервать цикл распаковки
        end;
    end;
    // Hide labels and button
   
    lblExtractFileName.Hide;
    ExtractFile.Hide;
    btnCancelUnpacking.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
        UnPackError:= UnPack(Archives)
        if UnPackError = 0 then
            SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
        else
        begin
            // Error occured, uninstall it then
            Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);    //откат установки из-за ошибки unarc.dll
            SetTaskBarTitle(SetupMessage(msgErrorTitle))
            WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
        end;
    end;
end;

//    стандартный способ отката (не нужна CurPageChanged), но архивы распаковываются до извлечения файлов инсталлятора
//    if CurStep = ssInstall then
//      if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if (CurPageID = wpFinished) and (UnPackError <> 0) then
    begin // Extraction was unsuccessful (распаковщик вернул ошибку)
        WizardForm.FinishedLabel.Font.Color:= $0000C0;    // red (красный)
        WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
        WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
    end;
End;

procedure InitializeWizard();
begin
    with WizardForm.ProgressGauge do
    begin
        // Create a label to show current FileName being extracted
        lblExtractFileName:= TLabel.Create(WizardForm);
        lblExtractFileName.parent:=WizardForm.InstallingPage;
        lblExtractFileName.autosize:=false;
        lblExtractFileName.Width:= Width;
        lblExtractFileName.top:=Top + ScaleY(35);
        lblExtractFileName.Caption:= '';
        lblExtractFileName.Hide;

        // Create a label to show percentage
        ExtractFile:= TLabel.Create(WizardForm);
        ExtractFile.parent:=WizardForm.InstallingPage;
        ExtractFile.autosize:=false;
        ExtractFile.Width:= Width;
        ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
        ExtractFile.caption:= '';
        ExtractFile.Hide;
    end;

    // Create a 'Cancel unpacking' button and hide it for now.
    btnCancelUnpacking:=TButton.create(WizardForm);
    btnCancelUnpacking.Parent:= WizardForm;
    btnCancelUnpacking.SetBounds(ScaleX(260), WizardForm.cancelbutton.top, ScaleX(140), WizardForm.cancelbutton.Height);
    btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
    btnCancelUnpacking.Caption:= cm('ArcCancel');
    btnCancelUnpacking.Hide;

///////////////// Кликабельная текстовая http-ссылка в левом нижнем углу инсталлера /////////////////
    MouseLabel:=TLabel.Create(WizardForm); 
    MouseLabel.Width:=WizardForm.Width; 
    MouseLabel.Height:=WizardForm.Height; 
    MouseLabel.Autosize:=False; 
    MouseLabel.Transparent:=True; 
    MouseLabel.OnMouseMove:=@SiteLabelMouseMove2; 
    MouseLabel.Parent:=WizardForm;
 
    SiteLabel:=TLabel.Create(WizardForm); 
    SiteLabel.Left:=10; 
    SiteLabel.Top:=330; 
    SiteLabel.Cursor:=crHand; 
    SiteLabel.Font.Color:=clBlue; 
    SiteLabel.Caption:='Forum Ru-Board'; 
    SiteLabel.OnClick:=@SiteLabelOnClick; 
    SiteLabel.OnMouseDown:=@SiteLabelMouseDown; 
    SiteLabel.OnMouseUp:=@SiteLabelMouseUp; 
    SiteLabel.OnMouseMove:=@SiteLabelMouseMove; 
    SiteLabel.Parent:=WizardForm;
///////////////// Кликабельная текстовая http-ссылка в левом нижнем углу инсталлера /////////////////
end;


by_gangster 11-03-2012 22:25 1877176

nik1967,ругается SiteLabel.Font.Color:=clRed

nik1967 12-03-2012 11:11 1877527

Цитата:

Цитата by_gangster
nik1967,ругается SiteLabel.Font.Color:=clRed »

Я немного подредактировал свой предыдущий пост - пример работает даже на юникоде. Почему у тебя ругается и именно на эту строку, мне не известно. Если ничего не менял в скрипте, должно всё работать. Проверено на анси и на юникоде.

valyok666 12-03-2012 11:50 1877552

nik1967, вппрос к by_gangster, какое инно у тебя стоит?

by_gangster 12-03-2012 14:08 1877635

valyok666, innoultra

Johny777 12-03-2012 14:18 1877636

by_gangster,
скомпилировал скрипт с предыдущей страницы
никакой ругани вообще
у меня стоит расширенная (есть в инно ультра) ANSI версия

by_gangster 12-03-2012 14:34 1877649

Johny777, я незнаю вот мой скрипт

Код:

; installer by_gangster
[Setup]
AppName=Sigerous Mod для COP
AppVerName=Sigerous Mod v2.2
DefaultDirName={pf}
InfoBeforeFile=embedded\InfoBefore.rtf
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\WizardSmallImage.bmp
SetupIconFile=embedded\sgm.ico
Compression=zip
OutputDir=.
 
[Languages]
Name: eng; MessagesFile: compiler:Languages\english.isl
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[CustomMessages]
eng.ArcCancel=Cancel installation
eng.ArcBreak=Installation cancelled!
eng.ExtractedInfo=Extracted %1 Mb of %2 Mb
eng.ArcInfo=Archive: %1 of %2
eng.ArcTitle=Extracting FreeArc archive
eng.ArcError=Decompression failed with error code %1
eng.ArcFail=Decompression failed!
eng.AllProgress=Overall extraction progress: %1%%
eng.ArcBroken=Archive %1 is damaged%nor not enough free space.
eng.Extracting=Extracting: %1
eng.taskbar=%1%%, %2 remains
eng.remains=Remaining time: %1
eng.LongTime=at no time
eng.ending=ending
eng.hour= hours
eng.min= mins
eng.sec= secs

rus.ArcCancel=Отменить распаковку
rus.ArcBreak=Установка прервана!
rus.ExtractedInfo=Распаковано %1 Мб из %2 Мб
rus.ArcInfo=Архив: %1 из %2
rus.ArcTitle=Распаковка архивов FreeArc
rus.ArcError=Распаковщик FreeArc вернул код ошибки: %1
rus.ArcFail=Распаковка не завершена!
rus.AllProgress=Общий прогресс распаковки: %1%%
rus.ArcBroken=Возможно, архив %1 повреждён%nили недостаточно места на диске назначения.
rus.Extracting=Распаковывается: %1
rus.taskbar=%1%%, жди %2
rus.remains=Осталось %1
rus.LongTime=вечно
rus.ending=завершение
rus.hour= часов
rus.min= мин
rus.sec= сек

[Files]
Source: *.arc; DestDir: {app}; Flags: dontcopy
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy

[UninstallDelete]
Type: filesandordirs; Name: {app}

[_Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  Label1: TLabel;

procedure RedesignWizardForm;
begin
  { Label1 }
  Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Name := 'Label1';
    Parent := WizardForm.SelectDirPage;
    Caption := 'Распакуйте в папку с установленой игрой Сталкер Зов Припяти';
    Transparent := False;
    Left := ScaleX(0);
    Top := ScaleY(120);
    Width := ScaleX(329);
    Height := ScaleY(13);
  end;

  with WizardForm.FinishedLabel do
  begin
    Caption := 'Sigerous Mod для COP установлен на Ваш компьютер. Приложение можно запустить с помощью соответствующего значка.' + #13#10 +
        '' + #13#10 +
        'Нажмите «Завершить», чтобы выйти из программы установки.' + #13#10 +
        '';
  end;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

const
    Archives = '{src}\*.arc';    // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять необязательно
    totalSize = 2387;            // total uncompressed size of archive data in mb, REQUIRED for correct progress displaying

    PM_REMOVE = 1;
    CP_ACP = 0; CP_UTF8 = 65001;

type
#ifdef UNICODE  ; если у вас ошибка на этой строке, то установите препроцессор или исправьте скрипт для вашей версии Inno Setup
    #define A "W"
#else
    #define A "A"  ; точка входа в SetWindowText, {#A} меняется на A или W в зависимости от версии
   
#endif
#if Ver < 84018176
    AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and below (для Inno Setup версий 5.2.4 и выше эта строка не нужна)
#endif

    TMyMsg = record
        hwnd: HWND;
        message: UINT;
        wParam: Longint;
        lParam: Longint;
        time: DWORD;
        pt: TPoint;
    end;

    TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
    TArc = record Path: string; Size: Extended; end;

var
    ExtractFile: TLabel;
    lblExtractFileName: TLabel;
    btnCancelUnpacking: TButton;
    CancelCode, n, UnPackError, StartInstall: Integer;
    Arcs: array of TArc;
    msgError: string;
    lastMb: Integer;
    baseMb: Integer;
    LastTimerEvent: DWORD;


Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

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

// Перевод числа в строку с точностью 3 знака (%.3n) с округлением дробной части, если она есть
Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do
        SetLength(Result, Length(Result)-1);
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') 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;

// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
    if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
        CancelCode:= -127;
end;

// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
    FSR: TFindRec;
Begin
    if FindFirst(ExpandConstant(dir), FSR) then
        try
            repeat
                // Skip everything but the folders
                if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
                n:= GetArrayLength(Arcs);
                // Expand the folder list
                SetArrayLength(Arcs, n +1);
                Arcs[n].Path:= ExtractFilePath(ExpandConstant(Archives)) + FSR.Name;
                Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
                Result:= Result + Arcs[n].Size;
            until not FindNext(FSR);
        finally
            FindClose(FSR);
        end;
End;

// Converts OEM encoded string into ANSI
// Преобразует OEM строку в ANSI кодировку
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
    nRet : longint;
begin
    SetLength( Result, Length( strSource ) );
    nRet:= OemToChar( strSource, Result );
end;

// Converts ANSI encoded string into UTF-8
// Преобразует строку из ANSI в UTF-8 кодировку
function AnsiToUtf8( strSource: string ): string;
var
    nRet : integer;
    WideCharBuf: string;
    MultiByteBuf: string;
begin
    strSource:= strSource + chr(0);
    SetLength( WideCharBuf, Length( strSource ) * 2 );
    SetLength( MultiByteBuf, Length( strSource ) * 2 );

    nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
    nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

    Result:= MultiByteBuf;
end;

// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
    h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;

// Converts milliseconds to human-readable time
// Конвертирует милисекунды в человеко-читаемое изображение времени
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail then                          {hh:mm:ss format}
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000              {more than hour} then
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000 then          {1..60 minutes}
        Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
  else Result:= IntToStr(Ticks/1000) +s    {less than one minute}
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
    percents, Remaining: Integer;
    s: String;
begin
    if GetTickCount - LastTimerEvent > 1000 then begin
        // This code will be executed once each 1000 ms (этот код будет выполняться раз в 1000 миллисекунд)
        //  ....
        // End of code executed by timer
        LastTimerEvent := LastTimerEvent+1000;
    end;
   
    if string(what)='filename' then begin
        // Update FileName label
        lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
    end else if (string(what)='written') and (totalSize>0) and (Mb>lastMb) then begin
        // Assign to Mb *total* amount of data extracted to the moment from all archives
        lastMb := Mb;
        Mb := baseMb+Mb;
   
        // Update progress bar
        WizardForm.ProgressGauge.Position:= Mb;

        // Show how much megabytes/archives were processed up to the moment
        percents:= (Mb*1000) div totalSize;
        s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalSize)]);
        if GetArrayLength(Arcs)>1 then
            s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))])
        ExtractFile.Caption := s

        // Calculate and show current percents
        percents:= (Mb*1000) div totalSize;
        s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
        if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalSize - Mb)/Mb)) else Remaining:= 0;
        if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
            s:= s + '.  '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
            SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
        end;
        WizardForm.FileNameLabel.Caption := s
    end;
    AppProcessMessage;
    Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
    allSize: Extended;
    callback: longword;
    FreeMB, TotalMB: Cardinal;
begin
    // Display 'Extracting FreeArc archive'
    lblExtractFileName.Caption:= '';
    lblExtractFileName.Show;
    ExtractFile.caption:= cm('ArcTitle');
    ExtractFile.Show;
    // Show the 'Cancel unpacking' button and set it as default button
    btnCancelUnpacking.Show;
    WizardForm.ActiveControl:= btnCancelUnpacking;
    WizardForm.ProgressGauge.Position:= 0;
    WizardForm.ProgressGauge.Max:= totalSize;
    // Get the size of all archives
    allSize:= FindArcs(Archives);
    // Other initializations
    callback:= WrapFreeArcCallback(@FreeArcCallback,4);  //FreeArcCallback has 4 arguments
    StartInstall:= GetTickCount;    {время начала распаковки}
    LastTimerEvent:= GetTickCount;
    baseMb:= 0

    for n:= 0 to GetArrayLength(Arcs) -1 do
    begin
        lastMb := 0
        CancelCode:= 0;
        AppProcessMessage;
        try
            // Pass the specified arguments to 'unarc.dll'
            Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
            if CancelCode < 0 then Result:= CancelCode;
        except
            Result:= -63;  //    ArcFail
        end;
        baseMb:= baseMb+lastMb

        // Error occured
        if Result <> 0 then
        begin
            msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
            GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
            case Result of
                -1: if FreeMB < 32 {Мб на диске} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
                    else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
                -127:  msgError:= cm('ArcBreak');    //Cancel button
                -63:    msgError:= cm('ArcFail');
            end;
//          MsgBox(msgError, mbInformation, MB_OK);    //сообщение показывается на странице завершения
            Log(msgError);
            Break;    //прервать цикл распаковки
        end;
    end;
    // Hide labels and button
   
    lblExtractFileName.Hide;
    ExtractFile.Hide;
    btnCancelUnpacking.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
        UnPackError:= UnPack(Archives)
        if UnPackError = 0 then
            SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
        else
        begin
            // Error occured, uninstall it then
            Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);    //откат установки из-за ошибки unarc.dll
            SetTaskBarTitle(SetupMessage(msgErrorTitle))
            WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
        end;
    end;
end;

//    стандартный способ отката (не нужна CurPageChanged), но архивы распаковываются до извлечения файлов инсталлятора
//    if CurStep = ssInstall then
//      if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if (CurPageID = wpFinished) and (UnPackError <> 0) then
    begin // Extraction was unsuccessful (распаковщик вернул ошибку)
        WizardForm.FinishedLabel.Font.Color:= $0000C0;    // red (красный)
        WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
        WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
    end;
End;

procedure InitializeWizard();
begin
  RedesignWizardForm;
    with WizardForm.ProgressGauge do
    begin
        // Create a label to show current FileName being extracted
        lblExtractFileName:= TLabel.Create(WizardForm);
        lblExtractFileName.parent:=WizardForm.InstallingPage;
        lblExtractFileName.autosize:=false;
        lblExtractFileName.Width:= Width;
        lblExtractFileName.top:=Top + ScaleY(35);
        lblExtractFileName.Caption:= '';
        lblExtractFileName.Hide;

        // Create a label to show percentage
        ExtractFile:= TLabel.Create(WizardForm);
        ExtractFile.parent:=WizardForm.InstallingPage;
        ExtractFile.autosize:=false;
        ExtractFile.Width:= Width;
        ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
        ExtractFile.caption:= '';
        ExtractFile.Hide;
    end;

    // Create a 'Cancel unpacking' button and hide it for now.
    btnCancelUnpacking:=TButton.create(WizardForm);
    btnCancelUnpacking.Parent:= WizardForm;
    btnCancelUnpacking.SetBounds(ScaleX(260), WizardForm.cancelbutton.top, ScaleX(140), WizardForm.cancelbutton.Height);
    btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
    btnCancelUnpacking.Caption:= cm('ArcCancel');
    btnCancelUnpacking.Hide;
end;

 
[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D0030108104000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167650D53656C656374446972506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED0000F2020106544C6162656C064C6162656C31044C656674020003546F70027805576964746803490106486569676874020D0743617074696F6E146E000000D0A3D181D182D0B0D0BDD0BED0B2D0B8D182D0B520D0B220D0BFD0B0D0BFD0BAD18320D18120D183D181D182D0B0D0BDD0BED0B2D0BBD0B5D0BDD0BED0B920D0B8D0B3D180D0BED0B920D0A1D182D0B0D0BBD0BAD0B5D18020D097D0BED0B220D09FD180D0B8D0BFD18FD182D0B80B5472616E73706172656E7408000000F110544E65774E6F7465626F6F6B506167650E496E7374616C6C696E67506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED0000000000F110544E65774E6F7465626F6F6B506167650C46696E6973686564506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10E544E6577537461746963546578740D46696E69736865644C6162656C0743617074696F6E142E01000053696765726F7573204D6F6420D0B4D0BBD18F20434F5020D183D181D182D0B0D0BDD0BED0B2D0BBD0B5D0BD20D0BDD0B020D092D0B0D18820D0BAD0BED0BCD0BFD18CD18ED182D0B5D1802E20D09FD180D0B8D0BBD0BED0B6D0B5D0BDD0B8D0B520D0BCD0BED0B6D0BDD0BE20D0B7D0B0D0BFD183D181D182D0B8D182D18C20D18120D0BFD0BED0BCD0BED189D18CD18E20D181D0BED0BED182D0B2D0B5D182D181D182D0B2D183D18ED189D0B5D0B3D0BE20D0B7D0BDD0B0D187D0BAD0B02E0D0A0D0AD09DD0B0D0B6D0BCD0B8D182D0B520C2ABD097D0B0D0B2D0B5D180D188D0B8D182D18CC2BB2C20D187D182D0BED0B1D18B20D0B2D18BD0B9D182D0B820D0B8D0B720D0BFD180D0BED0B3D180D0B0D0BCD0BCD18B20D183D181D182D0B0D0BDD0BED0B2D0BAD0B82E0D0A0000000000


Johny777 12-03-2012 14:53 1877666

by_gangster,
ты меня в конец запутал
в нём нет SiteLabel, то бишь кликабельнй ссылки
и опять же всё компилируется без проблем

ответь мне пожалуйста зачем ты кладёшь архив FreeArc в инсталлер?
Source: *.arc; DestDir: {app}; Flags: dontcopy

by_gangster 12-03-2012 15:03 1877677

Johny777, лучше сжимает, а dontcopy а поставил для того чтобы он не копировал архивы, а расспаковывал их, мне бы ещё кликабельную ссылку и было бы вообще супер :up

Johny777, а всё нормально извени пожалуйста это я тупанул всё работает :clapping:

Johny777 12-03-2012 15:16 1877692

Цитата:

Цитата by_gangster
лучше сжимает, »

Compression=zip + Freearc и в конечном итоге общий размер инсталла меньше?
ерунда
прекращай это
плюс внешних архиваторов в том, что их не нужно класть в инсталлер, он их снаружи "цепляет" и распаковывает
ты лишился этого плюса

by_gangster 12-03-2012 15:23 1877700

а как две ссылки сделать?????

Johny777, поверь мне меньше

R.i.m.s.k.y. 12-03-2012 15:28 1877707

подзавис я со списком задач tasks
С компонентами удобнее, их можно прочекать и засветить еще на шаг InitializeWizard
А вот с таксками так не получается. Мне нужно чтобы в зависимости от выбранного на странице компонентов компонента элемент task или не снималась галочка или наоборот снималась.
Простую часть чтобы галочка не снималась я сделал
Код:

procedure InitializeWizard();
.........
WizardForm.TasksList.OnClickCheck := @TasksListClickCheck;
........
procedure TasksListClickCheck(Sender: TObject);
begin
  TasksCheck;
end;

procedure TasksCheck();
var
  Item: Integer;
begin
....
  if ( not IsComponentSelected('LAV\lavreg') ) then begin
    Item := WizardForm.TasksList.Items.IndexOf(ExpandConstant('{cm:Haali}')); if WizardForm.TasksList.ItemIndex = Item then WizardForm.TasksList.Checked[item] := True;
  end;
end;

если по инсталлеру идти последователно то галочка не снимается как и задумано, но если выбрать LAV\lavreg, перейти на task, снять галочку с cm:Haali, потом вернуться на страницу компонентов, снять галочку с LAV\lavreg, перейти на Task - галочка на cm:Haali нет, что неправильно!11! но если ее поставить - она уже не снимается как и задумано.
Как обойти такое? (описал как смог)

Johny777 12-03-2012 15:36 1877713

Цитата:

Цитата by_gangster
поверь мне меньше »

не поверю :sleep:

R.i.m.s.k.y.,
вот так я делаю с кастомными чекбоксами
ты можешь приспособить их к элементам тасклиста и компонетлиста?
procedure make04 (Sender: TObject);
begin
if Component_CheckBox.Checked = false then (или RadioButton)
begin
Task_CheckBox.Checked:= false;
end
else
begin
task_CheckBox.Checked:= true;
end;
end;

by_gangster 12-03-2012 15:38 1877715

Johny777, прости за наглость :unsure: , та как сделать две ссылки?

R.i.m.s.k.y. 12-03-2012 15:47 1877726

Цитата:

Цитата Johny777
вот так я делаю с кастомными чекбоксами »

мне неохота с кастомными чекбоксами заморачиваться, сделано все стандартно
На каком шаге ты это делаешь?

Johny777 12-03-2012 15:50 1877729

by_gangster,
простым дублированием
читать дальше »
Код:

;      Ñêðèïò ñîçäàí ñ ïîìîùüþ
; IS GameScript Generator by South
;  ñïåöèàëüíî äëÿ www.csmania.ru

[Setup]
SourceDir=.
OutputDir=Setup
AppName=1
AppVerName=1
AppVersion=1
AppPublisherURL=http://forum.csmania.ru/
AppSupportURL=http://forum.csmania.ru/
AppUpdatesURL=http://forum.csmania.ru/
DefaultDirName={pf}\1
DefaultGroupName=1
AllowNoIcons=yes
OutputBaseFilename=setup
WindowVisible=no
WindowShowCaption=no
WindowResizable=no
Compression=lzma/normal
DiskSpanning=yes
DiskSliceSize=2100000000
SlicesPerDisk=1



[_Code]
const
  dURL=2;

var
  URLLabel,URLLabelShadow:TLabel;      /// url 1
  URLLabel_2,URLLabelShadow_2:TLabel;    /// url 2


procedure URLLabelClick(Sender: TObject);    /// url 1
var
  ErrorCode:integer;
begin
  ShellExec('open','http://forum.csmania.ru/','','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
end;

procedure URLLabelClick_2(Sender: TObject);    /// url 2
var
  ErrorCode:integer;
begin
  ShellExec('open','http://forum.oszone.net/','','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
end;

procedure URLLabelMouseDown(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
  URLLabel.Top:=URLLabel.Top+dURL;
  URLLabel.Left:=URLLabel.Left+dURL;
  URLLabel.Font.Style:=URLLabel.Font.Style+[fsUnderline];
  URLLabel.Font.Color:=clBlue;
  URLLabelShadow.Visible:=False;
end;

procedure URLLabelMouseUp(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
  URLLabel.Top:=URLLabel.Top-dURL;
  URLLabel.Left:=URLLabel.Left-dURL;
  URLLabel.Font.Style:=URLLabel.Font.Style-[fsUnderline];
  URLLabel.Font.Color:=clMaroon;
  URLLabelShadow.Visible:=True;
end;

  /// url 2
procedure URLLabelMouseDown_2(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
  URLLabel.Top:=URLLabel.Top+dURL;
  URLLabel.Left:=URLLabel.Left+dURL;
  URLLabel.Font.Style:=URLLabel.Font.Style+[fsUnderline];
  URLLabel.Font.Color:=clBlue;
  URLLabelShadow.Visible:=False;
end;

procedure URLLabelMouseUp_2(Sender:TObject;Button:TMouseButton;Shift:TShiftState;X,Y:Integer);
begin
  URLLabel.Top:=URLLabel.Top-dURL;
  URLLabel.Left:=URLLabel.Left-dURL;
  URLLabel.Font.Style:=URLLabel.Font.Style-[fsUnderline];
  URLLabel.Font.Color:=clMaroon;
  URLLabelShadow.Visible:=True;
end;

procedure InitializeWizard;
/// url 1
begin
  URLLabelShadow:=TLabel.Create(WizardForm);
  with URLLabelShadow do begin
    Top:=ScaleY(331);
    Left:=ScaleX(25);
    Caption:='http://forum.csmania.ru/';
    AutoSize:=True;
    Parent:=WizardForm;
    Transparent:=True;
    Font.Color:=$969696;
    Font.Size:=9;
    Font.Style:=Font.Style+[fsBold];
  end;
  URLLabel:=TLabel.Create(WizardForm);
  with URLLabel do begin
    Top:=ScaleY(331)-dURL;
    Left:=ScaleX(25)-dURL;
    Caption:='http://forum.csmania.ru/';
    AutoSize:=True;
    Parent:=WizardForm;
    Cursor:=crHand;
    Transparent:=True;
    Font.Color:=clMaroon;
    Font.Size:=9;
    Font.Style:=Font.Style+[fsBold];
    BringToFront;
    OnClick:=@URLLabelClick;
    OnMouseDown:=@URLLabelMouseDown;
    OnMouseUp:=@URLLabelMouseUp;
  end;
  /// url 2
    URLLabelShadow_2:=TLabel.Create(WizardForm);
  with URLLabelShadow_2 do begin
    Top:=ScaleY(331);
    Left:=ScaleX(200);
    Caption:='http://forum.oszone.net/';
    AutoSize:=True;
    Parent:=WizardForm;
    Transparent:=True;
    Font.Color:=$969696;
    Font.Size:=9;
    Font.Style:=Font.Style+[fsBold];
  end;
  URLLabel_2:=TLabel.Create(WizardForm);
  with URLLabel_2 do begin
    Top:=ScaleY(331)-dURL;
    Left:=ScaleX(200)-dURL;
    Caption:='http://forum.oszone.net/';
    AutoSize:=True;
    Parent:=WizardForm;
    Cursor:=crHand;
    Transparent:=True;
    Font.Color:=clBlue;
    Font.Size:=9;
    Font.Style:=Font.Style+[fsBold];
    BringToFront;
    OnClick:=@URLLabelClick_2;
    OnMouseDown:=@URLLabelMouseDown_2;
    OnMouseUp:=@URLLabelMouseUp_2;
  end;
 
end;


by_gangster 12-03-2012 15:53 1877735

Johny777, спасибо :)

Johny777 12-03-2012 15:57 1877737

Цитата:

Цитата R.i.m.s.k.y.
мне неохота с кастомными чекбоксами заморачиваться, сделано все стандартно»

и не надо
насколько я знаю у компонетов есть номера как [0] или [1]
вот к ним если можешь привязать, что всё заработает
Цитата:

Цитата R.i.m.s.k.y.
На каком шаге ты это делаешь?»

хз
процедуры и функции сверху записаны
конкретно действие выше у меня для на странице компонетов, когда один чекбокс относится только к одному радиобаттону, но думаю не проблема выполнять его для двух страниц.
единственное что у меня записано в InitializeWizard это main_CheckBox.Checked:= false;
могу дать скрипт, если нужно
сам посмотришь

R.i.m.s.k.y. 12-03-2012 16:00 1877742

Johny777, да я пробовал вызывать TaskChek который галки расставляет раньше страницы Tasks - ошибка, хотя с компонентами такое прокатывает
CurPageID=wpSelectTasks тоже не прокатывает

by_gangster 12-03-2012 16:04 1877744

дайте пожалуйста ссылку на форум ну или там где обсуждают bass.dll то есть музыка в инсталяторе

R.i.m.s.k.y. 12-03-2012 16:09 1877748

Johny777, еслибы было так просто, там еще надо и контролировать в системе наличие других компонент (того же хаали чтобы второй раз принудительно не поставить)

но я уже починил

Спасибо за внимание
Код:

procedure TasksCheck();
var
  Item: Integer;
begin
...
  if ( check_for_haali ) then begin
    Item := WizardForm.TasksList.Items.IndexOf(ExpandConstant('{cm:Haali}'));
    WizardForm.TasksList.Checked[item] := True; // надо было вот эту строчку повторить, ее не было
    if WizardForm.TasksList.ItemIndex = Item then WizardForm.TasksList.Checked[item] := True;
  end;
end; //if (noComponentClick = False) then begin
end;


Johny777 12-03-2012 16:11 1877750

R.i.m.s.k.y.,
вот смотри что накопал у себя в примерах
обрати внимание на самый конец
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application


[Components]
Name: text; Description: Язык субтитров; Types: full;
Name: text\rus; Description: Русский; Flags: exclusive;
Name: text\eng; Description: Английский; Flags: exclusive;
Name: voice; Description: Язык озвучки;
Name: voice\rus; Description: Русский; Flags: exclusive;
Name: voice\eng; Description: Английский; Flags: exclusive;

[ code]
var
OldEvent_ComponentsListClickCheck: TNotifyEvent;

procedure ComponentsListClickCheck(Sender: TObject);
begin
If IsComponentSelected('text') then
WizardForm.ComponentsList.ItemEnabled[3]:=False
else
WizardForm.ComponentsList.ItemEnabled[3]:=True;
OldEvent_ComponentsListClickCheck(Sender);
end;

procedure InitializeWizard();
begin
with WizardForm.ComponentsList do
begin
OldEvent_ComponentsListClickCheck := OnClickCheck;
OnClickCheck := @ComponentsListClickCheck;
ItemEnabled[3]:=False;
end;
end;

_____________________продолжение,,,,,,,,,,,,,,,,,,,,,,,,,

[Components]
Name: "GameDiablo2"; Description: Diablo 2; Flags: fixed; Types: full compact custom;

Name: GameLoD; Description: Lord of Destruction; Types: full;

Name: Version; Description: Версия; Flags: fixed; Types: full compact custom;
Name: Version\107; Description: 1.07; Flags: exclusive;
Name: Version\108; Description: 1.08; Flags: exclusive;
Name: Version\109; Description: 1.09; Flags: exclusive; Types: full;

[ code]
var
OldEvent_ComponentsListClickCheck: TNotifyEvent;

procedure ComponentsListClickCheck(Sender: TObject);
begin
If IsComponentSelected('GameLoD') then
WizardForm.ComponentsList.ItemEnabled[3]:=True
else
WizardForm.ComponentsList.ItemEnabled[3]:=False;
OldEvent_ComponentsListClickCheck(Sender);
end;

procedure InitializeWizard();
begin
with WizardForm.ComponentsList do
begin
OldEvent_ComponentsListClickCheck := OnClickCheck;
OnClickCheck := @ComponentsListClickCheck;
ItemEnabled[3]:=True;
end;
end;

,,,,,,,,,,,,,,,,,,,,,,,,,,.................................


procedure ComponentsListClickCheck(Sender: TObject);
begin
If IsComponentSelected('GameLoD') then begin
WizardForm.ComponentsList.ItemEnabled[3]:=True;
WizardForm.ComponentsList.ItemEnabled[4]:=True;
end else begin
WizardForm.ComponentsList.ItemEnabled[3]:=False;
WizardForm.ComponentsList.ItemEnabled[4]:=False;
OldEvent_ComponentsListClickCheck(Sender);
end;
end;


R.i.m.s.k.y. 12-03-2012 16:36 1877765

Johny777, ну у меня так и сделано, только номера не жоские а WizardForm.ComponentsList.Items.IndexOf('Diablo 2')

by_gangster 12-03-2012 17:30 1877786

R.i.m.s.k.y., ты знаешь как этот код можно вписать в мой???
Код:

[_code]
 var
 PageNameLabel, PageDescriptionLabel: TLabel;
 
 procedure InitializeWizard();
 begin
 WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);
 
 PageNameLabel:= TLabel.Create(WizardForm)
 with WizardForm.PageNameLabel do
 PageNameLabel.SetBounds(Left, Top, Width, Height);
 PageNameLabel.Transparent:= True;
 PageNameLabel.Font:= WizardForm.PageNameLabel.Font;
 PageNameLabel.Font.Color:= clWhite;  //цвет надписи
 PageNameLabel.Parent:= WizardForm.MainPanel;
 
 PageDescriptionLabel:= TLabel.Create(WizardForm)
 with WizardForm.PageDescriptionLabel do
 PageDescriptionLabel.SetBounds(Left, Top, Width, Height);
 PageDescriptionLabel.Transparent:= True;
 PageDescriptionLabel.Font:= WizardForm.PageDescriptionLabel.Font;
 PageDescriptionLabel.Font.Color:= clWhite;  //цвет надписи
 PageDescriptionLabel.Parent:= WizardForm.MainPanel;
 
 WizardForm.PageNameLabel.Hide;
 WizardForm.PageDescriptionLabel.Hide;
 end;
 
 procedure CurPageChanged(CurPageID: Integer);
 begin
 PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
 PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;
 end;


R.i.m.s.k.y. 12-03-2012 17:36 1877790

Цитата:

Цитата by_gangster
ты знаешь как этот код можно вписать в мой »

Цитата:

Цитата R.i.m.s.k.y.
я с фриарком, исдоне и формами никак »


by_gangster 12-03-2012 19:10 1877856

кто знает, как вставить это в скрипт??? (проигрывание музыки)
Код:

//************************************************ [Начало - Музыка] ***************************************************//

function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean; external 'BASS_Init@files:BASS.dll stdcall delayload';
function BASS_StreamCreateFile(mem: BOOL; f: PAnsiChar; offset: DWORD; length: DWORD; flags: DWORD): DWORD; external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';
function BASS_Start: Boolean; external 'BASS_Start@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean; external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';
function BASS_ChannelIsActive(handle: DWORD): Integer; external 'BASS_ChannelIsActive@files:BASS.dll stdcall delayload';
function BASS_ChannelPause(handle: DWORD): Boolean; external 'BASS_ChannelPause@files:BASS.dll stdcall delayload';
function BASS_Pause: Boolean; external 'BASS_Pause@files:BASS.dll stdcall delayload';
function BASS_Stop: Boolean; external 'BASS_Stop@files:BASS.dll stdcall delayload';
function BASS_Free: Boolean; external 'BASS_Free@files:BASS.dll stdcall delayload';

procedure MusicButtonClick(hBtn:HWND);
begin
  sndPlaySound(ExpandConstant('{tmp}\Click.wav'), $0001);
  if BtnGetChecked(MusicButton) then BASS_ChannelPause(mp3Handle)
    else if BASS_ChannelIsActive(mp3Handle)=BASS_ACTIVE_PAUSED then BASS_ChannelPlay(mp3Handle, False);
end;

procedure InsertMusic;                             
begin
  ExtractTemporaryFile('MusicButton.png');
  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('Music.mp3');

  MusicButton:=BtnCreate(WizardForm.Handle,ScaleX(717),ScaleY(3),ScaleX(70),ScaleY(52),ExpandConstant('{tmp}\MusicButton.png'),0,True);
  BtnSetEvent(MusicButton,BtnClickEventID,WrapBtnCallback(@MusicButtonClick,1));
  BtnSetEvent(MusicButton,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
  BtnSetVisibility(MusicButton,True);
  BtnSetCursor(MusicButton,LoadCursorFromFile(ExpandConstant('{tmp}\Cursor2.ani')));

  mp3Name:=ExpandConstant('{tmp}\Music.mp3');
  BASS_Init(-1,44100,0,0,0);
  mp3Handle:=BASS_StreamCreateFile(FALSE,PAnsiChar(mp3Name),0,0,BASS_SAMPLE_LOOP);
  BASS_Start;
  BASS_ChannelPlay(mp3Handle,False);
end;

//************************************************ [Конец - Музыка] ***************************************************//


valyok666 12-03-2012 20:55 1877911

by_gangster, Всё до простоты просто))подумай логику включи и поймешь!Программирование это не токо копипастой вставить и всё здесь надо думать)

by_gangster 12-03-2012 21:25 1877931

valyok666, я же только учюсь программированию, так что пока я чайник в этом, и прошу помочь :cool:

Rikill 13-03-2012 12:06 1878218

Это разве программирование?)

Цитата:

Цитата Лександер
Изза тебя, вора, пришлось пойти на эти ограничения. Тебе кстати, никто не разрешал этот скрипт у себя выкладывать. »

Из-за меня тоже... Прошу прощения.

al70 13-03-2012 16:14 1878383

Добрый день. У меня возникла странная ошибка.
После вызова ф-ии из dll перестает работать кнопка "Back". Если в скрипте закоментировать этот вызов - вся навигация между страницами мастера работает правильно. Есть какие-то идеи в чем может быть проблема?

R.i.m.s.k.y. 13-03-2012 16:35 1878399

al70, может unloadDLL не хватает после вызова функции из dll?

rasim933 13-03-2012 22:41 1878674

Здравствуйте программисты! Скажите пожалста, можно ли прописать скрипт, который полсе закрытия установочного файла, откроет какой либо файл (например: *.docx, *.exe, *.rar, *папку, *mp3.)?

R.i.m.s.k.y. 13-03-2012 23:27 1878704

rasim933, в секции Run указываешь файл например: *.docx, *.exe, *.rar, *папку, *mp3. и флаг shellexec

rasim933 13-03-2012 23:31 1878707

Я извиняюсь, но можно подробней??

R.i.m.s.k.y. 13-03-2012 23:58 1878721

rasim933,
Код:

[Run]
Filename: {app}\mp3.mp3; Description: Музычка; Flags: shellexec skipifsilent postinstall nowait
Filename: {app}\docx.docx; Description: Вордик; Flags: shellexec skipifsilent nowait


rasim933 14-03-2012 01:28 1878749

Итак, попробовал как вы сказали, что-то неполучилось.

Прописал вот так:
Код:

[Run]
Filename: "{app}\psxfin.exe"; Description: "{cm:LaunchProgram,Spider-Man 2 - Enter Electro (PS1)}"; Flags: nowait postinstall skipifsilent
Filename: "{app}\docx.docx"; Description: "{cm:LaunchProgram,Документ с информацией о запуске игры.docx}"; Flags: shellexec

Создал файл *.docx, назвал docx.docx.

В конце вот такая ошибка:
Что нетак? Где ошибка?

Johny777 14-03-2012 02:47 1878770

rasim933,
ну
в ошибке написано, что файл найти не может.
Значит путь не верный
{app} это константа директории установки

rasim933 14-03-2012 03:01 1878774

Всмысле через {app} я должен прописать путь к нужному файлу? Или перед вот этим знаком "\" должен прописать путь?

Пример:
Код:

Filename: "{app}C:\User\User\Desctop\Рабочий стол\docx.docx"; Description: "{cm:LaunchProgram,Документ с информацией о запуске игры.docx}"; Flags: shellexec
Извинете за мою тупость, но, со скриптами я неработал. Работал только с "Мастером создания скриптов". ))

Johny777 14-03-2012 04:22 1878783

rasim933,
а где лежит файл?
рядом с установщиком или он вместе с данными твоего приложения копируется в директорию установки?
Цитата:

Цитата rasim933
Filename: "{app}C:\User\User\Desctop\Рабочи »

грубая ошибка
{app}\docx.docx это директория установки (куда бы ты не ставил)
или
{userdesktop}\docx.docx или {commondesktop}\docx.docx -пользовательский или общий рабочий стол
{src}\docx.docx - значит, что файл лежит рядом с setup.exe или {src}\MyOuterFolder\docx.docx значит, что в папке, которая расположена рядом с установщиком
{userdocs} это "мои документы"
плюс в том что полный путь происывать не надо (C:\User\User\Desct...), тк он заменяется константой, которая и есть путь
важно в твоём случае ставить флаг (уже стоит) shellexec, тк файл открывается внешней программой типа ворда

констант много
что конкретно ты хочешь я не знаю
вот тебе справка на русском языке. http://rghost.ru/37012445
Посмотри раздел "Константы" и "секция скриптов ---> Секции [Run]"

rasim933 14-03-2012 15:46 1879109

Я хочу сделать вот так: . Но, при нажатии "завершить", инсталятор пытается открыть "файл c инфорамацией о запуске игры, возможных ошибках....." и выходит вот эта ошибка:

Код:
Код:

[Run]
Filename: "{app}\psxfin.exe"; Description: "{cm:LaunchProgram,Spider-Man 2. Enter Electro (PS1)}"; Flags: nowait postinstall skipifsilent 

Filename: "scr\Текстовые файлы\Справка.docx"; Description: "{cm:LaunchProgram,файл с информацией о запуске игры, о возможных ошибках, о управлении}"; Flags: nowait postinstall skipifsilent

Я ставил флаг "shellexec", но тогда выходит вот это:

R.i.m.s.k.y. 14-03-2012 15:53 1879114

rasim933, значит константы ты не посмотрел
Код:

[Run]
Filename: "{app}\psxfin.exe"; Description: "{cm:LaunchProgram,Spider-Man 2. Enter Electro (PS1)}"; Flags: nowait postinstall skipifsilent 

Filename: "{src}\Текстовые файлы\Справка.docx"; Description: "{cm:LaunchProgram,файл с информацией о запуске игры, о возможных ошибках, о управлении}"; Flags: nowait postinstall skipifsilent


Gnom_aka_Lexander 14-03-2012 15:54 1879115

Цитата:

Цитата rasim933
scr »

Это что за чудо? И вообще, откуда ты знаешь, что у пользователя установлен именно офис, и именно не ниже 2010?А если 2003-й, например? он-же не откроет этот файл.

alert30 14-03-2012 16:24 1879139

rasim933, читайте шапку от НАЧАЛА до КОНЦА (извените за капс, но для тех кто тупо не умет работать со скритпами).

R.i.m.s.k.y. 14-03-2012 16:30 1879143

rasim933, docx файл конвертируй в rtf
а вообще у тебя херовые репаки будут выходить тк ты не думаешь об остальных

Temyraz@fb 14-03-2012 16:44 1879158

доброе время суток. у меня вот какой вопрос: как сделать сообщения не в виде MessageBox-а, а в виде окна при удалении.
хочу чтоб пользователь сам выбирал параметры которые я укажу при удалении.

R.i.m.s.k.y. 14-03-2012 16:46 1879162

Temyraz@fb, страниц 10 назад было, на примере халфы2 был инсталлер и деинсталлер с выбором чего удалять

rasim933 14-03-2012 19:47 1879286

Лександер, я на этим поработаю. Спасибо за идею.
R.i.m.s.k.y.Преконвертирую. Репаки? Я не делаю репаки. Сейчас я делаю игру для своей коллекции.

rasim933 14-03-2012 23:42 1879456

Пределал всё сначала. Написал всё поновому.
Код:

[Run]
Filename: "{app}\psxfin.exe"; Description: "{cm:LaunchProgram,Spider-Man 2. Enter Electro (PS1)}"; Flags: nowait postinstall skipifsilent
Filename: "{src}\TXT\Read Me (for 2003).doc"; Description: "{cm:LaunchProgram,файл с ифой о запуске игры (2003)(PS1)}"; Flags: nowait postinstall skipifsilent
Filename: "{src}\TXT\Read Me (for 2010).doc"; Description: "{cm:LaunchProgram,файл с ифой о запуске игры (2010)(PS1)}"; Flags: nowait postinstall skipifsilent

Теперь вот такая ошибка появляется: Что имеено ме надо переименовать? Вы знаете? Я нет. Помогите ещё раз пожалста.

R.i.m.s.k.y. 14-03-2012 23:51 1879461

rasim933,
попробуй кавыки добавить
Код:

Filename: """{src}\TXT\Read Me (for 2003).doc"""; Description: "{cm:LaunchProgram,файл с ифой о запуске игры (2003)(PS1)}"; Flags: nowait postinstall skipifsilent

rasim933 15-03-2012 00:19 1879478

Вот:

Может прислать вам весь код? Это может помочь?

Вы случайно незнаете, как сделать так, чтоб при повторной установке игры (без её удаления), появлялось сообщение об перночальном удалении старых файлов игры?

Johny777 15-03-2012 01:31 1879509

rasim933,
сотри везде все кавычки
я конечно могу ошибаться, но у меня их нигде нет и всё работает
вот так
Filename: {src}\TXT\Read Me (for 2003).doc; Description: {cm:LaunchProgram,файл с ифой о запуске игры (2003)(PS1)}; Flags: nowait postinstall skipifsilent

fackir 15-03-2012 03:12 1879539

Подскажите пожалуйста, как скрыть информацию о размере файлов на странице SelectComponentsPages там при выборочной установке, автоматически вычисляется размер каждого варианта установки и прописываются размеры, а мне нужно, чтобы то место, где эти размеры пишутся, было чистым?

В документации и тут на этих ветках, ниче подобного ненашел. мне хотябы знать, как это поле обзывается, чтобы его очистить

valyok666 15-03-2012 03:45 1879541

fackir, ShowComponentSizes=no

Temyraz@fb 15-03-2012 08:30 1879587

Цитата:

Цитата R.i.m.s.k.y.
Temyraz@fb, страниц 10 назад было, на примере халфы2 был инсталлер и деинсталлер с выбором чего удалять »

мне нужно чтоб на странице спрашивать пользователя куда сохранять бекап.
и еще вопрос как через inno сделать так чтоб удалить базу и пользователя в postgres? (название базы и имя пользователя известна, пароль запрашивается у пользователя)

R.i.m.s.k.y. 15-03-2012 08:38 1879592

Цитата:

Цитата Temyraz@fb
мне нужно чтоб на странице спрашивать пользователя куда сохранять бекап »

ну вот тут в CurStepChanged и вставляй вопрос, или в список компонентов отдельную галочку
Цитата:

Цитата Temyraz@fb
чтоб удалить базу и пользователя в postgres »

это в форум по postgres (щито это?)

Temyraz@fb 15-03-2012 11:13 1879680

наверное я ослеп или чего та не понимаю.

вот конкретный код
[code]
#
Код:

procedure DeleteBitmaps(ADirName: string);
var
FindRec: TFindRec;
begin if FindFirst(ADirName + '\*.*', FindRec) then
begin try repeat if FindRec.Attributes and FILE_ATTRIBUTE_DIRECTORY <> 0 then begin if (FindRec.Name <> '.') and (FindRec.Name <> '..') then
begin DeleteBitmaps(ADirName + '\' + FindRec.Name); RemoveDir(ADirName + '\' + FindRec.Name);
end;
end else if Pos('.bmp', AnsiLowerCase(FindRec.Name)) > 0 then DeleteFile(ADirName + '\' + FindRec.Name); until not FindNext(FindRec); finally FindClose(FindRec);
end;
end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin if MsgBox('Baskup:' #13#13 'Сделать бекап?', mbConfirmation, MB_YESNO) = idYes then
begin
CopyDir(ExpandConstant('{app}\files'),ExpandConstant('Путь сохранения бекапа'));
CopyDir(ExpandConstant('{app}\license'),ExpandConstant('Путь сохранения бекапа'));
end
begin if MsgBox('Вы хотите удалить все фаилы??', mbConfirmation, MB_YESNO) = IDYES then begin DeleteBitmaps(ExpandConstant('{app}')); end; end; end;

вот как спросить у пользователя куда сохранить бекап?

Johny777 15-03-2012 12:51 1879775

Temyraz@fb,

я так понимаю сохранить нужно это?
CopyDir(ExpandConstant('{app}\files'),ExpandConstant('Путь сохранения бекапа'));
CopyDir(ExpandConstant('{app}\license'),ExpandConstant('Путь сохранения бекапа'));
создаёшь чекбокс на странице выбора компонентов
R.i.m.s.k.y. сказал же через CurStepChanged
вот так оно и будет выглядеть
для бэкапа взял шаг ssInstall, те перед установкой (удалением)
читать дальше »
Код:

var
  BackUp_CheckBox: TNewCheckBox;


function make_backup: Boolean;
 begin
  Result:=BackUp_CheckBox.Checked;
  end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssInstall then
  begin
  if BackUp_CheckBox.Checked then
CopyDir(ExpandConstant('{app}\files'),ExpandConstant('Путь сохранения бекапа'));
CopyDir(ExpandConstant('{app}\license'),ExpandConstant('Путь сохранения бекапа'));
end;


procedure InitializeWizard;
begin
  BackUp_CheckBox := TNewCheckBox.Create(WizardForm);
  with BackUp_CheckBox do
  begin
    Name := 'BackUp_CheckBox';
    Parent := WizardForm.SelectComponentsPage;
    Left := ScaleX(304);
    Top := ScaleY(213);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Caption := 'Сделать бэкап?';
  end;
end;


только это для удаления скрипт. Поэтому вместо {app} используй {src}
путь сохранения потом задашь в коде? Он статичный?

Temyraz@fb 15-03-2012 13:08 1879797

путь сохранения пользователь сам укажет

Johny777 15-03-2012 13:11 1879800

Цитата:

Цитата Temyraz@fb
сам укажет »

можно подробнее?
как это работает?
одного это достаточно?
ExpandConstant('Путь сохранения бекапа'))

Temyraz@fb 15-03-2012 13:15 1879804

Вообще бекап будет делаться в деистоляторе. т.е. когда пользователь начинает удалять программу, у него система будет спрашивать делать бекап? если он отвечает "да" , то система будет спрашивать куда сохранить бекап. система сохранить именно там где указал пользователь

Johny777 15-03-2012 13:17 1879805

Temyraz@fb,
но учти у меня в примере этого нет
там чекбокс отмечается без MsgBox -а
а примеры копирования и не только есть в коллекции скриптов innoultra.ru/downloads/Scripts.rar

Temyraz@fb 15-03-2012 13:42 1879828

да смотрел я эти скрипты, у меня почему та не хочет во время удаления появляться страницы. только сообщения.
а в MsgBox может пользователь выбрать путь сохранения бекапа?

R.i.m.s.k.y. 15-03-2012 13:48 1879833

Цитата:

Цитата Temyraz@fb
MsgBox может пользователь выбрать путь сохранения бекапа? »

нет, надо отдельное окно рисовать
как я не знаю

Temyraz@fb 15-03-2012 13:51 1879838

а у кого можно спросить? реально срочно нужно

R.i.m.s.k.y. 15-03-2012 13:56 1879847

Temyraz@fb, у кого можно спросить подписаны на эту тему
ждите ответа, ждите ответа...

Johny777 15-03-2012 13:58 1879848

Temyraz@fb,
путь можно выбрать через эдит и string, но мне пока далеко до такого, потму что путь нужно получить из TFolderTreeView
а чтобы появлялось окно с выбором директории это нужно создать форму при нажатии на кнопку (такое есть) и в ней TFolderTreeView, как на странице выбора директории установки
попробовать могу, но не факт, что получится. Мне в будущем нужно тоже сохранёнки и достижения пред удалением сохранять, но путь хотел сделать статичным на рабочий стол.
Цитата:

Цитата Temyraz@fb
хочет во время удаления появляться страницы »

есть такой пример создания формы после удаления, если тебе это поможет

читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v.1.2
DefaultDirName={pf}\My Program
DirExistsWarning=no

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

[  Code]
const
  bidDelAll = 1;
  bidSkipAll = 2;
var
  Form: TSetupForm;
  CheckListBox: TNewCheckListBox;
  AllButton, UnAllButton, InvertButton: TButton;
  CancelButton, DelButton: TButton;

  MsgForm: TSetupForm;
  MsgAllButton, MsgSkipAllButton: TButton;
  MsgCancelButton, MsgDelButton: TButton;

  DelAllReadOnly: Boolean;
  SkipAllReadOnly: Boolean;

function Size64(Hi, Lo: integer): Extended;
var
  i: integer;
begin
  Result:= Lo;
  if Lo < 0 then
    Result:= Result + 2147483647 + 2147483647 + 2;
  i:= Hi;
  while i > 0 do
    begin
      Result:= Result + 2147483647 + 2147483647 + 2;
      i:= i - 1;
    end;
end;

procedure FillListBox(const fromDir, fileMask: string; Level: Byte);
var
  FSR, DSR: TFindRec;
  FindResult: Boolean;
  APath: string;
  i: integer;
begin
  APath := AddBackslash(fromDir);
  FindResult := FindFirst(APath + fileMask, FSR);
  try
    while FindResult do
    begin
      if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
        begin
  {files} i:= CheckListBox.AddCheckBox(FSR.Name, FloatToStr(Size64(FSR.SizeHigh, FSR.SizeLow)) + ' byte', Level, True, True, False, True, TStringList.Create);
          TStrings(CheckListBox.ItemObject[i]).Text:= APath + FSR.Name;
        end;
      FindResult := FindNext(FSR);
    end;
    FindResult := FindFirst(APath + '*.*', DSR);
    while FindResult do
    begin
      if ((DSR.Attributes and FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY) and not ((DSR.Name = '.') or (DSR.Name = '..')) then
          begin
      {dir} i:= CheckListBox.AddCheckBox(DSR.Name,'DIR', Level, True, True, False, True, TStringList.Create);
            TStrings(CheckListBox.ItemObject[i]).Text:= APath + DSR.Name;
{Recursion} FillListBox(APath + DSR.Name, fileMask, Level+1);
          end;
      FindResult := FindNext(DSR);
    end;
  finally
    FindClose(FSR);
    FindClose(DSR);
  end;
end;

procedure ButtonOnClick(Sender: TObject);
begin
#if Ver < 83954944
  CheckListBox.Checked[0]:= TButton(Sender).Tag = 0;
#else
  Case TButton(Sender).Tag of
    0 : CheckListBox.CheckItem(0, coCheckWithChildren);
    1 : CheckListBox.CheckItem(0, coUncheck);
  end;
#endif
end;

function HasChildren(Box: TNewCheckListBox; ItemIndex: integer): Boolean;
begin
  if (ItemIndex = Box.Items.Count - 1) or (Box.ItemLevel[ItemIndex+1] <= Box.ItemLevel[ItemIndex])  then
    Result:= False
  else
    Result:= True;
end;

procedure InvertOnClick(Sender: TObject);
var
  i: integer;
begin
  for i:= 1 to CheckListBox.Items.Count - 1 do
    begin
      if Not HasChildren(CheckListBox, i)  then
        CheckListBox.Checked[i]:= Not (CheckListBox.State[i] = cbChecked);
    end;
end;

procedure MsgButtonOnClick(Sender: TObject);
begin
  Case TButton(Sender).Tag of
    bidDelAll : DelAllReadOnly:= True;
    bidSkipAll: SkipAllReadOnly:= True;
  end;
  MsgForm.Close;
end;

function DelMsgBox(FileName: string): Boolean;
var
  MsgLabel: TLabel;
begin
  MsgForm:= CreateCustomForm;
  MsgForm.ClientWidth := ScaleX(400);
  MsgForm.ClientHeight := ScaleY(120);
  MsgForm.Caption := 'Files to delete';
  MsgForm.Center;

  MsgLabel := TLabel.Create(MsgForm);
  MsgLabel.Left := ScaleX(20);
  MsgLabel.Top := ScaleY(20);
  MsgLabel.Caption:= FileName + ' is protected file or directory !' + #10#10#13 +
                    'Do you want to delete the file with READONLY attribute ?';
  MsgLabel.Parent := MsgForm;

  MsgAllButton := TButton.Create(MsgForm);
  MsgAllButton.Parent := MsgForm;
  MsgAllButton.Width := ScaleX(75);
  MsgAllButton.Height := ScaleY(23);
  MsgAllButton.Left := ScaleX(20);
  MsgAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
  MsgAllButton.Caption := 'Delete All';
  MsgAllButton.Tag:= bidDelAll;
  MsgAllButton.OnClick := @MsgButtonOnClick;

  MsgSkipAllButton := TButton.Create(MsgForm);
  MsgSkipAllButton.Parent := MsgForm;
  MsgSkipAllButton.Width := ScaleX(75);
  MsgSkipAllButton.Height := ScaleY(23);
  MsgSkipAllButton.Left := MsgAllButton.Left + MsgAllButton.Width + ScaleX(10);
  MsgSkipAllButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
  MsgSkipAllButton.Caption := 'Skip All';
  MsgSkipAllButton.Tag:= bidSkipAll;
  MsgSkipAllButton.OnClick := @MsgButtonOnClick;

  MsgCancelButton := TButton.Create(MsgForm);
  MsgCancelButton.Parent := MsgForm;
  MsgCancelButton.Width := ScaleX(75);
  MsgCancelButton.Height := ScaleY(23);
  MsgCancelButton.Left := MsgForm.ClientWidth - MsgCancelButton.Width - ScaleX(20);
  MsgCancelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
  MsgCancelButton.Caption := 'Skip';
  MsgCancelButton.ModalResult := mrCancel;

  MsgDelButton := TButton.Create(MsgForm);
  MsgDelButton.Parent := MsgForm;
  MsgDelButton.Width := ScaleX(75);
  MsgDelButton.Height := ScaleY(23);
  MsgDelButton.Left := MsgCancelButton.Left - MsgDelButton.Width - ScaleX(10);
  MsgDelButton.Top := MsgForm.ClientHeight - ScaleY(23 + 10);
  MsgDelButton.Caption := 'Delete';
  MsgDelButton.ModalResult := mrOk;

  MsgForm.ActiveControl:= MsgCancelButton;

  if MsgForm.ShowModal() = mrOk then
    Result:= True
  else
    Result:= False;
end;

procedure DeleteFiles();
var
  SR: TFindRec;
  i: integer;
  str: string;
  ResultCode: Integer;
begin
  DelAllReadOnly:= False;
  SkipAllReadOnly:= False;
  for i:= CheckListBox.Items.Count - 1 downto 0 do
    begin
      if CheckListBox.State[i] = cbChecked then
        begin
          str:= Trim(TStrings(CheckListBox.ItemObject[i]).Text);
          FindFirst(str, SR);
          if ((SR.Attributes and FILE_ATTRIBUTE_READONLY) = FILE_ATTRIBUTE_READONLY) then
            if Not (DelAllReadOnly or SkipAllReadOnly) then
              if DelMsgBox(SR.Name) then
                Exec('attrib', ' -h -s -r ' + '"' + str + '"',
                  '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
            if DelAllReadOnly then
                Exec('attrib', ' -h -s -r ' + '"' + str + '"',
                  '', SW_HIDE, ewWaitUntilTerminated, ResultCode);
          FindClose(SR);
          DeleteFile(str);
          RemoveDir(str);
        end;
    end;
end;

procedure BrowseRemainedFiles();
begin
  Form:= CreateCustomForm;
  Form.ClientWidth := ScaleX(500);
  Form.ClientHeight := ScaleY(400);
  Form.Caption := 'Files to delete';
  Form.Center;

  CheckListBox := TNewCheckListBox.Create(Form);
  CheckListBox.Left:= ScaleX(20);
  CheckListBox.Top:= ScaleY(20);
  CheckListBox.Width:= Form.ClientWidth - ScaleX(20*2);
  CheckListBox.Height:= Form.ClientHeight - ScaleY(23*2 + 20);
  CheckListBox.Offset:= 0;
  CheckListBox.Parent:= Form;

  AllButton := TButton.Create(Form);
  AllButton.Parent := Form;
  AllButton.Width := ScaleX(75);
  AllButton.Height := ScaleY(23);
  AllButton.Left := ScaleX(20);
  AllButton.Top := Form.ClientHeight - ScaleY(23 + 10);
  AllButton.Caption := 'Select All';
  AllButton.Tag:= 0;
  AllButton.OnClick := @ButtonOnClick;

  UnAllButton := TButton.Create(Form);
  UnAllButton.Parent := Form;
  UnAllButton.Width := ScaleX(75);
  UnAllButton.Height := ScaleY(23);
  UnAllButton.Left := AllButton.Left + AllButton.Width + ScaleX(10);
  UnAllButton.Top := Form.ClientHeight - ScaleY(23 + 10);
  UnAllButton.Caption := 'Clear All';
  UnAllButton.Tag:= 1;
  UnAllButton.OnClick := @ButtonOnClick;

  InvertButton := TButton.Create(Form);
  InvertButton.Parent := Form;
  InvertButton.Width := ScaleX(75);
  InvertButton.Height := ScaleY(23);
  InvertButton.Left := UnAllButton.Left + UnAllButton.Width + ScaleX(10);
  InvertButton.Top := Form.ClientHeight - ScaleY(23 + 10);
  InvertButton.Caption := 'Invert';
  InvertButton.OnClick := @InvertOnClick;

  CancelButton := TButton.Create(Form);
  CancelButton.Parent := Form;
  CancelButton.Width := ScaleX(75);
  CancelButton.Height := ScaleY(23);
  CancelButton.Left := Form.ClientWidth - CancelButton.Width - ScaleX(20);
  CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
  CancelButton.Caption := 'Cancel';
  CancelButton.ModalResult := mrCancel;
  CancelButton.Cancel := True;

  DelButton := TButton.Create(Form);
  DelButton.Parent := Form;
  DelButton.Width := ScaleX(75);
  DelButton.Height := ScaleY(23);
  DelButton.Left := CancelButton.Left - DelButton.Width - ScaleX(10);
  DelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
  DelButton.Caption := 'Delete';
  DelButton.ModalResult := mrOk;

  Form.ActiveControl:= CancelButton;

  CheckListBox.AddCheckBox(ExpandConstant('{app}'), '', 0, True, True, False, True, TStringList.Create);
  TStrings(CheckListBox.ItemObject[0]).Text:= ExpandConstant('{app}');
  FillListBox(ExpandConstant('{app}'), '*', 1);

  if Form.ShowModal() = mrOk then  DeleteFiles();
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if DirExists(ExpandConstant('{app}')) and (CurUninstallStep = usPostUninstall) then
    BrowseRemainedFiles();
end;


by_gangster 15-03-2012 14:17 1879872

Цитата:

Цитата by_gangster
кто знает, как вставить это в скрипт??? (проигрывание музыки)
Код:
//************************************************ [Начало - Музыка] ***************************************************//
function BASS_Init(device: Integer; freq, flags: DWORD; win: hwnd; CLSID: Integer): Boolean; external 'BASS_Init@files:BASS.dll stdcall delayload';
function BASS_StreamCreateFile(mem: BOOL; f: PAnsiChar; offset: DWORD; length: DWORD; flags: DWORD): DWORD; external 'BASS_StreamCreateFile@files:BASS.dll stdcall delayload';
function BASS_Start: Boolean; external 'BASS_Start@files:BASS.dll stdcall delayload';
function BASS_ChannelPlay(handle: DWORD; restart: BOOL): Boolean; external 'BASS_ChannelPlay@files:BASS.dll stdcall delayload';
function BASS_ChannelIsActive(handle: DWORD): Integer; external 'BASS_ChannelIsActive@files:BASS.dll stdcall delayload';
function BASS_ChannelPause(handle: DWORD): Boolean; external 'BASS_ChannelPause@files:BASS.dll stdcall delayload';
function BASS_Pause: Boolean; external 'BASS_Pause@files:BASS.dll stdcall delayload';
function BASS_Stop: Boolean; external 'BASS_Stop@files:BASS.dll stdcall delayload';
function BASS_Free: Boolean; external 'BASS_Free@files:BASS.dll stdcall delayload';
procedure MusicButtonClick(hBtn:HWND);
begin
sndPlaySound(ExpandConstant('{tmp}\Click.wav'), $0001);
if BtnGetChecked(MusicButton) then BASS_ChannelPause(mp3Handle)
else if BASS_ChannelIsActive(mp3Handle)=BASS_ACTIVE_PAUSED then BASS_ChannelPlay(mp3Handle, False);
end;
procedure InsertMusic;
begin
ExtractTemporaryFile('MusicButton.png');
ExtractTemporaryFile('BASS.dll');
ExtractTemporaryFile('Music.mp3');
MusicButton:=BtnCreate(WizardForm.Handle,ScaleX(717),ScaleY(3),ScaleX(70),ScaleY(52),ExpandConstant( '{tmp}\MusicButton.png'),0,True);
BtnSetEvent(MusicButton,BtnClickEventID,WrapBtnCallback(@MusicButtonClick,1));
BtnSetEvent(MusicButton,BtnMouseEnterEventID,WrapBtnCallback(@WFBtnEnter,1));
BtnSetVisibility(MusicButton,True);
BtnSetCursor(MusicButton,LoadCursorFromFile(ExpandConstant('{tmp}\Cursor2.ani')));
mp3Name:=ExpandConstant('{tmp}\Music.mp3');
BASS_Init(-1,44100,0,0,0);
mp3Handle:=BASS_StreamCreateFile(FALSE,PAnsiChar(mp3Name),0,0,BASS_SAMPLE_LOOP);
BASS_Start;
BASS_ChannelPlay(mp3Handle,False); »

помогите это в скрипт вставить, пожалуйста

vitl 15-03-2012 14:55 1879911

Пожалуйста, помогите решить задачу.

Имеем код:
Код:


[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={reg:HKLM\SOFTWARE\MyProg\Inform,InstallPath} ; Здесь путь до программной папки
AppVersion=1.1.0.1
UsePreviousAppDir=no
AppendDefaultDirName=no
AllowRootDirectory=yes
DirExistsWarning=no
DisableStartupPrompt=yes
DisableReadyPage=yes
; DisableFinishedPage=yes
DisableDirPage=True
DisableProgramGroupPage=yes
OutputBaseFilename=Setup
Compression=lzma
SolidCompression=no
Uninstallable=false

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

[Files]
Source: {src}\add\*; DestDir: {app}\Serv\Lic\; Flags: external recursesubdirs skipifsourcedoesntexist

[_Code]
function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  s, ResultStr:string;
begin
Result:=True;
If not RegKeyExists(HKLM, 'SOFTWARE\MyProg\Inform')
 then
begin
 MsgBox('Программа не установлена или установлена неверно.' #13#13 'Дальнейшая работа Мастера невозможна.', mbError, mb_Ok);
 Result:=False;
 end
else
    begin
 MsgBox('Программа успешно обнаружена.' #13#13 'Скопируйте дополнения в папку:'+ExpandConstant('{app}')+'\Serv\Lic', mbInformrmation, mb_Ok);
end;
end;

1. Не хочет работать в MsgBox-е ExpandConstant('{app}') . Помогите исправить ошибку.

2. В идеале хотелось бы кое-что усовершенствовать:
вместо последнего простого предложения "скопировать в папку дополнения" в начале проверить, есть ли файлы в папке {src}\add\.
Если эта папка пустая, то предложить (Если "ДА") указать путь до папки с дополнениями или (Если "НЕТ") вывести сообщение (оно в коде уже имеется), т.е. "Скопируйте дополнения в папку {reg:HKLM\SOFTWARE\MyProg\Inform,InstallPath} после установки"

R.i.m.s.k.y. 15-03-2012 14:59 1879924

Цитата:

Цитата vitl
Не хочет работать в MsgBox-е ExpandConstant('{app}') »

и не будет тк переменная {app} становится известной после страницы выбора директории установки

про указать папку выше пример как делать свою форму с выбором папки

vitl 15-03-2012 15:20 1879945

Цитата:

Цитата R.i.m.s.k.y.
и не будет тк переменная {app} становится известной после страницы выбора директории установки »

Хорошо, что дополнить в коде, чтобы {app} определилось?

R.i.m.s.k.y. 15-03-2012 15:27 1879950

vitl, почитать в справке Installation order
по сути: выполнять после страницы wpSelectDir, как вариант проверять на странице wpSelectComponents или повесить на NextButtonClick

rasim933 15-03-2012 17:42 1880079

Стёр везде ковычки. Попробовал прописать полный путь вот так:
Код:

[Run]
Filename: "{app}\psxfin.exe"; Description: "{cm:LaunchProgram,Spider-Man 2. Enter Electro (PS1)}"; Flags: nowait postinstall skipifsilent
Filename: {sd}\Program Files (x86)\Spider-Man 2. Enter Electro (PS1)\text\Read Me (for 2003).doc; Description: {cm:LaunchProgram,файл с инфой о запуске игры (2003)}; Flags: nowait postinstall skipifsilent
Filename: {sd}\Program Files (x86)\Spider-Man 2. Enter Electro (PS1)\text\Read Me (for 2010).doc; Description: {cm:LaunchProgram,файл с инфой о запуске игры (2010)}; Flags: nowait postinstall skipifsilent

Но теперь новая ошибка -> . Может проблема в флагах?


Кто нибудь знает, как сделать так, чтоб при повторной установке игры (без её удаления), появлялось сообщение об перночальном удалении старых файлов игры? Может об этом где-то написано?

Johny777 15-03-2012 18:12 1880104

Цитата:

Цитата rasim933
Может проблема в флагах? »

так точно
для документа ворд не хватает флага
писал тебе раньше
Цитата:

Цитата Johny777
важно в твоём случае ставить флаг (уже стоит) shellexec, тк файл открывается внешней программой типа ворда »

Цитата:

Цитата rasim933
сообщение об перночальном удалении старых файлов игры? »

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

R.i.m.s.k.y. 15-03-2012 18:24 1880116

rasim933, флаг shellexec потерял
написано в шапке - сборник вопросов
Как прогу то будешь определять? Есть ли реперные точки типа значения в реестре или спецфайликов?

rasim933 15-03-2012 18:52 1880139

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

Попробую снова обьяснить: к примеру я запустил установщик игры, установил игру. Игру не удалил, и снова запустил инсалятор той же игры. Мне вышло собщение: Вот так сделать хочу. Сможете подсказать?

R.i.m.s.k.y., нет вроде. Всё что я делаю, это пытаюсь создать установщик который будет правильно распаковывать эмулятор PS1 с игрой внутри. Я думаю, что смогу написать ключи реестра если надо. А к чему такой вопрос?

R.i.m.s.k.y. 15-03-2012 18:54 1880141

rasim933, еще раз - сборник вопросов в шапке
ссылки не кусаются

rasim933 15-03-2012 18:59 1880145

Всмысле вот это: Показать/скрыть: Справка, руководство, примеры:?

Или это: Inno Setup [все вопросы] часть 1?

R.i.m.s.k.y. 15-03-2012 19:05 1880149

rasim933

rasim933 15-03-2012 19:08 1880151

Я непоуму что ты мне хочешь сказать. Обьясни да уже.

rasim933 15-03-2012 19:21 1880158

Там описано как можно запустить игру , какие ошибки могут встречаться и как их исправить, какая раскладка клавиатуры. везде картинки и текст

страница эпилога?

Johny777 15-03-2012 19:25 1880161

rasim933,
на твоём месте я б положил бы эту инфомаци в пролог
[Setup]
InfoBeforeFile=info_before.rtf
поддерживается .rtf или .txt

rasim933 15-03-2012 19:32 1880167

Как мне кажется, придётся ведь ставить rtf - reader чтоб прочесть этот файл? Щяс попробую. А ты сам как переделываешь docx в rtf? И, перелеоываешь ли?

Gnom_aka_Lexander 15-03-2012 19:38 1880171

Цитата:

Цитата rasim933
придётся ведь ставить rtf »

Не придется, он будет показан на странице инсталлятора.
Цитата:

Цитата rasim933
А ты сам как переделываешь docx в rtf »

В ворде - файл-сохранить как-в комбо выбрать rtf-файл

rasim933 15-03-2012 20:00 1880191

Так, с дейнсталятором вроде рабрасля. ТОлько что такое "генерируешь appid (например AppID={{0872DB47-24CB-4C7F-AC4B-E6EFC27BD244})" Это ключ реестра?

Gnom_aka_Lexander 15-03-2012 20:08 1880195

это уникальный идентификатор приложения. если нет оригинального ID, который предоставляет разработчик приложения, то можно его сгенерировать - в инно - инструменты-сгенерировать GUID. но лучше использовать оригинальный.

rasim933 15-03-2012 20:24 1880210

О, спасибо. Сделал, щяс пробую проверить.

R.i.m.s.k.y. 15-03-2012 20:24 1880211

Цитата:

Цитата Johny777
можешь протестировать? »

не я формы не знаю

rasim933
я тебе ужо говорил же, rft глотают все ОС все даже без прог-ридеров

а AppID если не знаешь можно дернуть через регшот, ставишь прогу оригинальным инсталлятором и сморишь через регшот куда что прописывается

rasim933 15-03-2012 20:35 1880222

С rtf проблема, незнаю как у R.i.m.s.k.y., но у мя картинки не показываются, а мне это не нравится. Оригинального инсталятора в природе нет. Я взял образ игры от PS1 запихал в ппку с эмулем. К сожалению я незнаю что ткое регшот.

Я сгенерировал этот AppID, вставил вроде куда нужно, 1 раз неполучилось. Снова пробую.

rasim933 15-03-2012 21:11 1880250

Дефнстолятор наладал

rasim933 16-03-2012 01:03 1880366

Я собрал свою игру. Пришлось отказаться от выбора *.docx файлов. Они сами открываются после окончания установки.

Спасибо большое всем кто мне помогал. Без вас, я бы несправился!


Нашол я где-то вот такой скрипт:
Код:

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

[Dirs]
Name: "{app}"; Attribs: system; AfterInstall: CreateIni();

[Files]
Source: Files\icon.ico; DestDir: {app}

[Codee]
procedure CreateIni();
begin
SaveStringsToFile(ExpandConstant('{app}\Desktop.ini'), ['[.ShellClassInfo]',
'IconFile=%SystemRoot%\system32\SHELL32.dll',
'IconIndex=27'], False)
end;

Он должен заставить распакованную папку поменять свою иконку.

При первом скрипте всё работает нормально, но при мною переланном неработает:
Код:

[Dirs]
Name: "{app}"; Attribs: system; AfterInstall: CreateIni();

[Files]
Source: "C:\Users\User\Desktop\Новая папка\pSX_1_13\icon.ico*"; DestDir: {app}

[Codee]
procedure CreateIni();
begin
SaveStringsToFile(ExpandConstant('{app}\Folder ico.ini'), ['[.ShellClassInfo]',
'IconFile="C:\Users\User\Desktop\Новая папка\pSX_1_13\icon.ico*"',
'IconIndex=27'], True)
end;

Что я нетак сделал?

Johny777 16-03-2012 02:05 1880386

Цитата:

Цитата rasim933
Что я нетак сделал? »

не знаю что там у тебя
вот так у меня работает (сам использую у себя в скрипте).
Может, что то лишнее...
пофиг


[Files]
Source: "combine_icon.ico"; DestDir: {app}; Attribs: hidden system - это значок
Source: "desktop.ini"; DestDir: {app}; Attribs: system hidden - заранее настроенный ини

[Dirs]
Name: "{app}"; Attribs: system; AfterInstall: CreateIni();

[_code]
procedure CreateIni();
begin
SaveStringsToFile(ExpandConstant('{app}\Desktop.ini'), ['[.ShellClassInfo]',
'IconFile=combine_icon.ico',
'IconIndex=0'], False)
end;

в самом файле ини вписано
[.ShellClassInfo]
IconResource=combine_icon.ico
IconIndex=0

rasim933 16-03-2012 02:46 1880394

Попробую. В картинке ошибочно ввел create

[code]
Код:

Var
Text: TNewStaticText;

Procedure InitializeWizard();
begin
Text:=TNewStaticText.Create(WizardForm)
Text.Left:=10
Text.Top:=468
Text.Color:=$dbcdcc
Text.Font.Color:=$ab663d
Text.Caption:='мой текст'
Text.Parent:=WizardForm
end;

Програма ругается: Зачем так-то? Вроде всё верно.


Johny777, я знаю, уже надоел. Но и на твой код тоже ругается:

Код:

[Files]
Source: "icon.ico"; DestDir: {app}; Attribs: hidden system
Source: "desktop.ini"; DestDir: {app}; Attribs: system hidden

[Dirs]
Name: "{app}"; Attribs: system; AfterInstall: CreateIni();

[_code]
procedure CreateIni();
begin
SaveStringsToFile(ExpandConstant('{app}\Desktop.ini'), ['[.ShellClassInfo]',
'IconFile=icon.ico',
'IconIndex=0'], False)
end;


Johny777 16-03-2012 03:15 1880398

[_ code] не равно [code]
_ сотри
и почему у тебя два раза [Files] в скрипте?

Gnom_aka_Lexander 16-03-2012 10:29 1880488

Цитата:

Цитата rasim933
Что я нетак сделал? »

Цитата:

Цитата rasim933
Folder ico.ini »

Вот здесь не так. Система ищет файл Desktop.ini и ей глубоко плевать на твой Folder ico.ini

al1511 16-03-2012 11:59 1880549

всем привет!
Мне нужно из установщика создать архив mpq для варкрафта.
Я решил использовать Stormlib.dll
Для начала хотел создать просто пустой архив, даже это не получилось.
На сайте создателя Stormlib.dll есть описание функции SFileCreateArchive

Вот оно:

bool WINAPI SFileCreateArchive(
const char * szMpqName, // Archive file name
DWORD dwFlags, // Additional flags to specify creation details
DWORD dwMaxFileCount, // Limit for file count
HANDLE * phMPQ // Pointer to result HANDLE
);

А вот мой скрипт:

function SFileCreateArchive(szMpqName:string;dwFlagds:Dword;dwMaxFileCount:Dword):BOOL; external 'SFileCreateArchive@files:StormLib.dll stdcall';

procedure CurStepChanged(CurStep: TSetupStep);
begin

if CurStep = ssInstall then begin
repeat
if not SFileCreateArchive (ExpandConstant('{src}\new.mpq'), 2, 4) then break;
until true;
end;
end;


Ошибок никаких не выдаёт, но и файл не создаётся...
Пожалуйста, если кто разбирается, помогите :-)

Вот ссылка на офф. сайт StormLib.dll:
http://www.zezula.net/en/mpq/stormli...tearchive.html

rasim933 16-03-2012 13:29 1880606

Johny7772 раза написанные [Files] что-то меняют? У меня нескольподобных повторяющихся штук.
Лександерисправлю.

Serega 16-03-2012 17:44 1880812

Лександер, будьте немного сдержаны в высказываниях...

al1511, с данной библиотекой не работал, делаю выводы прочитав по вашей ссылке...
Цитата:

Цитата al1511
А вот мой скрипт:
function SFileCreateArchive( »

Прежде всего, функция должна выглядеть так:
Код:

function SFileCreateArchive(szMpqName: PAnsiChar; dwFlagds: DWORD; dwMaxFileCount: DWORD; var phMPQ: THandle): BOOL; external 'SFileCreateArchive@files:StormLib.dll stdcall';
Цитата:

Цитата al1511
Ошибок никаких не выдаёт »

из кода не видно, где проверка на ошибку? Вы ведь не проверяете if not ... then GetLastError, а так же если всё нормально, то phMPQ должен быть > 0

Stable19 16-03-2012 23:11 1880982

Здравствуйте. Возникла проблема - не удается создать в инсталляторе выбор типов установки. Мне нужно привести их к примерно такому виду:

Чтобы был именно такой вид.
Но после изучения некоторой доп. литературы удалось лишь вот это:

Мне нужно чтобы при выборе, например, установки полной версии устанавливались одни файлы, а при выборе портативной версии - другие.
Так вот, может быть у кого найдется скрипт с подобным содержанием или ссылка на документацию, объясняющая решение данной проблемы? Или может кто-нибудь любезно согласится подсказать его? С Inno работаю почти полгода, но выбор типов установки делаю впервые, поэтому и вызвались проблемы. Спасибо.

андрейка43 16-03-2012 23:26 1880986

Ребят, нужно чтобы во время установки, путь автоматически определялся, т.е. что бы установщик искал нужную папку на компьютере и производил в неё установку. можно как нибудь реализовать?

al1511 17-03-2012 00:25 1881007

андрейка43, можно, если путь к этой "нужной папке" прописан в реестре.

Johny777 17-03-2012 03:13 1881048

Stable19,
вот это в первую очередь посмотри (из примеров InnoUltra)
http://rghost.ru/37063112
и это
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
OutputDir=userdocs:My Program.

[----code]

var
  NewPage: TWizardPage;
  NewRadio1, NewRadio2: TNewRadioButton;

procedure CreatePage();
var
  Header, Button1, Button2: TNewStaticText;
begin
  NewPage := CreateCustomPage(wpWelcome, 'Выбор типа установки', 'Эта программа позволяет выбирать тип установки');

  Header := TNewStaticText.Create(NewPage);
  Header.Parent := NewPage.Surface;
  Header.SetBounds(0, 0, WizardForm.InnerNotebook.Width, ScaleY(50));
  Header.Autosize := False;
  Header.WordWrap := True;
  Header.Caption := 'Эта программа позволяет выбирать тип установки, удобно будет как простым юзерам,  так и очень опытным хакерам, программерам и иже с ними.';

  NewRadio1 := TNewRadioButton.Create(NewPage);
  NewRadio1.Parent := NewPage.Surface;
  NewRadio1.SetBounds(ScaleX(20), ScaleY(60), ScaleX(250), ScaleY(14));
  NewRadio1.Caption := 'Быстрая установка';
  NewRadio1.Checked := True;

  Button1 := TNewStaticText.Create(NewPage);
  Button1.Parent := NewPage.Surface;
  Button1.SetBounds(ScaleX(40), ScaleY(80), WizardForm.InnerNotebook.Width - ScaleX(40), ScaleY(40));
  Button1.Autosize := False;
  Button1.WordWrap := True;
  Button1.Caption := 'Быстрая установка - предназначена для обычных юзеров.';

  NewRadio2 := TNewRadioButton.Create(NewPage);
  NewRadio2.Parent := NewPage.Surface;
  NewRadio2.SetBounds(ScaleX(20), ScaleY(120), ScaleX(250), ScaleY(14));
  NewRadio2.Caption := 'Выборочная установка';

  Button2 := TNewStaticText.Create(NewPage);
  Button2.Parent := NewPage.Surface;
  Button2.SetBounds(ScaleX(40), ScaleY(140), WizardForm.InnerNotebook.Width - ScaleX(40), ScaleY(40));
  Button2.Autosize := False;
  Button2.WordWrap := True;
  Button2.Caption := 'Выборочная установка - Предназначена для очень продвинутых юзеров, а так же тех, кто себя такими считает.';
end;

procedure InitializeWizard();
begin
  CreatePage();
end;

function ShouldSkipPage(PageID: Integer): Boolean;
begin
  if PageID = wpSelectDir then
  begin
    if NewRadio1.Checked then
      Result := True;
  end;
end;


rasim933 17-03-2012 17:01 1881265

Можете подсказать как заставить инсталятор создать ярык нужного файла?

Так:
Код:

Name: "{commondesktop}\Spider-Man 2. Enter Electro (PS1)"; Filename: "{app}\psxfin.exe"; Tasks: desktopicon
?

FX-DENIS 17-03-2012 17:25 1881277

Привет еще раз новому поколению знатоков инно.Так как помощи на мой вопрос не дали,то перечитал все 3 архива форума :drug: около 4тысяч страниц за 3 дня.Конечно ветераны как Serega,A1EXXX,BlackSelf и другие много помогали,писали людям примеры скриптов,но тогда было как,то доброжелательнее всё.И вот внимательно,долго перечитав архивы,я снова попрошу помогите,как сделать чтобы размер текущего файла был мегабайтах например 25.8 МБ ,вопрос я задал в сообщении и код скрипта тут и наглядный скриншотhttp://forum.oszone.net/attachment.p...5&d=1331153224 с обведенной проблемкой.Если не трудно выложете мой скрипт исправленный,буду оооочень благодарен. :sorry:

Serega 17-03-2012 20:36 1881372

Цитата:

Цитата rasim933
Можете подсказать как заставить инсталятор создать ярык нужного файла? »

Почитайте Справку, раздел [Icons]
Цитата:

Цитата FX-DENIS
как сделать чтобы размер текущего файла был мегабайтах например 25.8 МБ »

читать дальше »

Код:

[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: Extended; Signs: Integer): string;
{ Перевод числа в значение Бт/Кб/Мб/Гб/Тб/Пб/Эб (Signs - количество знаков после запятой)}
var
  ABytes: Extended;
  i: Integer;
begin
  i := 0;
  ABytes := Bytes;
  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;

procedure Progress();
var
  size: Integer;
begin
  with WizardForm.ProgressGauge do
    ProgressLabel.Caption := IntToStr((Position-Min)/((Max - Min)/100)) + '%';
  FileSize(ExpandConstant(CurrentFileName), size);
  SizeLabel.Caption := BytesToReadable(size, 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;



Цитата:

Цитата Stable19
не удается создать в инсталляторе выбор типов установки. Мне нужно привести их к примерно такому виду »

Вам необходимо создать свою страницу, в которой вы пропишите типы установки, а при копировании файлов просто проверяете отмечен ли тот или иной тип, с помощью Check

Stable19 17-03-2012 21:11 1881383

rasim933, так будет правильнее:
Код:

Name: "{commondesktop}\Spider-Man 2. Enter Electro (PS1)"; Filename: "{app}\psxfin.exe"; WorkingDir: "{app}"; Tasks: desktopicon
Serega, можно поподробнее?

Photon9 17-03-2012 22:15 1881440

Блин, никак не могу решить проблему с указанием рабочей папки в скрипте, вроде и скрипт правильно написан, но тем не менее строка в свойствах ярлыка всеравно пустая. Подскажите что не так????

читать дальше »
[Icons]
Name: "{group}\Zumas Revenge"; Filename: "{app}\ZumasRevenge.exe"; WorkingDir: "{app}"
Name: "{group}\{cm:UninstallProgram,Zumas Revenge}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Zumas Revenge"; Filename: "{app}\ZumasRevenge.exe"; Tasks: desktopicon

alert30 17-03-2012 22:24 1881448

Photon9, по-моему нету лагов.

Stable19 17-03-2012 22:32 1881456

Photon9, указанием рабочей папки в ярлыке? Если да, то вам нужно добавить WorkingDir: "{app}" в конец каждой строки, т.е. скрипт должен в вашем случае выглядеть примерно так:
Код:

Name: "{group}\Zumas Revenge"; Filename: "{app}\ZumasRevenge.exe"; WorkingDir: "{app}"
Name: "{group}\{cm:UninstallProgram,Zumas Revenge}"; Filename: "{uninstallexe}"; WorkingDir: "{app}"
Name: "{commondesktop}\Zumas Revenge"; Filename: "{app}\ZumasRevenge.exe"; WorkingDir: "{app}"; Tasks: desktopicon

Вторая строка отвечает за ярлык удаления игры и если у вас файл uninst000.exe и uninst000.dat будет содержаться в папке, например, {app}\uninstall то и в WorkingDir должно указано быть {app}\uninstall".

Photon9 17-03-2012 22:42 1881465

Stable19, выручил спасибо, а я все первую строку мучил, перебрал уже н-нное количество вариантов, а оказывается вон оно что. Теперь ярлык вышел как положено, и не приходится в ручную дописывать

FX-DENIS 18-03-2012 14:21 1881745

Вложений: 1
Цитата:

Цитата Serega
как сделать чтобы размер текущего файла был мегабайтах например 25.8 МБ »

Serega оооогромное спасибо мастеру как вы, в скрипте который вы мне написали,пришлось изменить
Код:

Source: F:\Test Drive Unlimited 2\*; DestDir: {app}; AfterInstall: ExtLog() на Progress()  ; Flags: ignoreversion recursesubdirs createallsubdirs
и все заработало,вот только одна мелочь странная,если мелкие файлы ,то их размер пишется правильно например 24.4 кб или 26.8мб,а крупные файлы почему,то 512.000000000БТ :closed-to или это так и должно быть при таком скрипте?Может как,то это исправить можно?Используется библиотека innocallback.dll,может надо другой файл?
Скриншот прикрепил

Spell1999 18-03-2012 14:50 1881761

пацаны я тут видел страницу готовых скриптов и потерял ссылку на неё и немогу найти. скиньте плиз ссылку

alex_13_15 18-03-2012 15:16 1881774

Подскажите как обозначить , что исполняемый файл игры находиться не в самой папке где игра установлена, а находиться в подпапках

Johny777 18-03-2012 15:27 1881775

alex_13_15,
Description: Half-Life 2; Filename: {app}\common\half-life 2\hl2.exe; WorkingDir: {app}\common\half-life 2; Parameters: -steam -game hl2 -appid 220;

?

Spell1999,
в шапке темы оно?

alex_13_15 18-03-2012 19:44 1881906

Как изменить иконку Uninstall.exe

by_gangster 18-03-2012 20:04 1881927

люди помогите сделать две кликабельные ссылки пожалуйста
вот код

Код:

; Installer by Evgeniy Bytaikis
[Setup]
AppName=Sigerous Mod äëÿ COP
AppVerName=Sigerous Mod v2.2
DefaultDirName={pf}\S.T.A.L.K.E.R. - Çîâ Ïðèïÿòè
InfoBeforeFile=embedded\InfoBefore.rtf
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\logotip.bmp
SetupIconFile=embedded\sgm.ico
Compression=zip
OutputDir=.
 
[Languages]
Name: eng; MessagesFile: compiler:Languages\english.isl
Name: rus; MessagesFile: compiler:Languages\Russian.isl

[CustomMessages]
eng.ArcCancel=Îòìåíèòü
eng.ArcBreak=Installation cancelled!
eng.ExtractedInfo=Extracted %1 Mb of %2 Mb
eng.ArcInfo=Archive: %1 of %2
eng.ArcTitle=Extracting FreeArc archive
eng.ArcError=Decompression failed with error code %1
eng.ArcFail=Decompression failed!
eng.AllProgress=Overall extraction progress: %1%%
eng.ArcBroken=Archive %1 is damaged%nor not enough free space.
eng.Extracting=Extracting: %1
eng.taskbar=%1%%, %2 remains
eng.remains=Remaining time: %1
eng.LongTime=at no time
eng.ending=ending
eng.hour= hours
eng.min= mins
eng.sec= secs

rus.ArcCancel=Îòìåíèòü ðàñïàêîâêó
rus.ArcBreak=Óñòàíîâêà ïðåðâàíà!
rus.ExtractedInfo=Ðàñïàêîâàíî %1 Ìá èç %2 Ìá
rus.ArcInfo=Àðõèâ: %1 èç %2
rus.ArcTitle=Ðàñïàêîâêà àðõèâîâ FreeArc
rus.ArcError=Ðàñïàêîâùèê FreeArc âåðíóë êîä îøèáêè: %1
rus.ArcFail=Ðàñïàêîâêà íå çàâåðøåíà!
rus.AllProgress=Îáùèé ïðîãðåññ ðàñïàêîâêè: %1%%
rus.ArcBroken=Âîçìîæíî, àðõèâ %1 ïîâðåæä¸í%nèëè íåäîñòàòî÷íî ìåñòà íà äèñêå íàçíà÷åíèÿ.
rus.Extracting=Ðàñïàêîâûâàåòñÿ: %1
rus.taskbar=%1%%, æäè %2
rus.remains=Îñòàëîñü %1
rus.LongTime=âå÷íî
rus.ending=çàâåðøåíèå
rus.hour= ÷àñîâ
rus.min= ìèí
rus.sec= ñåê

[Files]
Source: *.arc; DestDir: {app}; Flags: dontcopy
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy

[_Code]
{ RedesignWizardFormBegin } // Íå óäàëÿòü ýòó ñòðîêó!
// Íå èçìåíÿòü ýòó ñåêöèþ. Îíà ñîçäàíà àâòîìàòè÷åñêè.
var
  Label1: TLabel;

procedure RedesignWizardForm;
begin
  { Label1 }
  Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Name := 'Label1';
    Parent := WizardForm.SelectDirPage;
    Caption := 'Ðàñïàêóéòå â ïàïêó ñ óñòàíîâëåíîé èãðîé Ñòàëêåð Çîâ Ïðèïÿòè';
    Color := clBtnFace;
    Font.Color := clRed;
    Font.Height := -11;
    Font.Name := 'Tahoma';
    Font.Style := [];
    ParentColor := False;
    ParentFont := False;
    Transparent := False;
    Left := ScaleX(0);
    Top := ScaleY(112);
    Width := ScaleX(328);
    Height := ScaleY(13);
  end;

  with WizardForm.WizardSmallBitmapImage do
  begin
    Left := ScaleX(0);
    Width := ScaleX(495);
  end;

  with WizardForm.PageDescriptionLabel do
  begin
    Left := ScaleX(0);
    Top := ScaleY(58);
  end;

  with WizardForm.PageNameLabel do
  begin
    Width := ScaleX(261);
  end;

  with WizardForm.FinishedLabel do
  begin
    Caption := 'Sigerous Mod äëÿ COP óñòàíîâëåí íà Âàø êîìïüþòåð. Ïðèëîæåíèå ìîæíî çàïóñòèòü ñ ïîìîùüþ ñîîòâåòñòâóþùåãî çíà÷êà.' + #13#10 +
        '' + #13#10 +
        'Íàæìèòå «Çàâåðøèòü», ÷òîáû âûéòè èç ïðîãðàììû óñòàíîâêè.' + #13#10 +
        '';
  end;

{ ReservationBegin }
  // Âû ìîæåòå äîáàâèòü âàø êîä çäåñü.

{ ReservationEnd }
end;
// Íå èçìåíÿòü ýòó ñåêöèþ. Îíà ñîçäàíà àâòîìàòè÷åñêè.
{ RedesignWizardFormEnd } // Íå óäàëÿòü ýòó ñòðîêó!

const
    Archives = '{src}\*.arc';    // óêàæèòå ðàñïîëîæåíèå àðõèâîâ FreeArc; äëÿ âíåøíèõ ôàéëîâ ñòðîêó â [Files] äîáàâëÿòü íåîáÿçàòåëüíî
    totalSize = 2387;            // total uncompressed size of archive data in mb, REQUIRED for correct progress displaying

    PM_REMOVE = 1;
    CP_ACP = 0; CP_UTF8 = 65001;

type
#ifdef UNICODE  ; åñëè ó âàñ îøèáêà íà ýòîé ñòðîêå, òî óñòàíîâèòå ïðåïðîöåññîð èëè èñïðàâüòå ñêðèïò äëÿ âàøåé âåðñèè Inno Setup
    #define A "W"
#else
    #define A "A"  ; òî÷êà âõîäà â SetWindowText, {#A} ìåíÿåòñÿ íà A èëè W â çàâèñèìîñòè îò âåðñèè

#endif
#if Ver < 84018176
    AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and below (äëÿ Inno Setup âåðñèé 5.2.4 è âûøå ýòà ñòðîêà íå íóæíà)
#endif

    TMyMsg = record
        hwnd: HWND;
        message: UINT;
        wParam: Longint;
        lParam: Longint;
        time: DWORD;
        pt: TPoint;
    end;

    TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
    TArc = record Path: string; Size: Extended; end;

var
    ExtractFile: TLabel;
    lblExtractFileName: TLabel;
    btnCancelUnpacking: TButton;
    CancelCode, n, UnPackError, StartInstall: Integer;
    Arcs: array of TArc;
    msgError: string;
    lastMb: Integer;
    baseMb: Integer;
    LastTimerEvent: DWORD;

    MouseLabel,SiteLabel: TLabel; // Êëèêàáåëüíàÿ òåêñòîâàÿ http-ññûëêà â ëåâîì íèæíåì óãëó èíñòàëëåðà //

Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

///////////////// Êëèêàáåëüíàÿ òåêñòîâàÿ http-ññûëêà â ëåâîì íèæíåì óãëó èíñòàëëåðà /////////////////
procedure SiteLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin

ShellExec('open', 'http://vk.com/by_gangster', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;

procedure SiteLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clRed;
end;

procedure SiteLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clblue;
end;

procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clGreen;
end;

procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clblue;
end;
///////////////// Êëèêàáåëüíàÿ òåêñòîâàÿ http-ññûëêà â ëåâîì íèæíåì óãëó èíñòàëëåðà /////////////////

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

// Ïåðåâîä ÷èñëà â ñòðîêó ñ òî÷íîñòüþ 3 çíàêà (%.3n) ñ îêðóãëåíèåì äðîáíîé ÷àñòè, åñëè îíà åñòü
Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do
        SetLength(Result, Length(Result)-1);
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') 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;

// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
    if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
        CancelCode:= -127;
end;

// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
    FSR: TFindRec;
Begin
    if FindFirst(ExpandConstant(dir), FSR) then
        try
            repeat
                // Skip everything but the folders
                if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
                n:= GetArrayLength(Arcs);
                // Expand the folder list
                SetArrayLength(Arcs, n +1);
                Arcs[n].Path:= ExtractFilePath(ExpandConstant(Archives)) + FSR.Name;
                Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
                Result:= Result + Arcs[n].Size;
            until not FindNext(FSR);
        finally
            FindClose(FSR);
        end;
End;

// Converts OEM encoded string into ANSI
// Ïðåîáðàçóåò OEM ñòðîêó â ANSI êîäèðîâêó
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
    nRet : longint;
begin
    SetLength( Result, Length( strSource ) );
    nRet:= OemToChar( strSource, Result );
end;

// Converts ANSI encoded string into UTF-8
// Ïðåîáðàçóåò ñòðîêó èç ANSI â UTF-8 êîäèðîâêó
function AnsiToUtf8( strSource: string ): string;
var
    nRet : integer;
    WideCharBuf: string;
    MultiByteBuf: string;
begin
    strSource:= strSource + chr(0);
    SetLength( WideCharBuf, Length( strSource ) * 2 );
    SetLength( MultiByteBuf, Length( strSource ) * 2 );

    nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
    nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

    Result:= MultiByteBuf;
end;

// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
    h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;

// Converts milliseconds to human-readable time
// Êîíâåðòèðóåò ìèëèñåêóíäû â ÷åëîâåêî-÷èòàåìîå èçîáðàæåíèå âðåìåíè
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail then                          {hh:mm:ss format}
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000              {more than hour} then
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000 then          {1..60 minutes}
        Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
  else Result:= IntToStr(Ticks/1000) +s    {less than one minute}
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
    percents, Remaining: Integer;
    s: String;
begin
    if GetTickCount - LastTimerEvent > 1000 then begin
        // This code will be executed once each 1000 ms (ýòîò êîä áóäåò âûïîëíÿòüñÿ ðàç â 1000 ìèëëèñåêóíä)
        //  ....
        // End of code executed by timer
        LastTimerEvent := LastTimerEvent+1000;
    end;

    if string(what)='filename' then begin
        // Update FileName label
        lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
    end else if (string(what)='written') and (totalSize>0) and (Mb>lastMb) then begin
        // Assign to Mb *total* amount of data extracted to the moment from all archives
        lastMb := Mb;
        Mb := baseMb+Mb;

        // Update progress bar
        WizardForm.ProgressGauge.Position:= Mb;

        // Show how much megabytes/archives were processed up to the moment
        percents:= (Mb*1000) div totalSize;
        s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalSize)]);
        if GetArrayLength(Arcs)>1 then
            s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))]);
        ExtractFile.Caption := s;

        // Calculate and show current percents
        percents:= (Mb*1000) div totalSize;
        s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
        if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalSize - Mb)/Mb)) else Remaining:= 0;
        if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
            s:= s + '.  '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
            SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
        end;
        WizardForm.FileNameLabel.Caption := s
    end;
    AppProcessMessage;
    Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
    allSize: Extended;
    callback: longword;
    FreeMB, TotalMB: Cardinal;
begin
    // Display 'Extracting FreeArc archive'
    lblExtractFileName.Caption:= '';
    lblExtractFileName.Show;
    ExtractFile.caption:= cm('ArcTitle');
    ExtractFile.Show;
    // Show the 'Cancel unpacking' button and set it as default button
    btnCancelUnpacking.Show;
    WizardForm.ActiveControl:= btnCancelUnpacking;
    WizardForm.ProgressGauge.Position:= 0;
    WizardForm.ProgressGauge.Max:= totalSize;
    // Get the size of all archives
    allSize:= FindArcs(Archives);
    // Other initializations
    callback:= WrapFreeArcCallback(@FreeArcCallback,4);  //FreeArcCallback has 4 arguments
    StartInstall:= GetTickCount;    {âðåìÿ íà÷àëà ðàñïàêîâêè}
    LastTimerEvent:= GetTickCount;
    baseMb:= 0

    for n:= 0 to GetArrayLength(Arcs) -1 do
    begin
        lastMb := 0
        CancelCode:= 0;
        AppProcessMessage;
        try
            // Pass the specified arguments to 'unarc.dll'
            Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
            if CancelCode < 0 then Result:= CancelCode;
        except
            Result:= -63;  //    ArcFail
        end;
        baseMb:= baseMb+lastMb

        // Error occured
        if Result <> 0 then
        begin
            msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
            GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
            case Result of
                -1: if FreeMB < 32 {Ìá íà äèñêå} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
                    else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
                -127:  msgError:= cm('ArcBreak');    //Cancel button
                -63:    msgError:= cm('ArcFail');
            end;
//          MsgBox(msgError, mbInformation, MB_OK);    //ñîîáùåíèå ïîêàçûâàåòñÿ íà ñòðàíèöå çàâåðøåíèÿ
            Log(msgError);
            Break;    //ïðåðâàòü öèêë ðàñïàêîâêè
        end;
    end;
    // Hide labels and button

    lblExtractFileName.Hide;
    ExtractFile.Hide;
    btnCancelUnpacking.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
        UnPackError:= UnPack(Archives)
        if UnPackError = 0 then
            SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
        else
        begin
            // Error occured, uninstall it then
            Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);    //îòêàò óñòàíîâêè èç-çà îøèáêè unarc.dll
            SetTaskBarTitle(SetupMessage(msgErrorTitle))
            WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
        end;
    end;
end;

//    ñòàíäàðòíûé ñïîñîá îòêàòà (íå íóæíà CurPageChanged), íî àðõèâû ðàñïàêîâûâàþòñÿ äî èçâëå÷åíèÿ ôàéëîâ èíñòàëëÿòîðà
//    if CurStep = ssInstall then
//      if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if (CurPageID = wpFinished) and (UnPackError <> 0) then
    begin // Extraction was unsuccessful (ðàñïàêîâùèê âåðíóë îøèáêó)
        WizardForm.FinishedLabel.Font.Color:= $0000C0;    // red (êðàñíûé)
        WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
        WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
    end;
End;

procedure InitializeWizard();
begin
  RedesignWizardForm;
    with WizardForm.ProgressGauge do
    begin
        // Create a label to show current FileName being extracted
        lblExtractFileName:= TLabel.Create(WizardForm);
        lblExtractFileName.parent:=WizardForm.InstallingPage;
        lblExtractFileName.autosize:=false;
        lblExtractFileName.Width:= Width;
        lblExtractFileName.top:=Top + ScaleY(35);
        lblExtractFileName.Caption:= '';
        lblExtractFileName.Hide;

        // Create a label to show percentage
        ExtractFile:= TLabel.Create(WizardForm);
        ExtractFile.parent:=WizardForm.InstallingPage;
        ExtractFile.autosize:=false;
        ExtractFile.Width:= Width;
        ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
        ExtractFile.caption:= '';
        ExtractFile.Hide;
    end;

    // Create a 'Cancel unpacking' button and hide it for now.
    btnCancelUnpacking:=TButton.create(WizardForm);
    btnCancelUnpacking.Parent:= WizardForm;
    btnCancelUnpacking.SetBounds(ScaleX(260), WizardForm.cancelbutton.top, ScaleX(140), WizardForm.cancelbutton.Height);
    btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
    btnCancelUnpacking.Caption:= cm('ArcCancel');
    btnCancelUnpacking.Hide;

///////////////// Êëèêàáåëüíàÿ òåêñòîâàÿ http-ññûëêà â ëåâîì íèæíåì óãëó èíñòàëëåðà /////////////////
    MouseLabel:=TLabel.Create(WizardForm);
    MouseLabel.Width:=WizardForm.Width;
    MouseLabel.Height:=WizardForm.Height;
    MouseLabel.Autosize:=False;
    MouseLabel.Transparent:=True;
    MouseLabel.OnMouseMove:=@SiteLabelMouseMove2;
    MouseLabel.Parent:=WizardForm;

    SiteLabel:=TLabel.Create(WizardForm);
    SiteLabel.Left:=10;
    SiteLabel.Top:=330;
    SiteLabel.Cursor:=crHand;
    SiteLabel.Font.Color:=clblue;
    SiteLabel.Caption:='Installer by Evgeniy Bytaikis';
    SiteLabel.OnClick:=@SiteLabelOnClick;
    SiteLabel.OnMouseDown:=@SiteLabelMouseDown;
    SiteLabel.OnMouseUp:=@SiteLabelMouseUp;
    SiteLabel.OnMouseMove:=@SiteLabelMouseMove;
    SiteLabel.Parent:=WizardForm;
///////////////// Êëèêàáåëüíàÿ òåêñòîâàÿ http-ññûëêà â ëåâîì íèæíåì óãëó èíñòàëëåðà /////////////////

end;

 
[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D0030103F06000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167650D53656C656374446972506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED0000F2020106544C6162656C064C6162656C31044C656674020003546F70027005576964746803480106486569676874020D0743617074696F6E146E000000D0A0D0B0D181D0BFD0B0D0BAD183D0B9D182D0B520D0B220D0BFD0B0D0BFD0BAD18320D18120D183D181D182D0B0D0BDD0BED0B2D0BBD0B5D0BDD0BED0B920D0B8D0B3D180D0BED0B920D0A1D182D0B0D0BBD0BAD0B5D18020D097D0BED0B220D09FD180D0B8D0BFD18FD182D0B805436F6C6F720709636C42746E466163650C466F6E742E43686172736574070F44454641554C545F434841525345540A466F6E742E436F6C6F720705636C5265640B466F6E742E48656967687402F509466F6E742E4E616D6506065461686F6D610A466F6E742E5374796C650B000B506172656E74436F6C6F72080A506172656E74466F6E74080B5472616E73706172656E7408000000F110544E65774E6F7465626F6F6B50616765095265616479506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167650E496E7374616C6C696E67506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED00000000F1065450616E656C094D61696E50616E656C00F10C544269746D6170496D6167651657697A617264536D616C6C4269746D6170496D616765044C656674020005576964746803EF010C4578706C696369744C65667402000D4578706C69636974576964746803EF010000F10E544E65775374617469635465787414506167654465736372697074696F6E4C6162656C044C656674020003546F70023A0C4578706C696369744C65667402000B4578706C69636974546F70023A0000F10E544E6577537461746963546578740D506167654E616D654C6162656C0557696474680305010D4578706C69636974576964746803050100000000F110544E65774E6F7465626F6F6B506167650C46696E6973686564506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10E544E6577537461746963546578740D46696E69736865644C6162656C0743617074696F6E142E01000053696765726F7573204D6F6420D0B4D0BBD18F20434F5020D183D181D182D0B0D0BDD0BED0B2D0BBD0B5D0BD20D0BDD0B020D092D0B0D18820D0BAD0BED0BCD0BFD18CD18ED182D0B5D1802E20D09FD180D0B8D0BBD0BED0B6D0B5D0BDD0B8D0B520D0BCD0BED0B6D0BDD0BE20D0B7D0B0D0BFD183D181D182D0B8D182D18C20D18120D0BFD0BED0BCD0BED189D18CD18E20D181D0BED0BED182D0B2D0B5D182D181D182D0B2D183D18ED189D0B5D0B3D0BE20D0B7D0BDD0B0D187D0BAD0B02E0D0A0D0AD09DD0B0D0B6D0BCD0B8D182D0B520C2ABD097D0B0D0B2D0B5D180D188D0B8D182D18CC2BB2C20D187D182D0BED0B1D18B20D0B2D18BD0B9D182D0B820D0B8D0B720D0BFD180D0BED0B3D180D0B0D0BCD0BCD18B20D183D181D182D0B0D0BDD0BED0B2D0BAD0B82E0D0A0000000000


Devils Night 18-03-2012 21:55 1882003

Цитата:

Цитата alex_13_15
Как изменить иконку Uninstall.exe »

Вообще можно так:
читать дальше »
Код:

[Setup]
SetupIconFile=icon.ico

или так:
Код:

[Icons]
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}; IconFilename: icon.ico



Цитата:

Цитата boss911
Devils Night, вы бы уточнили, что это иконка ярлыка от деинсталлятора, а не самого файла »

Ну вообще то я сразу два варианта указал
1 вариант на сколько мне известно.
Код:

[Setup]
SetupIconFile=icon.ico

Иконка для инсталятора, она же идёт для деинсталятора unins000.exe.

Второй вариант
Код:

[Icons]
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}; IconFilename: icon.ico

где путь прописывается к иконке.
Других вариантов не вижу.

Serega 18-03-2012 22:03 1882007

Цитата:

Цитата Stable19
можно поподробнее? »

Даже не знаю, суть вам объяснили, даже дали пример выше... осталось только готовый скрипт написать :)
Простой пример

Код:

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

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

[Files]
Source: compiler:Examples\CodeAutomation.iss; DestDir: {app}; Check: InstallType1; Flags: ignoreversion
Source: compiler:Examples\CodeAutomation2.iss; DestDir: {app}; Check: InstallType2; Flags: ignoreversion


[Code]
var
  ISCustomPage1: TWizardPage;
  Label1: TLabel;
  Label2: TLabel;
  NewRadioButton1: TNewRadioButton;
  NewRadioButton2: TNewRadioButton;

function InstallType1: Boolean;
begin
  Result := NewRadioButton1.Checked;
end;

function InstallType2: Boolean;
begin
  Result := NewRadioButton2.Checked;
end;

procedure Label1Click(Sender: TObject);
begin
  NewRadioButton1.Checked := True;
end;

procedure Label2Click(Sender: TObject);
begin
  NewRadioButton2.Checked := True;
end;

procedure InitializeWizard();
begin
  { Creates custom wizard page }
  ISCustomPage1 := CreateCustomPage(wpWelcome, 'Тип установки', 'Выберите тип установки');

  { Label1 }
  Label1 := TLabel.Create(WizardForm);
  with Label1 do
    begin
      Parent := ISCustomPage1.Surface;
      AutoSize := False;
      Caption := 'Тип №1' + #13#10#13#10 +
                'Здесь пишем всякую муть про тип №1...';
      OnClick := @Label1Click;
      SetBounds(ScaleX(64), ScaleY(45), ScaleX(327), ScaleY(45));
    end;

  { Label2 }
  Label2 := TLabel.Create(WizardForm);
  with Label2 do
    begin
      Parent := ISCustomPage1.Surface;
      AutoSize := False;
      Caption := 'Тип №2' + #13#10#13#10 +
                'Здесь пишем всякую муть про тип №2...';
      OnClick := @Label2Click;
      SetBounds(ScaleX(64), ScaleY(136), ScaleX(327), ScaleY(45));
    end;

  { NewRadioButton1 }
  NewRadioButton1 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton1 do
    begin
      Parent := ISCustomPage1.Surface;
      SetBounds(ScaleX(40), ScaleY(45), ScaleX(17), ScaleY(17));
    end;

  { NewRadioButton2 }
  NewRadioButton2 := TNewRadioButton.Create(WizardForm);
  with NewRadioButton2 do
    begin
      Parent := ISCustomPage1.Surface;
      SetBounds(ScaleX(40), ScaleY(136), ScaleX(17), ScaleY(17));
    end;
end;


Цитата:

Цитата FX-DENIS
вот только одна мелочь странная,если мелкие файлы ,то их размер пишется правильно например 24.4 кб или 26.8мб,а крупные файлы почему,то 512.000000000БТ »

Видимо, что-то не так делаете, я даже не буду ничего спрашивать, скажу лишь одно, покажите скрипт.

FX-DENIS 18-03-2012 23:21 1882080

Цитата:

Цитата Serega
Видимо, что-то не так делаете, я даже не буду ничего спрашивать, скажу лишь одно, покажите скрипт »

читать дальше »
Код:

; Скрипт создан в Inno Setup Script Wizard
#define Components
#define MyAppName "Test Drive Unlimited 2"
#define MyAppVersion "v097 build 5"
#define MyAppPublisher "Eden Games,Atari."
#define MyAppURL "http://www.testdriveunlimited2.com/"
#define MyAppExeName "UpLauncher.exe"

[Setup]
; ПРИМЕЧАНИЕ: Значение AppId является уникальным для каждой программы.
; Не используйте одинаковые значения для разных программ.
; (Для создания уникальных значений используйте Инструменты | Генерация GUID.)
AppId={{24132856-6BC2-47AD-9551-C72EBCFE929B}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\Games\{#MyAppName}
DefaultGroupName=Eden Games
OutputDir=F:\111111111111111_install
WizardStyle=modern
OutputBaseFilename=setup
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
LZMANumBlockThreads=2
LZMAUseSeparateProcess=yes
CompressionThreads=auto
SolidCompression=no
;Разбиение на диски
DiskSpanning=true
SlicesPerDisk=2
;Размер тома в байтах (здесь 1400 мегабайт)
DiskSliceSize=1540200000
ShowLanguageDialog=no
WizardImageBackColor=clBlack
TimeStampsInUTC=no
FlatComponentsList=false
AlwaysShowDirOnReadyPage=true
AlwaysShowGroupOnReadyPage=true
LanguageDetectionMethod=locale
UninstallDisplayIcon={app}\TDU2.ico
UninstallDisplayName=Test_Drive_Unlimited_2_v097_build_5_DEN
RestartIfNeededByRun=no
PrivilegesRequired=none
EnableDirDoesntExistWarning=no
DirExistsWarning=auto
ShowTasksTreeLines=yes
SetupIconFile=C:\Users\Den\Desktop\TDU2.ico
UsePreviousAppDir=false
ShowComponentSizes=yes
UserInfoPage=false
WindowVisible=false
WindowShowCaption=false
WindowResizable=false
WizardImageFile=C:\Users\Den\Desktop\covers_376.bmp
WizardSmallImageFile=C:\Users\Den\Desktop\logo-paul.bmp
UsePreviousGroup=no
UsePreviousSetupType=no
UsePreviousTasks=no
UsePreviousUserInfo=no

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

[LangOptions]
LanguageName=russian
LanguageID=$0409
LanguageCodePage=0
DialogFontName=Arial
DialogFontSize=9
WelcomeFontName=Arial
WelcomeFontSize=16
TitleFontName=Arial
TitleFontSize=29
CopyrightFontName=Arial
CopyrightFontSize=8
RightToLeft=no

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: checkablealone

[Files]
Source: C:\Users\Den\Desktop\innocallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: F:\Test Drive Unlimited 2\*; DestDir: {app}; AfterInstall: Progress() ; Flags: ignoreversion recursesubdirs createallsubdirs
; ВАЖНО: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: {group}\Test Drive Unlimited 2\{#MyAppName}; Filename: {app}\{#MyAppExeName}; IconFilename: {app}\TDU2.ico
Name: {group}\Test Drive Unlimited 2\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon; IconFilename: {app}\TDU2.ico; WorkingDir: {app}; Languages:

[Messages]
BeveledLabel=DEN 2011г.:%nhttp://3den.milivepage.ru/

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

[Registry]
; файл создан программой Converter v.0.1.3: 19 апреля 2011 г., в 10 час. 57 мин. 46 сек.
Root: HKLM; SubKey: SOFTWARE\Atari; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: AudioLib; ValueData: DirectSound; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: GUID; ValueData: ; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: InstallDir; ValueData: {app}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: ExePath; ValueData: {app}\TestDrive2.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: LauncherPat; ValueData: {app}\UpLauncher.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: Language; ValueData: Eng; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: UninstallExePath; ValueData: {{uninstallexe}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: GameProductVersion; ValueData: TDU2 v097; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: GameBuildVersion; ValueData: 5; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: NetworkNatType; ValueData: Strict:UdpBlocked; Flags: uninsdeletevalue uninsdeletekeyifempty
; затраченное время: 4 мсек.

[UninstallDelete]
Type: files; Name: {group}\{#MyAppName}
Type: files; Name: {group}\УДАЛИТЬ ИГРУ
Type: files; Name: {commondesktop}\{#MyAppName}; Tasks: desktopicon

[Code]
var
  ProgressLabel, SizeLabel: TLabel;

function BytesToReadable(Bytes: Extended; Signs: Integer): string;
{ Перевод числа в значение Бт/Кб/Мб/Гб/Тб/Пб/Эб (Signs - количество знаков после запятой)}
var
  ABytes: Extended;
  i: Integer;
begin
  i := 0;
  ABytes := Bytes;
  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;

procedure Progress();
var
  size: Integer;
begin
  with WizardForm.ProgressGauge do
    ProgressLabel.Caption := IntToStr((Position-Min)/((Max - Min)/100)) + '%';
  FileSize(ExpandConstant(CurrentFileName), size);
  SizeLabel.Caption := BytesToReadable(size, 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;


rasim933 18-03-2012 23:28 1882085

Спасибо всем за все предыдущие ответы и советы!

Я перечитал литературу, но несмог найти что ищю.

Скажите пожалста, какой скрипт нужно написать, который непозволит деинсталятору удалить определённую папку (файл) и после окончания деинсталяции чтоб появлялось сообщение: "определённые парки не тронуты.".

boss911 18-03-2012 23:33 1882087

Devils Night, вы бы уточнили, что это иконка ярлыка от деинсталлятора, а не самого файла Uninstall.exe.

alex_13_15, файлу Uninstall.exe задать свою иконку нельзя, разве что поменять ее самостоятельно и компилировать проект уже с этим деинсталлятором и не забыть прописать 'Uninstallable=false'. Не совсем красивый метод, но другого я не знаю.

Serega 19-03-2012 00:04 1882102

FX-DENIS, дайте именно тот скрипт, в котором возникла ваша ошибка, а лучше всего залить архив на файлообменник, для теста. В скрипте, который вы приводите выше, ошибок не вижу.
Цитата:

Цитата rasim933
Я перечитал литературу, но несмог найти что ищю. »

Так вы попытайтесь сформулировать более внятно, что вы собственно хотите.

rasim933 19-03-2012 00:09 1882104

Попробую снова.

Установил игру. Запускаю деинстолятор. Ону даляет все файлы которые находятся в папке с игрой.

Мне нужен скрипт. Который недаст удалить нужную мне папку.

Пример: запусткаю деинстолятор, он удаляет все файлы кроме нужной мне папкии, выскакивает окно с надписью: такая-то папка небыла удалена.

Ivan_009 19-03-2012 00:53 1882113

Как скрыть появление лого на странице установки

FX-DENIS 19-03-2012 04:08 1882159

Вложений: 1
Цитата:

Цитата Serega
дайте именно тот скрипт, в котором возникла ваша ошибка, а лучше всего залить архив на файлообменник, для теста »

скрипт именно тот который вы мне дали,на скриншоте видно наглядно размер файла 512.00000000БТ,а в папке игры файл bigfile_RU_1.big весит 3.05 Гб,может инно не умеет такие большие распознавать?а смысл архив,если вы можете скопировать скрипт в блокнот и поменять на .iss :dont-know для теста и положить в папку Test Drive Unlimited 2 любые огромные файлы и убедиться.Врать мне нет смысла,потому,что это мне же нужно в первую очередь.Я не говорю,что вы мне чем то обязаны или должны ,просто помогите по человечески.Может убрать бт и кб,пусть пишет размеры типа 0.5 мб , 0.4 Гб,может это поможет.
И прикреплю сам скрипт,раз так надо для теста

Gnom_aka_Lexander 19-03-2012 10:27 1882277

Цитата:

Цитата boss911
но другого я не знаю. »

Код:

[Setup]
UninstallIconFile=Icon.ico


Serega 19-03-2012 13:24 1882379

Цитата:

Цитата rasim933
Мне нужен скрипт. Который недаст удалить нужную мне папку. »

Вариаций может быть много...
Простой пример

Код:

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

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion

[Code]
procedure CurStepChanged(CurStep: TSetupStep);
begin
  if CurStep = ssPostInstall then
    CreateDir(ExpandConstant('{app}\data'));
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
  if (CurUninstallStep = usUninstall) and DirExists(ExpandConstant('{app}\data')) then
    if MsgBox('Папка "' + ExpandConstant('{app}\data') + '" содержит ваши сохранения, желаете удалить и её?', mbInformation, MB_YESNO) = IDYES then
      DelTree(ExpandConstant('{app}\data'), True, True, True);
end;


Цитата:

Цитата FX-DENIS
на скриншоте видно наглядно размер файла 512.00000000БТ »

Я вам сказал, что не тот скрипт, именно из-за того, что в конце увидел БТ. а не Бт.
Проблема ваша здесь:
Цитата:

Цитата FX-DENIS
а в папке игры файл bigfile_RU_1.big весит 3.05 Гб »

Цитата:

Цитата из Справки, функция FileSize
...
Only supports file sizes smaller than 2 GB
...

Для определения размера файла более 2ГБ, уже нужно писать свою функцию, чуть позже накидаю.

by_gangster 19-03-2012 15:13 1882445

я хочу прописать в мой скрипт ещё вот этот,чем можно заменить procedure InitializeWizard(); а то меня в скрипте уже есть (при компиляции ругается)
Код:

[_code]
procedure InitializeWizard();
begin
  ExtractTemporaryFile('BASS.dll');
  ExtractTemporaryFile('InnoCallback.dll');
  ExtractTemporaryFile('botva2.dll');
  ExtractTemporaryFile('MusicButton.png');
  ExtractTemporaryFile('Music.mp3');

  BASS_Init(ExpandConstant('{tmp}\Music.mp3')) //Запускаем музыку
  BASS_CreateOnOffButton(ExpandConstant('{tmp}\MusicButton.png'), 20, 320, 36, 36, 4) //Создаем кнопку вкл/выкл
end;

procedure DeinitializeSetup();
begin
  BASS_DeInit; //Освобождаем процесс
  gdipShutdown
end;


Serega 19-03-2012 15:54 1882481

FX-DENIS, скрипт будет выглядеть так:
Пример

Код:

[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: Extended; Signs: Integer): string;
{ Перевод числа в значение Бт/Кб/Мб/Гб/Тб/Пб/Эб (Signs - количество знаков после запятой)}
var
  ABytes: Extended;
  i: Integer;
begin
  i := 0;
  ABytes := Bytes;
  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-Min)/((Max - Min)/100)) + '%';
  SizeLabel.Caption := BytesToReadable(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;


Цитата:

Цитата by_gangster
чем можно заменить procedure InitializeWizard(); а то меня в скрипте уже есть (при компиляции ругается) »

Так объедините эти две процедуры, т.е. всё что написано в procedure InitializeWizard(); после слова begin, просто скопируйте в свою procedure InitializeWizard();

by_gangster 19-03-2012 16:14 1882488

Serega, понятно спасибо

alex_13_15 19-03-2012 17:51 1882557

Как сделать так чтобы файл копировался с заменой без предупреждений, автоматом

R.i.m.s.k.y. 19-03-2012 17:54 1882561

alex_13_15, эээ флаг ignoreversion в секции Files, не?

alex_13_15 19-03-2012 17:55 1882564

у меня при установке выдалось предупреждение что такой файл уже есть и его нельзя заменить,
и три кнопки "повторить" "пропустить" "прервать"

alert30 19-03-2012 17:56 1882565

alex_13_15, значит у Вас какой-то файл поврежден...

alex_13_15 19-03-2012 17:57 1882566

всё нормально я немного в скрипте ошибся

R.i.m.s.k.y. 19-03-2012 18:00 1882569

мой инсталлер втихаря запускает быстротест, на странице лицензии (неважно через CurPagid= или NextButtonClick)
Смысл в том что когда или кликаешь на кнопку Далее или при открытии страницы лицензии инсталлер замерзает пока быстротест не высчитает
Можно как-то "отсрочить" его запуск? Не перед отрисовкой старницы лицензии, а после но до нажатия кнопки Далее там же

Serega 19-03-2012 18:05 1882576

Цитата:

Цитата R.i.m.s.k.y.
Смысл в том что когда или кликаешь на кнопку Далее или при открытии страницы лицензии инсталлер замерзает пока быстротест не высчитает
Можно как-то "отсрочить" его запуск? »

Запускайте свою проверку через таймер, а кнопку Далее делаете кликабельной только после проверки.

El Sanchez 19-03-2012 18:27 1882594

Цитата:

Цитата Serega
FX-DENIS, скрипт будет выглядеть так: »

Serega, перевод размера файла в удобочитаемую форму можно возложить на винду, например:
читать дальше »

Код:

[code]
#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
type
    FILETIME = record
        dwLowDateTime, dwHighDateTime: DWORD;
    end;

    WIN32_FILE_ATTRIBUTE_DATA = record
        dwFileAttributes: Longint;
        ftCreationTime, ftLastAccessTime, ftLastWriteTime: FILETIME;
        nFileSizeHigh, nFileSizeLow: Longint;
    end;

function StrFormatByteSize64(qdw: Currency; var pszBuf: Char; cchBuf: UINT): PAnsiChar; external 'StrFormatByteSize64A@shlwapi.dll stdcall';
function GetFileAttributesEx(lpFileName: String; fInfoLevelId: DWORD; var lpFileInformation: WIN32_FILE_ATTRIBUTE_DATA): BOOL; external 'GetFileAttributesEx{#A}@kernel32.dll stdcall';

function BytesToSize(Bytes: Extended): String;
var
    pszBuf: array [0..15] of Char;
begin
    try
        Result := StrFormatByteSize64(Abs(Bytes div 1E4), pszBuf[0], sizeof(pszBuf));
    except end;
end;

function GetFileSize(Filename: String): Extended;
var
    lpFileInformation: WIN32_FILE_ATTRIBUTE_DATA;
begin
    if FileExists(ExpandConstant(Filename)) then
    begin
        GetFileAttributesEx(ExpandConstant(Filename), $0, lpFileInformation);
        Result := $7FFFFFFF;
        Result := ((lpFileInformation.nFileSizeHigh + integer(lpFileInformation.nFileSizeLow < 0))*Result + lpFileInformation.nFileSizeHigh + integer(lpFileInformation.nFileSizeLow < 0))*2 + lpFileInformation.nFileSizeLow;
    end;
end;

procedure InitializeWizard();
begin
    //хочу знать размер калькулятора
    MsgBox(BytesToSize(GetFileSize('{sys}\calc.exe')), mbInformation, MB_OK);
/end;


R.i.m.s.k.y. 19-03-2012 19:31 1882640

Цитата:

Цитата Serega
Запускайте свою проверку через таймер, а кнопку Далее делаете кликабельной только после проверки. »

можно примерчик? а то я в этом не силен

by_gangster 19-03-2012 19:53 1882650

у меня в конце инсталяции вылетает такая ошибка
http://saveimg.ru/show-image.php?id=...4e8643d612344c

Gnom_aka_Lexander 19-03-2012 20:00 1882654

Цитата:

Цитата by_gangster
вылетает такая ошибка »

Я вас поздравляю. Это все, чем можно вам помоч, исходя из предоставленной информации. Хотя, шестое чувство подсказало мне причину вашей ошибки, но я считаю, что это форум, а не институт экстрасенсов.

alert30 19-03-2012 20:07 1882663

Цитата:

Цитата by_gangster
у меня в конце инсталяции вылетает такая ошибка »

Ну конечно, сколько скриптов и файлов напихал - столько ошибок выпадал.

by_gangster 19-03-2012 20:07 1882665

Лександер, может быть что нибудь в скрипте не так
Код:

; by Evgeniy Bytaikis
#include "botva2.iss"
#include "BASS_Module.iss"

[Setup]
AppName=Sigerous Mod äëÿ COP
AppVerName=Sigerous Mod v2.2
DefaultDirName={pf}\S.T.A.L.K.E.R. - Çîâ Ïðèïÿòè
InfoBeforeFile=embedded\InfoBefore.rtf
WizardImageFile=embedded\WizardImage.bmp
WizardSmallImageFile=embedded\logotip.bmp
SetupIconFile=embedded\sgm.ico
Compression=zip
OutputDir=.

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

[CustomMessages]
eng.ArcCancel=Îòìåíèòü
eng.ArcBreak=Installation cancelled!
eng.ExtractedInfo=Extracted %1 Mb of %2 Mb
eng.ArcInfo=Archive: %1 of %2
eng.ArcTitle=Extracting FreeArc archive
eng.ArcError=Decompression failed with error code %1
eng.ArcFail=Decompression failed!
eng.AllProgress=Overall extraction progress: %1%%
eng.ArcBroken=Archive %1 is damaged%nor not enough free space.
eng.Extracting=Extracting: %1
eng.taskbar=%1%%, %2 remains
eng.remains=Remaining time: %1
eng.LongTime=at no time
eng.ending=ending
eng.hour= hours
eng.min= mins
eng.sec= secs

rus.ArcCancel=Îòìåíèòü ðàñïàêîâêó
rus.ArcBreak=Óñòàíîâêà ïðåðâàíà!
rus.ExtractedInfo=Ðàñïàêîâàíî %1 Ìá èç %2 Ìá
rus.ArcInfo=Àðõèâ: %1 èç %2
rus.ArcTitle=Ðàñïàêîâêà àðõèâîâ FreeArc
rus.ArcError=Ðàñïàêîâùèê FreeArc âåðíóë êîä îøèáêè: %1
rus.ArcFail=Ðàñïàêîâêà íå çàâåðøåíà!
rus.AllProgress=Îáùèé ïðîãðåññ ðàñïàêîâêè: %1%%
rus.ArcBroken=Âîçìîæíî, àðõèâ %1 ïîâðåæä¸í%nèëè íåäîñòàòî÷íî ìåñòà íà äèñêå íàçíà÷åíèÿ.
rus.Extracting=Ðàñïàêîâûâàåòñÿ: %1
rus.taskbar=%1%%, æäè %2
rus.remains=Îñòàëîñü %1
rus.LongTime=âå÷íî
rus.ending=çàâåðøåíèå
rus.hour= ÷àñîâ
rus.min= ìèí
rus.sec= ñåê

[Files]
Source: *.arc; DestDir: {app}; Flags: dontcopy
Source: unarc.dll; DestDir: {tmp}; Flags: dontcopy deleteafterinstall
Source: compiler:InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: BASS_Files\*;  DestDir: {tmp}; Flags: dontcopy
Source: music.mp3;  DestDir: {tmp}; Flags: dontcopy

[UninstallDelete]
Type: filesandordirs; Name: "{app}\gamedata"
Type: files; Name: "{app}\SGM_COP_history.rtf"
Type: files; Name: "{app}\SGM_COP_info.rtf"
Type: files; Name: "{app}\SGM_what_in_v2.2.txt"

[_Code]
{ RedesignWizardFormBegin } // Íå óäàëÿòü ýòó ñòðîêó!
// Íå èçìåíÿòü ýòó ñåêöèþ. Îíà ñîçäàíà àâòîìàòè÷åñêè.
var
  Label1: TLabel;

procedure RedesignWizardForm;
begin
  with WizardForm do
  begin
    AutoScroll := False;
    ClientWidth := ScaleX(496);
  end;

  with WizardForm.CancelButton do
  begin
    Left := ScaleX(409);
  end;

  with WizardForm.NextButton do
  begin
    Left := ScaleX(309);
  end;

  with WizardForm.BackButton do
  begin
    Left := ScaleX(221);
  end;

  { Label1 }
  Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Name := 'Label1';
    Parent := WizardForm.SelectDirPage;
    Caption := 'Ðàñïàêóéòå â ïàïêó ñ óñòàíîâëåíîé èãðîé Ñòàëêåð Çîâ Ïðèïÿòè';
    Color := clBtnFace;
    Font.Color := clRed;
    Font.Height := -11;
    Font.Name := 'Tahoma';
    Font.Style := [];
    ParentColor := False;
    ParentFont := False;
    Transparent := False;
    Left := ScaleX(0);
    Top := ScaleY(112);
    Width := ScaleX(328);
    Height := ScaleY(13);
  end;

  with WizardForm.WizardSmallBitmapImage do
  begin
    Left := ScaleX(0);
    Width := ScaleX(495);
  end;

  with WizardForm.PageDescriptionLabel do
  begin
    Left := ScaleX(0);
    Top := ScaleY(58);
  end;

  with WizardForm.PageNameLabel do
  begin
    Width := ScaleX(261);
  end;

  with WizardForm.FinishedLabel do
  begin
    Caption := 'Sigerous Mod äëÿ COP óñòàíîâëåí íà Âàø êîìïüþòåð. Ïðèëîæåíèå ìîæíî çàïóñòèòü ñ ïîìîùüþ ñîîòâåòñòâóþùåãî çíà÷êà.' + #13#10 +
        '' + #13#10 +
        'Íàæìèòå «Çàâåðøèòü», ÷òîáû âûéòè èç ïðîãðàììû óñòàíîâêè.' + #13#10 +
        '';
  end;

{ ReservationBegin }
  // Âû ìîæåòå äîáàâèòü âàø êîä çäåñü.

{ ReservationEnd }
end;
// Íå èçìåíÿòü ýòó ñåêöèþ. Îíà ñîçäàíà àâòîìàòè÷åñêè.
{ RedesignWizardFormEnd } // Íå óäàëÿòü ýòó ñòðîêó!

const
    Archives = '{src}\*.arc';    // óêàæèòå ðàñïîëîæåíèå àðõèâîâ FreeArc; äëÿ âíåøíèõ ôàéëîâ ñòðîêó â [Files] äîáàâëÿòü íåîáÿçàòåëüíî
    totalSize = 2387;            // total uncompressed size of archive data in mb, REQUIRED for correct progress displaying

    PM_REMOVE = 1;
    CP_ACP = 0; CP_UTF8 = 65001;

type
#ifdef UNICODE  ; åñëè ó âàñ îøèáêà íà ýòîé ñòðîêå, òî óñòàíîâèòå ïðåïðîöåññîð èëè èñïðàâüòå ñêðèïò äëÿ âàøåé âåðñèè Inno Setup
    #define A "W"
#else
    #define A "A"  ; òî÷êà âõîäà â SetWindowText, {#A} ìåíÿåòñÿ íà A èëè W â çàâèñèìîñòè îò âåðñèè

#endif
#if Ver < 84018176
    AnsiString = String; // There is no need for this line in Inno Setup 5.2.4 and below (äëÿ Inno Setup âåðñèé 5.2.4 è âûøå ýòà ñòðîêà íå íóæíà)
#endif

    TMyMsg = record
        hwnd: HWND;
        message: UINT;
        wParam: Longint;
        lParam: Longint;
        time: DWORD;
        pt: TPoint;
    end;

    TFreeArcCallback = function (what: PAnsiChar; int1, int2: Integer; str: PAnsiChar): Integer;
    TArc = record Path: string; Size: Extended; end;

var
    ExtractFile: TLabel;
    lblExtractFileName: TLabel;
    btnCancelUnpacking: TButton;
    CancelCode, n, UnPackError, StartInstall: Integer;
    Arcs: array of TArc;
    msgError: string;
    lastMb: Integer;
    baseMb: Integer;
    LastTimerEvent: DWORD;

    MouseLabel,SiteLabel: TLabel; // Êëèêàáåëüíàÿ òåêñòîâàÿ http-ññûëêà â ëåâîì íèæíåì óãëó èíñòàëëåðà //

Function MultiByteToWideChar(CodePage: UINT; dwFlags: DWORD; lpMultiByteStr: string; cbMultiByte: integer; lpWideCharStr: string; cchWideChar: integer): longint; external 'MultiByteToWideChar@kernel32.dll stdcall';
Function WideCharToMultiByte(CodePage: UINT; dwFlags: DWORD; lpWideCharStr: string; cchWideChar: integer; lpMultiByteStr: string; cbMultiByte: integer; lpDefaultChar: integer; lpUsedDefaultChar: integer): longint; external 'WideCharToMultiByte@kernel32.dll stdcall';

function PeekMessage(var lpMsg: TMyMsg; hWnd: HWND; wMsgFilterMin, wMsgFilterMax, wRemoveMsg: UINT): BOOL; external 'PeekMessageA@user32.dll stdcall';
function TranslateMessage(const lpMsg: TMyMsg): BOOL; external 'TranslateMessage@user32.dll stdcall';
function DispatchMessage(const lpMsg: TMyMsg): Longint; external 'DispatchMessageA@user32.dll stdcall';

Function OemToChar(lpszSrc, lpszDst: AnsiString): longint; external 'OemToCharA@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32 stdcall delayload';
function SetWindowText(hWnd: Longint; lpString: String): Longint; external 'SetWindowText{#A}@user32 stdcall delayload';

function GetTickCount: DWord; external 'GetTickCount@kernel32';
function WrapFreeArcCallback (callback: TFreeArcCallback; paramcount: integer):longword; external 'wrapcallback@files:innocallback.dll stdcall';
function FreeArcExtract (callback: longword; cmd1,cmd2,cmd3,cmd4,cmd5,cmd6,cmd7,cmd8,cmd9,cmd10: PAnsiChar): integer; external 'FreeArcExtract@files:unarc.dll cdecl';

///////////////// Êëèêàáåëüíàÿ òåêñòîâàÿ http-ññûëêà â ëåâîì íèæíåì óãëó èíñòàëëåðà /////////////////
procedure SiteLabelOnClick(Sender: TObject);
var
ErrorCode: Integer;
begin
ShellExec('open', 'http://vk.com/by_gangster', '', '', SW_SHOWNORMAL, ewNoWait, ErrorCode);
end;

procedure SiteLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clRed;
end;

procedure SiteLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clblue;
end;

procedure SiteLabelMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clGreen;
end;

procedure SiteLabelMouseMove2(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
SiteLabel.Font.Color:=clblue;
end;
///////////////// Êëèêàáåëüíàÿ òåêñòîâàÿ http-ññûëêà â ëåâîì íèæíåì óãëó èíñòàëëåðà /////////////////

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

// Ïåðåâîä ÷èñëà â ñòðîêó ñ òî÷íîñòüþ 3 çíàêà (%.3n) ñ îêðóãëåíèåì äðîáíîé ÷àñòè, åñëè îíà åñòü
Function NumToStr(Float: Extended): String;
Begin
    Result:= Format('%.3n', [Float]); StringChange(Result, ',', '.');
    while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Length(Result) > 1) do
        SetLength(Result, Length(Result)-1);
End;

function cm(Message: String): String; Begin Result:= ExpandConstant('{cm:'+ Message +'}') 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;

// OnClick event function for btnCancel
procedure btnCancelUnpackingOnClick(Sender: TObject);
begin
    if MsgBox( SetupMessage( msgExitSetupMessage ), mbInformation, MB_YESNO ) = IDYES then
        CancelCode:= -127;
end;

// Scans the specified folders for archives and add them to list
function FindArcs(dir: string): Extended;
var
    FSR: TFindRec;
Begin
    if FindFirst(ExpandConstant(dir), FSR) then
        try
            repeat
                // Skip everything but the folders
                if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY > 0 then CONTINUE;
                n:= GetArrayLength(Arcs);
                // Expand the folder list
                SetArrayLength(Arcs, n +1);
                Arcs[n].Path:= ExtractFilePath(ExpandConstant(Archives)) + FSR.Name;
                Arcs[n].Size:= Size64(FSR.SizeHigh, FSR.SizeLow);
                Result:= Result + Arcs[n].Size;
            until not FindNext(FSR);
        finally
            FindClose(FSR);
        end;
End;

// Converts OEM encoded string into ANSI
// Ïðåîáðàçóåò OEM ñòðîêó â ANSI êîäèðîâêó
function OemToAnsiStr( strSource: AnsiString): AnsiString;
var
    nRet : longint;
begin
    SetLength( Result, Length( strSource ) );
    nRet:= OemToChar( strSource, Result );
end;

// Converts ANSI encoded string into UTF-8
// Ïðåîáðàçóåò ñòðîêó èç ANSI â UTF-8 êîäèðîâêó
function AnsiToUtf8( strSource: string ): string;
var
    nRet : integer;
    WideCharBuf: string;
    MultiByteBuf: string;
begin
    strSource:= strSource + chr(0);
    SetLength( WideCharBuf, Length( strSource ) * 2 );
    SetLength( MultiByteBuf, Length( strSource ) * 2 );

    nRet:= MultiByteToWideChar( CP_ACP, 0, strSource, -1, WideCharBuf, Length(WideCharBuf) );
    nRet:= WideCharToMultiByte( CP_UTF8, 0, WideCharBuf, -1, MultiByteBuf, Length(MultiByteBuf), 0, 0);

    Result:= MultiByteBuf;
end;

// Sets the TaskBar title
Procedure SetTaskBarTitle(Title: String); var h: Integer;
Begin
    h:= GetWindowLong(MainForm.Handle, -8); if h <> 0 then SetWindowText(h, Title);
End;

// Converts milliseconds to human-readable time
// Êîíâåðòèðóåò ìèëèñåêóíäû â ÷åëîâåêî-÷èòàåìîå èçîáðàæåíèå âðåìåíè
Function TicksToTime(Ticks: DWord; h,m,s: String; detail: Boolean): String;
Begin
    if detail then                          {hh:mm:ss format}
        Result:= PADZ(IntToStr(Ticks/3600000), 2) +':'+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +':'+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2)
    else if Ticks/3600 >= 1000              {more than hour} then
        Result:= IntToStr(Ticks/3600000) +h+' '+ PADZ(IntToStr((Ticks/1000 - Ticks/1000/3600*3600)/60), 2) +m
    else if Ticks/60 >= 1000 then          {1..60 minutes}
        Result:= IntToStr(Ticks/60000) +m+' '+ PADZ(IntToStr(Ticks/1000 - Ticks/1000/60*60), 2) +s
  else Result:= IntToStr(Ticks/1000) +s    {less than one minute}
End;

// The main callback function for unpacking FreeArc archives
function FreeArcCallback (what: PAnsiChar; Mb, sizeArc: Integer; str: PAnsiChar): Integer;
var
    percents, Remaining: Integer;
    s: String;
begin
    if GetTickCount - LastTimerEvent > 1000 then begin
        // This code will be executed once each 1000 ms (ýòîò êîä áóäåò âûïîëíÿòüñÿ ðàç â 1000 ìèëëèñåêóíä)
        //  ....
        // End of code executed by timer
        LastTimerEvent := LastTimerEvent+1000;
    end;

    if string(what)='filename' then begin
        // Update FileName label
        lblExtractFileName.Caption:= FmtMessage( cm( 'Extracting' ), [OemToAnsiStr( str )] )
    end else if (string(what)='written') and (totalSize>0) and (Mb>lastMb) then begin
        // Assign to Mb *total* amount of data extracted to the moment from all archives
        lastMb := Mb;
        Mb := baseMb+Mb;

        // Update progress bar
        WizardForm.ProgressGauge.Position:= Mb;

        // Show how much megabytes/archives were processed up to the moment
        percents:= (Mb*1000) div totalSize;
        s := FmtMessage(cm('ExtractedInfo'), [IntToStr(Mb), IntToStr(totalSize)]);
        if GetArrayLength(Arcs)>1 then
            s := s + '. '+FmtMessage(cm('ArcInfo'), [IntToStr(n+1), IntToStr(GetArrayLength(Arcs))]);
        ExtractFile.Caption := s;

        // Calculate and show current percents
        percents:= (Mb*1000) div totalSize;
        s:= FmtMessage(cm('AllProgress'), [Format('%.1n', [Abs(percents/10)])]);
        if Mb > 0 then Remaining:= trunc((GetTickCount - StartInstall) * Abs((totalSize - Mb)/Mb)) else Remaining:= 0;
        if Remaining = 0 then SetTaskBarTitle(cm('ending')) else begin
            s:= s + '.  '+FmtMessage(cm('remains'), [TicksToTime(Remaining, cm('hour'), cm('min'), cm('sec'), false)])
            SetTaskBarTitle(FmtMessage(cm('taskbar'), [IntToStr(percents/10), TicksToTime(Remaining, 'h', 'm', 's', false)]))
        end;
        WizardForm.FileNameLabel.Caption := s
    end;
    AppProcessMessage;
    Result:= CancelCode;
end;

// Extracts all found archives
function UnPack(Archives: string): Integer;
var
    allSize: Extended;
    callback: longword;
    FreeMB, TotalMB: Cardinal;
begin
    // Display 'Extracting FreeArc archive'
    lblExtractFileName.Caption:= '';
    lblExtractFileName.Show;
    ExtractFile.caption:= cm('ArcTitle');
    ExtractFile.Show;
    // Show the 'Cancel unpacking' button and set it as default button
    btnCancelUnpacking.Show;
    WizardForm.ActiveControl:= btnCancelUnpacking;
    WizardForm.ProgressGauge.Position:= 0;
    WizardForm.ProgressGauge.Max:= totalSize;
    // Get the size of all archives
    allSize:= FindArcs(Archives);
    // Other initializations
    callback:= WrapFreeArcCallback(@FreeArcCallback,4);  //FreeArcCallback has 4 arguments
    StartInstall:= GetTickCount;    {âðåìÿ íà÷àëà ðàñïàêîâêè}
    LastTimerEvent:= GetTickCount;
    baseMb:= 0

    for n:= 0 to GetArrayLength(Arcs) -1 do
    begin
        lastMb := 0
        CancelCode:= 0;
        AppProcessMessage;
        try
            // Pass the specified arguments to 'unarc.dll'
            Result:= FreeArcExtract (callback, 'x', '-o+', '-dp' + AnsiToUtf8( ExpandConstant('{app}') ), '--', AnsiToUtf8(Arcs[n].Path), '', '', '', '', '');
            if CancelCode < 0 then Result:= CancelCode;
        except
            Result:= -63;  //    ArcFail
        end;
        baseMb:= baseMb+lastMb

        // Error occured
        if Result <> 0 then
        begin
            msgError:= FmtMessage(cm('ArcError'), [IntToStr(Result)]);
            GetSpaceOnDisk(ExtractFileDrive(ExpandConstant('{app}')), True, FreeMB, TotalMB);
            case Result of
                -1: if FreeMB < 32 {Ìá íà äèñêå} then msgError:= SetupMessage(msgDiskSpaceWarningTitle)
                    else msgError:= msgError + #13#10 + FmtMessage(cm('ArcBroken'), [ExtractFileName(Arcs[n].Path)]);
                -127:  msgError:= cm('ArcBreak');    //Cancel button
                -63:    msgError:= cm('ArcFail');
            end;
//          MsgBox(msgError, mbInformation, MB_OK);    //ñîîáùåíèå ïîêàçûâàåòñÿ íà ñòðàíèöå çàâåðøåíèÿ
            Log(msgError);
            Break;    //ïðåðâàòü öèêë ðàñïàêîâêè
        end;
    end;
    // Hide labels and button

    lblExtractFileName.Hide;
    ExtractFile.Hide;
    btnCancelUnpacking.Hide;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
        UnPackError:= UnPack(Archives)
        if UnPackError = 0 then
            SetTaskBarTitle(SetupMessage(msgSetupAppTitle))
        else
        begin
            // Error occured, uninstall it then
            Exec(ExpandConstant('{uninstallexe}'), '/SILENT','', sw_Hide, ewWaitUntilTerminated, n);    //îòêàò óñòàíîâêè èç-çà îøèáêè unarc.dll
            SetTaskBarTitle(SetupMessage(msgErrorTitle))
            WizardForm.Caption:= SetupMessage(msgErrorTitle) +' - '+ cm('ArcBreak')
        end;
    end;
end;

//    ñòàíäàðòíûé ñïîñîá îòêàòà (íå íóæíà CurPageChanged), íî àðõèâû ðàñïàêîâûâàþòñÿ äî èçâëå÷åíèÿ ôàéëîâ èíñòàëëÿòîðà
//    if CurStep = ssInstall then
//      if UnPack(Archives) <> 0 then Abort;

Procedure CurPageChanged(CurPageID: Integer);
Begin
    if (CurPageID = wpFinished) and (UnPackError <> 0) then
    begin // Extraction was unsuccessful (ðàñïàêîâùèê âåðíóë îøèáêó)
        WizardForm.FinishedLabel.Font.Color:= $0000C0;    // red (êðàñíûé)
        WizardForm.FinishedLabel.Height:= WizardForm.FinishedLabel.Height * 2;
        WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) + #13#10#13#10 + msgError;
    end;
end;
procedure InitializeWizard();
begin
  RedesignWizardForm;
    with WizardForm.ProgressGauge do
    begin

        // Create a label to show current FileName being extracted
        lblExtractFileName:= TLabel.Create(WizardForm);
        lblExtractFileName.parent:=WizardForm.InstallingPage;
        lblExtractFileName.autosize:=false;
        lblExtractFileName.Width:= Width;
        lblExtractFileName.top:=Top + ScaleY(35);
        lblExtractFileName.Caption:= '';
        lblExtractFileName.Hide;

        // Create a label to show percentage
        ExtractFile:= TLabel.Create(WizardForm);
        ExtractFile.parent:=WizardForm.InstallingPage;
        ExtractFile.autosize:=false;
        ExtractFile.Width:= Width;
        ExtractFile.top:=lblExtractFileName.Top + ScaleY(16);
        ExtractFile.caption:= '';
        ExtractFile.Hide;
        /////Ìóçûêà/////
        ExtractTemporaryFile('BASS.dll');
        ExtractTemporaryFile('Music.mp3');
        BASS_Init(ExpandConstant('{tmp}\Music.mp3')) //Ïðîñòî çàïóñêàåì ìóçûêó
        //////Êîíåö ìóçûêà/////
        end;
       
    // Create a 'Cancel unpacking' button and hide it for now.
    btnCancelUnpacking:=TButton.create(WizardForm);
    btnCancelUnpacking.Parent:= WizardForm;
    btnCancelUnpacking.SetBounds(ScaleX(260), WizardForm.cancelbutton.top, ScaleX(140), WizardForm.cancelbutton.Height);
    btnCancelUnpacking.OnClick:= @btnCancelUnpackingOnClick;
    btnCancelUnpacking.Caption:= cm('ArcCancel');
    btnCancelUnpacking.Hide;

///////////////// Êëèêàáåëüíàÿ òåêñòîâàÿ http-ññûëêà â ëåâîì íèæíåì óãëó èíñòàëëåðà /////////////////
    MouseLabel:=TLabel.Create(WizardForm);
    MouseLabel.Width:=WizardForm.Width;
    MouseLabel.Height:=WizardForm.Height;
    MouseLabel.Autosize:=False;
    MouseLabel.Transparent:=True;
    MouseLabel.OnMouseMove:=@SiteLabelMouseMove2;
    MouseLabel.Parent:=WizardForm;

    SiteLabel:=TLabel.Create(WizardForm);
    SiteLabel.Left:=10;
    SiteLabel.Top:=330;
    SiteLabel.Cursor:=crHand;
    SiteLabel.Font.Color:=clblue;
    SiteLabel.Caption:='Installer by Evgeniy Bytaikis';
    SiteLabel.OnClick:=@SiteLabelOnClick;
    SiteLabel.OnMouseDown:=@SiteLabelMouseDown;
    SiteLabel.OnMouseUp:=@SiteLabelMouseUp;
    SiteLabel.OnMouseMove:=@SiteLabelMouseMove;
    SiteLabel.Parent:=WizardForm;
///////////////// Êëèêàáåëüíàÿ òåêñòîâàÿ http-ññûëêà â ëåâîì íèæíåì óãëó èíñòàëëåðà /////////////////

end;
//////Ìóçûêà/////////
procedure DeinitializeSetup();
begin
  BASS_DeInit;
end;
/////Êîíåö ìóçûêà//////

[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D003010D406000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F0010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680300020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10A544E6577427574746F6E0C43616E63656C427574746F6E044C6566740399010C4578706C696369744C6566740399010000F10A544E6577427574746F6E0A4E657874427574746F6E044C6566740335010C4578706C696369744C6566740335010000F10A544E6577427574746F6E0A4261636B427574746F6E044C65667403DD000C4578706C696369744C65667403DD000000F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F746


Gnom_aka_Lexander 19-03-2012 20:08 1882666

Цитата:

Цитата R.i.m.s.k.y.
можно примерчик? а то я в этом не силен »

Както так (для расширенной версии):

читать дальше »
Код:

var
  Timer1: TTimer;

procedure Timer1Timer(Sender: TObject);
begin
  // тут твоя проверка
  //после того, как она прошла, выключаем таймер:
  Timer1.Enabled := False;
end;

procedure InitializeWizard();
begin
  Timer1 := TTimer.Create(WizardForm);
  with Timer1 do
  begin
    Interval := 100;
    OnTimer := @Timer1Timer;
    Enabled := False;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then Timer1.Enabled := True;
end;


by_gangster 19-03-2012 20:09 1882667

всё проблема решена, если кому то интересно из за чего выскочила эта табличка то объясню (если у кого то будет такая же проблема)

Stable19 19-03-2012 21:02 1882713

Serega, огромное спасибо, именно этот код мне и требовался. Последний вопрос: как привязать к каждой кнопке установку той или иной папки? Я так понял, в секции [Files] нужно пометить нужную директорию?

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

Serega 19-03-2012 22:02 1882749

Stable19, для проверок устанавливать, либо писать в реестр, используйте Check:... Внимательно посмотрите скрипт, я думаю суть понятна.

R.i.m.s.k.y. 19-03-2012 22:09 1882761

Serega, я думаю Stable19 поможет Component/task ;)

FX-DENIS 19-03-2012 23:24 1882843

Цитата:

Цитата Serega
FX-DENIS, скрипт будет выглядеть так: »

Serega вставил ваш скрипт,точнее секцию код и всё также после компиляции.При установке игры ,так же пишет размер файла 512.00000000Бт,может вы перепутали функцию?

Serega 19-03-2012 23:50 1882864

Цитата:

Цитата FX-DENIS
При установке игры ,так же пишет размер файла 512.00000000Бт,может вы перепутали функцию? »

Простой пример, проверка, запишите в конце вашего скрипта:
Код:

function InitializeSetup(): Boolean;
begin
  MsgBox(BytesToReadable(GetFileSize('полный путь до вашего архива на диске'), 1), mbInformation, MB_OK);
end;

У меня архив размером в 21,4 ГБ определяется правильно.

Spell1999 20-03-2012 00:10 1882876

Администрация плиз перезалейте файл "Inno Setup Form Designer " а то ссылка нерабочая и рабной сайт недоступен, а прога очень нужна, или скиньте плиз ссылку где можно скачать. оч нуно

Johny777 20-03-2012 00:33 1882892

Spell1999,
дизайнер - часть расширенной версии (в шапке), а тот дизайнер в купе с оф. сайтом давно загнулись

Spell1999 20-03-2012 00:36 1882894

тоесть всё ппц програмке? мож у каво есть скиньте плиз

Johny777 20-03-2012 00:41 1882902

Цитата:

Цитата Spell1999
мож у каво есть скиньте плиз »

смешно...
Нафиг он тебе? Говорю же есть в расширенной версии, как её часть, которая лучше стандартной по функционалу
или ты археолог?

FX-DENIS 20-03-2012 05:05 1882966

Вложений: 1
Цитата:

Цитата Serega
Простой пример, проверка, запишите в конце вашего скрипта: »

дописал
Код:

function InitializeSetup(): Boolean; begin  MsgBox(BytesToReadable(GetFileSize('Test Drive Unlimited 2\bigfile_RU_1.big'), 1), mbInformation, MB_OK); end;
то ли я ... то ли лыжи не едут :o появляется окошко,нажимаеш ок и нечего не происходит,никакой установки игры.Добавил в вами исправленый скрипт ,и еще вопросик когда пишите кусочек или весь скрипт напишите ,что должно быть в [Files] AfterInstall: ???????;,а то я там пробую Progress() или ExtLog() или это не влияет на отображение процентов и размера файлов.

R.i.m.s.k.y. 20-03-2012 08:06 1883010

FX-DENIS,
Код:

function InitializeSetup(): Boolean;
begin 
MsgBox(BytesToReadable(GetFileSize('Test Drive Unlimited 2\bigfile_RU_1.big'), 1), mbInformation, MB_OK);
Result:=True;
end;


FX-DENIS 20-03-2012 12:13 1883143

R.i.m.s.k.y., спасибо,но так же сначала появляется окошко 0.0000000бт,затем дальше происходит установка игры ,и под прогресс шкалой,так же размер файла 512.000000000бт :not-me:

R.i.m.s.k.y. 20-03-2012 12:24 1883154

FX-DENIS, ну про нули я уже не подскажу...

FX-DENIS 20-03-2012 13:06 1883183

Вложений: 1
R.i.m.s.k.y.,Serega,
Может вы посмотрите еще раз,что не так,протестируете у себя,почему такое происходит,а то мы тут 100 страниц испишем дойдя до сингулярности и вам тоже нервы мотаю.Легче понять что такое 299,792,458 m/s :durak: ,чем почему не показывается размер файлов правильно.
Дополнительная информация Inno Setup 5.4.3(u) не русифицированная,еще установлены InnoIDE 1.0.0.0078 и ISToo; 5.3.0.1. ОS WINDOWS 7 x64
Вот снял скриншот в тотал коммандере размера файлов в игре и сам скрипт еще:
читать дальше »
Код:

;Скрипт создан в Inno Setup Script Wizard
#define Components
#define MyAppName "Test Drive Unlimited 2"
#define MyAppVersion "v097 build 5"
#define MyAppPublisher "Eden Games,Atari."
#define MyAppURL "http://www.testdriveunlimited2.com/"
#define MyAppExeName "UpLauncher.exe"

[Setup]
; ПРИМЕЧАНИЕ: Значение AppId является уникальным для каждой программы.
; Не используйте одинаковые значения для разных программ.
; (Для создания уникальных значений используйте Инструменты | Генерация GUID.)
AppId={{5252ADD1-8AEF-42F4-A257-19EE1975F925}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\Games\{#MyAppName}
DefaultGroupName=Eden Games
OutputDir=F:\111111111111111_install
WizardStyle=modern
OutputBaseFilename=setup
Compression=lzma2/ultra64
InternalCompressLevel=ultra64
LZMANumBlockThreads=2
LZMAUseSeparateProcess=yes
CompressionThreads=auto
SolidCompression=no
;Разбиение на диски
DiskSpanning=true
SlicesPerDisk=2
;Размер тома в байтах (здесь 1400 мегабайт)
DiskSliceSize=1540200000
ShowLanguageDialog=no
WizardImageBackColor=clBlack
TimeStampsInUTC=no
FlatComponentsList=false
AlwaysShowDirOnReadyPage=true
AlwaysShowGroupOnReadyPage=true
LanguageDetectionMethod=locale
UninstallDisplayIcon={app}\TDU2.ico
UninstallDisplayName=Test_Drive_Unlimited_2_v097_build_5_DEN
RestartIfNeededByRun=no
PrivilegesRequired=none
EnableDirDoesntExistWarning=no
DirExistsWarning=auto
ShowTasksTreeLines=yes
SetupIconFile=C:\Users\Den\Desktop\TDU2.ico
UsePreviousAppDir=false
ShowComponentSizes=yes
UserInfoPage=false
WindowVisible=false
WindowShowCaption=false
WindowResizable=false
WizardImageFile=C:\Users\Den\Desktop\covers_376.bmp
WizardSmallImageFile=C:\Users\Den\Desktop\logo-paul.bmp
UsePreviousGroup=no
UsePreviousSetupType=no
UsePreviousTasks=no
UsePreviousUserInfo=no

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

[LangOptions]
LanguageName=russian
LanguageID=$0409
LanguageCodePage=0
DialogFontName=Arial
DialogFontSize=9
WelcomeFontName=Arial
WelcomeFontSize=16
TitleFontName=Arial
TitleFontSize=29
CopyrightFontName=Arial
CopyrightFontSize=8
RightToLeft=no

[Tasks]
Name: desktopicon; Description: {cm:CreateDesktopIcon}; GroupDescription: {cm:AdditionalIcons}; Flags: checkablealone

[Files]
Source: C:\Users\Den\Desktop\innocallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: F:\Test Drive Unlimited 2\*; DestDir: {app}; AfterInstall:Progress(); Flags: ignoreversion recursesubdirs createallsubdirs
; ВАЖНО: Не используйте "Flags: ignoreversion" для системных файлов

[Icons]
Name: {group}\Test Drive Unlimited 2\{#MyAppName}; Filename: {app}\{#MyAppExeName}; IconFilename: {app}\TDU2.ico
Name: {group}\Test Drive Unlimited 2\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#MyAppName}; Filename: {app}\{#MyAppExeName}; Tasks: desktopicon; IconFilename: {app}\TDU2.ico; WorkingDir: {app}; Languages:

[Messages]
BeveledLabel=DEN 2011г.:%nhttp://3den.milivepage.ru/

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

[Registry]
; файл создан программой Converter v.0.1.3: 19 апреля 2011 г., в 10 час. 57 мин. 46 сек.
Root: HKLM; SubKey: SOFTWARE\Atari; Flags: uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: AudioLib; ValueData: DirectSound; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: GUID; ValueData: ; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: InstallDir; ValueData: {app}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: ExePath; ValueData: {app}\TestDrive2.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: LauncherPat; ValueData: {app}\UpLauncher.exe; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: Language; ValueData: Eng; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: UninstallExePath; ValueData: {{uninstallexe}; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: GameProductVersion; ValueData: TDU2 v097; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: GameBuildVersion; ValueData: 5; Flags: uninsdeletevalue uninsdeletekeyifempty
Root: HKLM; SubKey: SOFTWARE\Atari\TDU2; ValueType: string; ValueName: NetworkNatType; ValueData: Strict:UdpBlocked; Flags: uninsdeletevalue uninsdeletekeyifempty
; затраченное время: 4 мсек.

[UninstallDelete]
Type: files; Name: {group}\{#MyAppName}
Type: files; Name: {group}\УДАЛИТЬ ИГРУ
Type: files; Name: {commondesktop}\{#MyAppName}; Tasks: desktopicon

[Code]
var
  ProgressLabel, SizeLabel: TLabel;

function BytesToReadable(Bytes: Extended; Signs: Integer): string;
{ Перевод числа в значение Бт/Кб/Мб/Гб/Тб/Пб/Эб (Signs - количество знаков после запятой)}
var
  ABytes: Extended;
  i: Integer;
begin
  i := 0;
  ABytes := Bytes;
  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-Min)/((Max - Min)/100)) + '%';
  SizeLabel.Caption := BytesToReadable(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;

function InitializeSetup(): Boolean;
begin 
MsgBox(BytesToReadable(GetFileSize('Test Drive Unlimited 2\bigfile_RU_1.big'), 1), mbInformation, MB_OK);
Result:=True;
end;


boss911 20-03-2012 13:24 1883190

Цитата:

Цитата Лександер
[Setup]
UninstallIconFile=Icon.ico »

И что? Вы хоть сами проверяли?
Цитата:

Цитата Компилятор
Warning: The [Setup] section directive "UninstallIconFile" is obsolete and ignored in this version of Inno Setup.

И справку видимо тоже не читали:
Цитата:

Цитата jrsoftware.org/ishelp/index.php?topic=setup_uninstalliconfile
[Setup]: UninstallIconFile

Description:
Obsolete in 5.0.0. As Setup and Uninstall have been merged into a single executable, setting a custom icon for Uninstall is no longer possible.

Цитата:

Цитата boss911
файлу Uninstall.exe задать свою иконку нельзя, разве что поменять ее самостоятельно и компилировать проект уже с этим деинсталлятором и не забыть прописать 'Uninstallable=false'. Не совсем красивый метод, но другого я не знаю. »

Так что по-прежнему продолжаю не знать.

R.i.m.s.k.y. 20-03-2012 13:25 1883191

Цитата:

Цитата FX-DENIS
Легче понять что такое 299,792,458 m/s»

физик епта ;) ты еще вспони из какого уравнения она выводится как постоянная!

по коду у тебя похоже путь неправильный, вот GetFileSize и вертает 0

или почему бы не воспользоваться стандартной FileSize
Код:

...
FileSize(ExpandConstant(CurrentFileName), size);
MsgBox(BytesToReadable(IntToStr(size) + ' bytes'), mbInformation, MB_OK);
...


Gnom_aka_Lexander 20-03-2012 13:37 1883201

Вложений: 1
boss911, Я попробовал.
Хотя... я работаю в расширенной версии, может в стандартной это и не работает...

boss911 20-03-2012 13:53 1883216

Лександер

Я работаю исключительно в стандартной (официальной) версии. Как и сказано в справке, не работает.

R.i.m.s.k.y. 20-03-2012 14:01 1883226

Цитата:

Цитата boss911
Я работаю исключительно в стандартной (официальной) версии. Как и сказано в справке, не работает. »

ну и зря
номрмальные герои ипользуют расширенную!

Serega 20-03-2012 14:03 1883227

Цитата:

Цитата El Sanchez
перевод размера файла в удобочитаемую форму можно возложить на винду, например: »

Спасибо, честно говоря не знал про эту функцию, хотел уже добавить в скрипт, но на юникоде размер больших архивов не правильно показывает, правда сильно не ковырял...
Цитата:

Цитата FX-DENIS
дописал »

Вы пишите MsgBox(BytesToReadable(GetFileSize('Test Drive Unlimited 2\bigfile_RU_1.big'), 1), mbInformation, MB_OK);
где тут полный путь до файла? при такой раскладке он должен лежать в одном каталоге с инсталлятором.
В любом случае извиняюсь за свою не внимательность, нашёл ошибку в формуле, исправил и добавил доп. проверку:
Пример

Код:

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

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

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

[Files]
Source: compiler:Examples\*; DestDir: {app}; AfterInstall: Progress; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname

[Code]
var
  ProgressLabel, SizeLabel: TLabel;

function BytesToReadable(const Bytes: Extended; Signs: Integer): string;
{ Перевод числа в значение Бт/Кб/Мб/Гб/Тб/Пб/Эб (Signs - количество знаков после запятой)}
var
  ABytes: Extended;
  n: Integer;
begin
  Result := '';
  if Int(Bytes) > 0 then
    try
      n := 0;
      ABytes := Bytes;
      while Int(ABytes) >= 1024 do
        begin
          ABytes := ABytes/1024;
          n := n + 1;
        end;
      case n of
        0: Result := Format('%d ' + ExpandConstant('{cm:Bt}'), [Round(ABytes)]);                  // Байт
        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;
    finally
      if (Result <> '') and (Pos(',', Result) > 0) then
        StringChange(Result, ',', '.');
    end;
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-Min)/((Max - Min)/100)) + '%'; // часто видел, но никогда не вникал в эту формулу...
    ProgressLabel.Caption := IntToStr((Position*100)/Max) + '%'; // правильное отображение процентов
  SizeLabel.Caption := BytesToReadable(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;


Цитата:

Цитата R.i.m.s.k.y.
или почему бы не воспользоваться стандартной FileSize »

Есть ограничение, укажет размер файла не более 2ГБ
Цитата:

Цитата boss911
Так что по-прежнему продолжаю не знать. »

Привет Серёга ;) Лександер, верно говорит. Да в справке написано, что уже не поддерживает, но пока ещё работает...

Цитата:

Цитата boss911
Как и сказано в справке, не работает. »

Попробовал в стандартной, работает

LinkOFF 20-03-2012 15:43 1883321

Добрый день! Не могли бы мне помочь с распаковкой в зависимости от выбранных компонентов.Читал справку - ничего не получается. Пожалуйста опишите как нужно делать.

El Sanchez 20-03-2012 16:19 1883350

Цитата:

Цитата Serega
но на юникоде размер больших архивов не правильно показывает »

Serega, спасибо, исправил. Пришлось вычисление размера на пару строк разнести.
В shlwapi.dll, кстати, еще несколько похожих функций есть, легко описываемых и работающих в Inno, которые могут пригодиться: StrFormatKBSize - перевод байтов в удобочитаемую килобайтную форму, StrFromTimeInterval - перевод миллисекунд в ч/мин/сек.

Johny777 20-03-2012 18:22 1883422

LinkOFF,

[Components]
Name: A; Description: первый компонент; Flags: disablenouninstallwarning checkablealone fixed
Name: B; Description: второй компонент Flags: dontinheritcheck disablenouninstallwarning

[Files]
DestName: "WizardForm.BitmapImage11.bmp"; Source: "art\ambient.bmp"; Flags: dontcopy solidbreak; Components: A B (это общие фалы для двух компонетов и распакуются, если выбран один компонент или оба и не распакуются если не выбран не один компонент)
DestName: "WizardForm.BitmapImage3.bmp"; Source: "prolog\hl2_story.bmp"; Flags: dontcopy solidbreak; Components: A (только один компонент)
DestName: "WizardForm.BitmapImage5.bmp"; Source: "art\Gunship_con2.bmp"; Flags: dontcopy solidbreak; Components: B (только один компонент)
DestName: "WizardForm.BitmapImage4.bmp"; Source: "art\Cremator_poster.bmp"; Flags: dontcopy solidbreak (компонент не присвоен и как следствие будет устанавливаться всегда)

rasim933 20-03-2012 18:33 1883427

Ну и намудохался я с этой игрой. В конце просто плюнул на неё и тупо запихал в архив.

После некоторых махинаций, в инсталяторе появилось ещё куча ошибок.

Всем спасибо!

R.i.m.s.k.y. 20-03-2012 20:01 1883488

Arsi000, ну в шапке же ссылка http://forum.oszone.net/post-1218002-103.html

LinkOFF 20-03-2012 20:02 1883491

Цитата:

Цитата Johny777
[Components]
Name: A; Description: первый компонент; Flags: disablenouninstallwarning checkablealone fixed
Name: B; Description: второй компонент Flags: dontinheritcheck disablenouninstallwarning
[Files]
DestName: "WizardForm.BitmapImage11.bmp"; Source: "art\ambient.bmp"; Flags: dontcopy solidbreak; Components: A B (это общие фалы для двух компонетов и распакуются, если выбран один компонент или оба и не распакуются если не выбран не один компонент)
DestName: "WizardForm.BitmapImage3.bmp"; Source: "prolog\hl2_story.bmp"; Flags: dontcopy solidbreak; Components: A (только один компонент)
DestName: "WizardForm.BitmapImage5.bmp"; Source: "art\Gunship_con2.bmp"; Flags: dontcopy solidbreak; Components: B (только один компонент)
DestName: "WizardForm.BitmapImage4.bmp"; Source: "art\Cremator_poster.bmp"; Flags: dontcopy solidbreak (компонент не присвоен и как следствие будет устанавливаться всегда »

Мне через ISDone нужно

vitl 20-03-2012 21:16 1883519

Помогите, пожалуйста, разобраться.
Не могу заставить работать в MsgBox-е ExpandConstant('{app}') . Помогите подправить код:

Код:

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={reg:HKLM\SOFTWARE\MyProg\Inform,InstallPath} ; путь до программной папки
AppVersion=1.1.0.1
UsePreviousAppDir=no
AppendDefaultDirName=no
AllowRootDirectory=yes
DirExistsWarning=no
DisableStartupPrompt=yes
DisableReadyPage=yes
; DisableFinishedPage=yes
DisableDirPage=True
DisableProgramGroupPage=yes
OutputBaseFilename=Setup
Compression=lzma
SolidCompression=no
Uninstallable=false

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

[Files]
Source: {src}\add\*; DestDir: {app}\Serv\Lic\; Flags: external recursesubdirs skipifsourcedoesntexist

[_Code]
function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  s, ResultStr:string;
begin
Result:=True;
If not RegKeyExists(HKLM, 'SOFTWARE\MyProg\Inform')
 then
begin
 MsgBox('Программа не установлена или установлена неверно.' #13#13 'Дальнейшая работа Мастера невозможна.', mbError, mb_Ok);
 Result:=False;
 end
else
    begin
 MsgBox('Программа успешно обнаружена.' #13#13 'Скопируйте дополнения в папку:'+ExpandConstant('{app}')+'\Serv\Lic', mbInformrmation, mb_Ok);
end;
end;


R.i.m.s.k.y. 20-03-2012 21:31 1883532

vitl, на шаге InitializeSetup переменная {app} еще неизвестна
помоему я тебе уже и отвечал

FX-DENIS 21-03-2012 00:28 1883650

Цитата:

Цитата Serega
В любом случае извиняюсь за свою не внимательность, нашёл ошибку в формуле, исправил и добавил доп. проверку: »

мда... вставил секцию код с заменой,теперь вообще нет ни отображения процентов ,ни отображения размера текущего файла
секция файлы такая
читать дальше »
Код:

[Files]
Source: C:\Users\Den\Desktop\innocallback.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression solidbreak
Source: F:\Test Drive Unlimited 2\*; DestDir: {app}; AfterInstall:Progress(); Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname
; ВАЖНО: Не используйте "Flags: ignoreversion" для системных файлов


Johny777 21-03-2012 00:28 1883651

Цитата:

Цитата R.i.m.s.k.y.
InitializeSetup »

скажи пожалуйста
c InitializeWizard константу {app} уже можно использовать?

YURSHAT 21-03-2012 04:00 1883697

Цитата:

Цитата Johny777
скажи пожалуйста
c InitializeWizard константу {app} уже можно использовать? »

Константа {app} станет известна на странице выбора папки...

Richter 21-03-2012 04:37 1883700

Помогите, пожалуйста! Дайте образец как осуществить продолжение установки игры со 2го и последующих образов.

boss911 21-03-2012 04:42 1883702

Цитата:

Цитата Serega
Попробовал в стандартной, работает »

Привет. Еще раз попробовал в стандартной юникод версии (на базе ispack-5.4.3-unicode.exe) - не работает. Упорно берет иконку от инсталлятора. Помню, я еще этим года три назад интересовался, у меня еще тогда ничего не получилось.
Цитата:

Цитата Компилятор
Warning: The [Setup] section directive "UninstallIconFile" is obsolete and ignored in this version of Inno Setup.

Что я делаю не так?

Цитата:

Цитата R.i.m.s.k.y.
номрмальные герои ипользуют расширенную! »

А некоторым героям очень важно, чтобы их дистрибутив распаковывался анпакером. Как правило, расширенная версия удобна в первую очередь для знатоков Паскаля, а я таким и близко не являюсь. Не считаю себя героем в Inno.

R.i.m.s.k.y. 21-03-2012 07:55 1883727

Цитата:

Цитата boss911
А некоторым героям очень важно, чтобы их дистрибутив распаковывался анпакером. »

расширенная тоже распаковывается анпакером пока пароль не поставишь (кажецца)

El Sanchez, Serega
в шапке есть скрпт ultimate black skin в котором реализована проверка железа через реестр. Что хорошо - работает у всех в не зависимости от звереубитости венды. Но недостаток - если в системе две видюхи этот скрипт покажет только название первой-активной. Как его модифицировать чтобы он доставал названия всех видюх установленных в системе? не используя WMI
Заранее спасибо!

boss911 21-03-2012 10:00 1883779

Цитата:

Цитата R.i.m.s.k.y.
расширенная тоже распаковывается анпакером »

И снова пришлось проверять то, что проверялось мною еще пару лет назад. Накатил на ispack-5.4.3-unicode.exe Unicode\FullVCL, ни innounp, ни innounp_plus, не берут дистрибутивы от ResTools.

А вот их Compil32Ex.exe я себе присмотрел.

R.i.m.s.k.y. 21-03-2012 10:58 1883812

boss911, да, действительно обманул
не распаковывает
прошу прощения

vitl 21-03-2012 10:58 1883813

Цитата:

Цитата R.i.m.s.k.y.
на шаге InitializeSetup переменная {app} еще неизвестна
помоему я тебе уже и отвечал »

Я с тех пор не смог разобраться с определением этой переменной. )) Поэтому задал вопрос еще раз.

R.i.m.s.k.y. 21-03-2012 11:06 1883817

vitl, читай в справке Installation order, эта переменная известна только после страницы выбора папки

Цитата:

Цитата boss911
Как правило, расширенная версия удобна в первую очередь для знатоков Паскаля, а я таким и близко не являюсь. »

она удобна подсветкой синтаксиса, рубрикатором слева, выделением всего и вся
после нее обычный компилятор уже не катит

Serega 21-03-2012 12:00 1883844

Цитата:

Цитата boss911
Еще раз попробовал в стандартной юникод версии (на базе ispack-5.4.3-unicode.exe) - не работает. Упорно берет иконку от инсталлятора. »

Извиняюсь, был не прав, действительно в стандартной версии не работает. Пришлось для теста установить стандартную версию, так как я совсем забыл, что при установки расширенной версии подменяются стандартные файлы препроцессора и хотя стандартный компилятор остаётся, но он уже работает с расширенной версией препроцессора.
Так что ты был прав на все 100%.
Цитата:

Цитата R.i.m.s.k.y.
Но недостаток - если в системе две видюхи этот скрипт покажет только название первой-активной. Как его модифицировать чтобы он доставал названия всех видюх установленных в системе? не используя WMI »

Если у вас есть кусок реестра с несколькими видюхами, то выложите его сюда на форум.
Только мне кажется смысла всего этого нет, т.к. активной всегда используют более мощную...

FX-DENIS 21-03-2012 12:05 1883849

Serega, прочитайте ,прошлую страницу

R.i.m.s.k.y. 21-03-2012 12:05 1883850

Цитата:

Цитата Serega
Только мне кажется смысла всего этого нет, т.к. активной всегда используют более мощную... »

в том то и да что на гибридных системах, к примеру ноутах с видяшкой Intel + дискретка амд/нв при установке программы активная интеловская видеозатычка, соответственно опрос железа по реестру (как сейчас в ultimate black) дает что дискретки амд/нв нету и инсталлер делает низкие настройки. А вот используется потом да - более мощная, ога, с настройками под HD3000

boss911 21-03-2012 12:17 1883859

Цитата:

Цитата R.i.m.s.k.y.
она удобна подсветкой синтаксиса, рубрикатором слева, выделением всего и вся »

Я уже 6-7 лет пользуюсь ISTool, все вышеперечисленное внем есть (кроме подсветки Паскаля). Правда, разработка заброшена, многие перешли на InnoIDE, но он мне что-то не нравится. Так как я с Паскалем дружу, как с балетом, то лучше ISTool для меня ничего нет. А в стандартном редакторе я никогда не писал скрипты.

Devils Night 21-03-2012 12:58 1883881

Для справки:
В общем заметил одну странность, при добавлении шрифта в инсталл, то один и тот же шрифт отображается по разному.
На Windows7 шрифт отображается верно, но на Windows XP этот же шрифт в некоторых местах уматывает хрен знает куда, бывает даже смещение текста друг на друге.
Получается нужно подбирать шрифт под Win7, WinXP и засовывать непосредственно в инсталятор, так что ли, или с этим уже вообще ничего нельзя сделать?

El Sanchez 21-03-2012 13:09 1883890

R.i.m.s.k.y., WMI для для сбора информации использует и реестр в том числе. Видеокарты тусуются в следующем кусте,
Код:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}
..., в котором есть подразделы 0000 (первое устройство), 0001 (второе) и т.д. Ищи в них либо REG_SZ DriverDesc, либо /Settings/REG_SZ Device Description.


Цитата:

Цитата boss911
пользуюсь ISTool, все вышеперечисленное внем есть (кроме подсветки Паскаля). Правда, разработка заброшена, многие перешли на InnoIDE, но он мне что-то не нравится »

boss911, хех, у меня та же самая стадия была, так же на ISTool сидел, пока китайцев не попробовал.

R.i.m.s.k.y. 21-03-2012 14:12 1883917

El Sanchez,
спасибо, проверим, а куст \\Registry\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\GUID\0000\HardwareInformation.AdapterString нельзя использовать?

boss911 El Sanchez я istool'ом пользуюсь только для импортирования файлов реестра

El Sanchez 21-03-2012 15:27 1883947

R.i.m.s.k.y., у меня такого куста нет.

R.i.m.s.k.y. 21-03-2012 15:28 1883948

El Sanchez, но именно с этого куста берет инфо скрипт Ultimate test Black
GUID в смысле {abcde-....}
у меня так
Код:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Video\{2014FB57-2BF6-4963-8353-84CFD22EE202}\0000]
"DriverDesc"="Intel(R) G33/G31 Express Chipset Family"


by_gangster 21-03-2012 15:40 1883953

подскажите как сделать что бы значок (воспроизвести) был не под картинкой WizardImageFile, а на ней???

Johny777 21-03-2012 15:50 1883957

мне может кто подсказать?
создаю комбобокс, при нажатии на Item должны быть отмечены те или иные чекбоксы и переключатели. Короче говоря как у типов установки.
читать дальше »
Код:

var
  TypeComboBox: TNewComboBox;

procedure InitializeWizard;
begin
  { TypeComboBox }
  TypeComboBox := TNewComboBox.Create(WizardForm);
  with TypeComboBox do
  begin
    Name := 'TypeComboBox';
    Parent := ComponentsPage.Surface;
    Left := ScaleX(42);
    Top := ScaleY(8);
    Width := ScaleX(233);
    Height := ScaleY(21);
Items.add('всё на английском')
Items.add('всё на русском')
    Text := 'быстрый выбор типа установки';
  end;
end;


добавил
Items.add('всё на английском')
Items.add('всё на русском')
как привязать процедуру типа такой к каждому айтему?


procedure TYPE1 (Sender: TObject); /// тип первый
begin
hl2_main_CheckBox.Checked:= true;
hl2_ru_en_RadioButton.Checked:= true;
end;

Ivan_009 21-03-2012 16:26 1883986

Как сделать деинсталятор в стиле инсталла.

by_gangster 21-03-2012 17:07 1884015

Ivan_009, если ты про скин то вот http://forum.ru-board.com/topic.cgi?...&limit=1&m=8#1

Ivan_009 21-03-2012 17:11 1884018

Нет я иммею ввиду про внешний вид

El Sanchez 21-03-2012 17:11 1884019

Цитата:

Цитата R.i.m.s.k.y.
у меня так »

R.i.m.s.k.y., ясно. Меня смутило:
Цитата:

Цитата R.i.m.s.k.y.
HardwareInformation.AdapterString »

В общем, как хочешь, я бы брал из того места, которое я указал.

Johny777 21-03-2012 18:00 1884048

Ivan_009,
прочитай сначала это
http://forum.oszone.net/post-1873551-932.html
потом это
http://forum.oszone.net/post-1874234-942.html
а внешний вид это не проблема.
Вместо "выберете компонент" можно написать "Что удалить?" или переименовать кнопку далее "установить" в "удалить" и тд

Serega 21-03-2012 18:02 1884050

Цитата:

Цитата FX-DENIS
мда... вставил секцию код с заменой,теперь вообще нет ни отображения процентов ,ни отображения размера текущего файла »

Полностью скопируйте приведённый мной пример, скомпилируйте и попробуйте установить. Проценты установки и размеры файлов отображаются?
Цитата:

Цитата Johny777
мне может кто подсказать? »

Пример

Код:

var
  TypeComboBox: TNewComboBox;

procedure TypeComboBoxChange(Sender: TObject);
begin
  case TypeComboBox.ItemIndex of
    0:  begin
          hl2_main_CheckBox.Checked := True;
          hl2_ru_en_RadioButton.Checked := True;
        end;
    1: ;// здесь тоже что-то делаем
  end;
end;

procedure InitializeWizard;
begin
  { TypeComboBox }
  TypeComboBox := TNewComboBox.Create(WizardForm);
  with TypeComboBox do
  begin
    Parent := ComponentsPage.Surface;
    SetBounds(ScaleX(42), ScaleY(8), ScaleX(233), ScaleY(21));
    Items.add('всё на английском')
    Items.add('всё на русском')
    Text := 'быстрый выбор типа установки';
    OnChange := @TypeComboBoxChange;
  end;
end;


sergey3695 21-03-2012 18:52 1884103

Можно ли как-нибудь изменить диалоговое окно выбора языка инсталлятора? (текст я знаю как менять). Сделать на другой форме... или что-либо?

Johny777 21-03-2012 19:08 1884116

sergey3695,
первое что приходит в голову - создать форму и на ней переключатели или (пример выше) комбобокс, после которого будет запускаться лежащий рядом инсталл с параметром командной строки типа setup.exe/LANG=English
а в основном инсталле сделать выбор языка автоматическим
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage

by_gangster 21-03-2012 19:12 1884121

хочу сделать свой курсор допустим он у меня есть, а есть ли какой небудь скрипт для в писания в свой????

R.i.m.s.k.y. 21-03-2012 19:23 1884127

Цитата:

Цитата El Sanchez
В общем, как хочешь, я бы брал из того места, которое я указал. »

это место и для ХР такое же?

Johny777 21-03-2012 19:34 1884135

by_gangster,
временный курсор. Его нужно ставить, а потом удалять, как со шрифитом.
почему не воспользуешься стандартными курсорами?
[Setup]
AppName=Cursor
AppVerName=Cursor
DefaultDirName={pf}\Cursor

[code]
procedure InitializeWizard();
begin
WizardForm.CancelButton.Cursor := crUpArrow;
WizardForm.NextButton.Cursor := crUpArrow;
WizardForm.BackButton.Cursor := crUpArrow;
WizardForm.WelcomePage.Cursor := crHourGlass;
WizardForm.DirBrowseButton.Cursor := crUpArrow;
WizardForm.SelectDirPage.Cursor := crHand;
WizardForm.Cursor := crHand;
end;

by_gangster 21-03-2012 20:07 1884167

Johny777, спс, а в Files его надо указывать??

Johny777, показвается только стандарт, а мне надо что бы мой курсор показывался

El Sanchez 21-03-2012 21:42 1884244

Цитата:

Цитата R.i.m.s.k.y.
это место и для ХР такое же? »

Разумеется. GUID-ы классов устройств

FX-DENIS 22-03-2012 00:36 1884346

Serega короче хохма такая:если использовать ваш скрипт,где указанно Source: compiler:Examples\* я так понимаю это папка инно с примерами,то отображаеться всё и проценты и размер файликов.Как только я указываю Source: F:\Test Drive Unlimited 2\* то прощай проценты и размер файлов.Я тогда пошел другим путем,просто скопировал в папку C:\Program Files (x86)\Inno Setup 5\Examples файл bigfile_RU_1.big размером 3,05 гб и нажал нечего не меняя компиляцию.После компиляции во время установки и распаковки инсталятором файла bigfile_RU_1.big нет ни процентов ни размера,а потом после того как он распаковался инсталятором,происходит распаковка тех файлов мелких в C:\Program Files (x86)\Inno Setup 5\Examples и появляються(мелькают) их размеры и проценты появляются, сразу 100% ,при этом еще раз повторяю я не чего в вашем последнем скрипте не менял,просто скопировал в папку примеров этот огромный файл. Я так понял хоть убейся не может инно показать размер огромных файлов,а мелких пожалуйста и с процентами.Кто нибудь,может решить эту загадку?Уже 4 день мучаемся. :dont-know

Johny777 22-03-2012 01:00 1884352

FX-DENIS,
попробуй это для начала
тут правда в байтах, но если отображается как надо, то думаю можно переделать
проценты тоже есть
читать дальше »
Код:

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

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

[Files]
Source: C:\Program Files (x86)\Inno Setup 5\*; DestDir: {app}; AfterInstall: Progress
[UninstallDelete]
Type: files; Name: {app}
[  Code]
var
  ProgressLabel, SizeLabel: TLabel;

procedure Progress;
var
  size: Integer;
begin
  with WizardForm.ProgressGauge do
    ProgressLabel.Caption:= IntToStr((Position-Min)/((Max - Min)/100)) + ' %';
  FileSize(ExpandConstant(CurrentFileName), size);
  SizeLabel.Caption:= 'Размер ' + ExtractFileName(ExpandConstant(CurrentFileName)) + ': ' +
                      IntToStr(size) + ' байт';
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;


Serega 22-03-2012 01:05 1884354

Цитата:

Цитата FX-DENIS
если использовать ваш скрипт,где указанно Source: compiler:Examples\* я так понимаю это папка инно с примерами,то отображаеться всё и проценты и размер файликов. »

Вывод, значит скрипт рабочий?!
Цитата:

Цитата FX-DENIS
во время установки и распаковки инсталятором файла bigfile_RU_1.big нет ни процентов ни размера »

Вы видимо не понимаете суть, определить размер файла можно только если он находится на диске, т.е. уже скопирован, отсюда и AfterInstall: Progress;, если перевести, то процедура Progress будет выполнена только после копирования файла на диск.
Цитата:

Цитата FX-DENIS
происходит распаковка тех файлов мелких в C:\Program Files (x86)\Inno Setup 5\Examples и появляються(мелькают) их размеры и проценты появляются, сразу 100% »

Правильно, размер всех этих оставшихся файлов всего несколько мегабайт, а вы уже скопировали 3,05ГБ, отсюда и сразу 100%.
Цитата:

Цитата FX-DENIS
Я так понял хоть убейся не может инно показать размер огромных файлов »

Данный скрипт, который я вам привёл, показывает любой размер файла, но только он должен быть на диске.
Цитата:

Цитата FX-DENIS
Кто нибудь,может решить эту загадку?Уже 4 день мучаемся. »

Вы видимо хотели, чтоб показывало как в Total Commander'е при копировании файла прогресс? В таком случае, файл должен быть внешним и копирование придётся делать через код...

FX-DENIS 22-03-2012 02:28 1884367

Johny777, с этим скриптом я изначально пришел сюда))
Serega,
Цитата:

Цитата Serega
Данный скрипт, который я вам привёл, показывает любой размер файла, но только он должен быть на диске. »

кто файл или скрипт?на диск я запишу инсталятор или локальный диск?показывает любой размер файла только после распаковки,что то я не видел,что бы после распаковки bigfile_RU_1.big он паказал размер 3.05 гб ,попробую ещё раз всю игру скомпилировать и посмотрю.
Цитата:

Цитата Serega
Вы видимо хотели, чтоб показывало как в Total Commander'е при копировании файла прогресс? В таком случае, файл должен быть внешним и копирование придётся делать через код... »

нет,вы же выдели первые скриншоты которые выкладывал,что придуриваться.Простыми средствами инно,без отдельных прогресс баров,сжатий arc и прочей ненужной мишуры, просто общий процент распаковки и размер в мб,гб текущего файла.
В любом случае после стольких мучений тут,и перечитывания зря тысяч сообщений трех архивов форума спасибо вам Serega,а остальным,когда пишут,то прежде чем помогать Johny777 и другие,читайте с чем человек пришел к вам,или лень вернуться на несколько страниц назад,прежде чем советовать.Еще раз спасибо Serega вам,буду использовать скрипт последний предложенный вами,хоть такое отображение.

Serega 22-03-2012 09:30 1884435

Вложений: 1
Цитата:

Цитата FX-DENIS
кто файл или скрипт? »

Естественно файл, он уже должен быть на локальном диске.
Цитата:

Цитата FX-DENIS
что то я не видел,что бы после распаковки bigfile_RU_1.big он паказал размер 3.05 гб »

Он показывает, только мелькает очень быстро, т.к. следующий файл маленького размера.
Чтоб вам было понятней прикрепил к сообщению ваш скриншот, на котором сделал пометки.
Цитата:

Цитата FX-DENIS
нет,вы же выдели первые скриншоты которые выкладывал,что придуриваться. »

А кто вам сказал, что я придуриваюсь или ещё что-то? Я лишь хочу донести до вас суть, я не зря вам сказал про Total Commander, он прежде чем копировать, узнаёт размер файла, а уже затем отображет прогресс в зависимости от состояния.
Если вы хотите, чтоб отображался размер именно в данный момент извлекаемого файла, вам придётся создать список всех файлов с размерами и при распаковке использовать уже BeforeInstall: Progress;, а в самой процедуре Progress в зависимости от имени файла писать его размер. Для того, чтоб изменялись проценты вместе с движением прогрессбара, показ процентов нужно писать через таймер.
Цитата:

Цитата FX-DENIS
то прежде чем помогать Johny777 и другие,читайте с чем человек пришел к вам »

Зачем вы так, он просто хотел вам помочь...

Ivan_009 22-03-2012 11:22 1884499

Как расширить эту область чтобы можно было сменить текст а то при смене текста половина букв невидно

Johny777 22-03-2012 12:21 1884544

Ivan_009,
настоятельно советую поставить расширенную версию. В ней есть графический дизайнер и все эти элементы двигаются и расширяются напрямую без ручной писанины коде!
ссылка http://forum.oszone.net/thread-148707.html или http://innoultra.ru/?page_id=70
а расширить так.
только в высоту, т.к. он шириной в InnerNotebook и пришлось бы расширять и его, что повлекло бы за собой смещение прогресбара и других элементов
читать дальше »
Код:

procedure InitializeWizard();
begin
  with WizardForm.SelectDirBrowseLabel do
  begin
    Top := ScaleY(36);
    Height := ScaleY(45);
  end;

end;



Цитата:

Цитата Serega
использовать уже BeforeInstall: Progress; »

Может за основу взять это. Мелкие и так мелькают. Их можно на старом лейбле отображать через AfterInstall
а для крупного сделать так
читать дальше »
Код:

[Files]
Source: "{src}\*.dll"; DestDir: {app}; BeforeInstall: ChangeCaption('3гб')

[_Code]
procedure ChangeCaption(str: string);
begin
WizardForm.StatusLabel.Caption:= str; /// вместо этого лейбла другой
end;


_______________________________________________________________
кому нужно
у меня много временных файлов и инсталл инициализируется долго
сделал так
форма отображается в течении загрузки сколько бы она на разных компах не длилась
думаю можно ещё вынести из элементов строки типа ExtractTemporaryFile('WizardForm.BitmapImage9.bmp');
предварительно создав прогресбар прописывать после каждой строки что-то вроде
ProgresBar.Position: =5;
читать дальше »
Код:

procedure InitializeWizard;
var
  Form: TSetupForm;  /// создание формы перед запуском /// часть 1
begin
  begin
    Form := CreateCustomForm();
      with Form do
        begin
          ClientWidth := ScaleX(207); //Ширина формы
          ClientHeight := ScaleY(180); //Высота формы
          BorderStyle := bsDialog;
          Left := GetSystemMetrics(16) - ClientWidth - ScaleX(5);
          Top := GetSystemMetrics(17) - ClientHeight - ScaleY(5);
          Caption := 'Inno Setup Wizard' //Заголовок окна
            with TBitmapImage.Create(Form) do
              begin
                Parent := Form;
                Left := ScaleX(0);
                Top := ScaleY(0);
                Width := ScaleX(207);
                Height := ScaleY(180);
                ExtractTemporaryFile('Lambda_Form_Image.bmp');
                Bitmap.LoadFromFile(ExpandConstant('{tmp}\Lambda_Form_Image.bmp'));
              end;
        end;
    Form.Show();
    Form.Repaint;
    /// конец


  /// здесь весь отсек InitializeWizard

    RedesignWizardForm; /// это кусок дизайнера



 end;
 Form.Free();  инсталл загружен. Форма исчезает
end;


живой пример
http://rghost.ru/37156533

FX-DENIS 22-03-2012 12:44 1884566

Вложений: 1
Johny777,извиняюсь ,если перегнул палку,без обид. Serega, разжевал и в рот положил,всё понял теперь.Вопросов больше нет. :oszone:
Итоговый результат :type:

valyok666 22-03-2012 15:14 1884685

Ivan_009, DirEdit и кнопку Обзор пониже опусти и будет место)

by_gangster 22-03-2012 17:49 1884794

может, кто знает есть ли программа для внедрения в свой скрипт курсора???

Ivan_009 22-03-2012 18:27 1884816

Как сделать чтобы где иконка был тоже черный цвет вместо белого...

Johny777 22-03-2012 19:13 1884850

Ivan_009,
это же WizardSmallimage
в фотошопе закрасить bmp картинку?
а вообще вот цвет фона
with WizardForm.WizardSmallBitmapImage do
begin
BackColor := clBlack;
end;
опять же одним кликом в расширенной версии
пример

дабы не флудить я больше на такие вопросы отвечать не буду. Когда перечитывал ветки 2 и 3, то через страницу были вопросы типа. "Как растянуть ту картинку" или "как сдвинуть лейбл?"
ладно в обычной версии сделать это не так просто, тк не знаешь названия. Но здесь же всё перед глазами.

YURSHAT 22-03-2012 21:35 1884946

Цитата:

Цитата by_gangster
хочу сделать свой курсор допустим он у меня есть, а есть ли какой небудь скрипт для в писания в свой???? »

botva2.dll умеет работать с внешним курсором...

Ivan_009 22-03-2012 23:47 1885010

Как добавить такие дорожки к чебоксу

ARS_23 23-03-2012 00:01 1885019

Ivan_009,
Код:

[Setup]
ShowTasksTreeLines=Yes


El Sanchez 23-03-2012 12:10 1885231

Цитата:

Цитата by_gangster
может, кто знает есть ли программа для внедрения в свой скрипт курсора??? »

Реализацию в примере от расширенной версии смотрите: Example_RawDataResource.iss

vitl 23-03-2012 12:36 1885242

Сделал набросок скрипта, реализующего обновление установленной ранее программы.
Просьба проверить кошерность кода. ))
Так же нужно вставить проверку дистрибутивной папки на наличие определенных файлов (см. коментарии в коде ниже).
За ранее спасибо за помощь.

Код:

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={reg:HKLM\SOFTWARE\MyProg\Inform,InstallPath} ; путь до программной папки
AppVersion=1.1.0.1
UsePreviousAppDir=no
AppendDefaultDirName=no
AllowRootDirectory=yes
DirExistsWarning=no
DisableStartupPrompt=yes
DisableReadyPage=yes
; DisableFinishedPage=yes
DisableDirPage=True
DisableProgramGroupPage=yes
OutputBaseFilename=Setup
Compression=lzma
SolidCompression=no
Uninstallable=false

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

[Files]
Source: {src}\Lics\*; DestDir: {app}\Serv\Lic\; Flags: external recursesubdirs skipifsourcedoesntexist

[_Code]
function GetInstallPath( AppID: String ): String;
var
Path: String;
    begin
    Path:= '';
    RegQueryStringValue(HKLM, 'SOFTWARE\MyProg\Inform', 'InstallPath', Path);
    Result:= Path;
    end;

function InitializeSetup(): Boolean;
var
s:string;
    begin
    Result:=True;
// Проверка через реестр
    if not RegValueExists(HKLM, 'SOFTWARE\MyProg\Inform', 'InstallPath') then
        begin
        s:='Программа не установлена.' #13#13 'Дальнейшая работа невозможна.';
        MsgBox(s, mbError, mb_Ok);
        Result:=False;
        end else
// Проверка присутствия главного файла в папке с установленной программой
          begin
          If (FileSearch('Serv\'+'infrmsrv.exe', ExpandConstant('{code:GetInstallPath}'))='') then
              begin
              s:='Извините, в директории '+ExpandConstant('{code:GetInstallPath}')+'' #13 'не обнаружены файлы, подтверждающие подлинность программы.' #13#13 'Пожалуйста, выберите правильный путь.';
              MsgBox(s, mbError, mb_Ok);
              Result:= False;
              end else
//
//  Здесь нужно вставить ПРОВЕРКУ НА СУЩЕСТВОВАНИЕ ФАЙЛОВ ПО МАСКЕ *.lic в дистрибутивной папке Serv\Lics\
//  Если в данной папке нет файлов *.lic, тогда ВЫВЕСТИ СЛЕДУЮЩЕЕ СООБЩЕНИЕ:

        begin
        s:='Скопируйте дополнения в папку:' #13#13 +ExpandConstant('{code:GetInstallPath}')+'\Serv\Lic';
        MsgBox(s, mbInformation, mb_Ok);
        Result:=False;  // сомневаюсь в необходимости этой строки
        end
//


                end;
          end;
// и продолжить код, который будет дальше . . .


by_gangster 23-03-2012 14:54 1885322

El Sanchez, туда я залазил хоть и скрипт маленький но нифига не понял, так же смотрел такой скрипт
Код:

Setup]
AppName=Inno Setup Scripting v5.1 Russian Edition
AppVerName=Inno Setup Scripting v5.1 Russian Edition
DefaultDirName={pf}\Inno Setup Scripting v5.1
DefaultGroupName=Inno Setup Scripting v5.1
AllowNoIcons=yes
OutputDir=C:\Output
OutputBaseFilename=iss_setup
Compression=lzma/ultra
SolidCompression=yes
WizardImageFile=C:\WizardSmallImage.bmp
WizardSmallImageFile=C:\WizardSmallImage.bmp
SetupIconFile=C:\10.ico

[Messages]
BeveledLabel=- Kindly Software Installer -

[LangOptions]
LanguageName=English
LanguageID=$0409
LanguageCodePage=0
DialogFontName=Tahoma
DialogFontSize=8

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: C:\button2.bmp; DestDir: {tmp}; Flags: dontcopy
Source: C:\WizardImage2.bmp; DestDir: {tmp}; Flags: dontcopy
Source: C:\BASSMOD.dll; DestDir: "{tmp}"; Flags: dontcopy
Source: C:\TWINKLE.IT; DestDir: "{tmp}"; Flags: dontcopy
Source: C:\Transparent Arrow.cur; DestDir: "{tmp}"; Flags: dontcopy
Source: C:\Transparent Hand.cur; DestDir: "{tmp}"; Flags: dontcopy

Source: "C:\iss\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs

[Icons]
Name: "{group}\Запуск Inno Setup Scripting v5.1"; Filename: "{app}\ISS.exe"; WorkingDir: "{app}"
Name: "{group}\История версий"; Filename: "{app}\readme_rus.txt"; WorkingDir: "{app}"
Name: "{group}\Удалить Inno Setup Scripting v5.1"; Filename: "{uninstallexe}"; WorkingDir: "{app}"
Name: "{commondesktop}\Inno Setup Scripting v5.1"; Filename: "{app}\ISS.exe"; WorkingDir: "{app}"; Tasks: desktopicon
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\Inno Setup Scripting v5.1"; Filename: "{app}\ISS.exe"; WorkingDir: "{app}"; Tasks: quicklaunchicon

[_Code]
const
  ButtonWidth = 80;    //Указываем размер кнопок
  ButtonHeight = 23;

  bidBack = 0;
  bidNext = 1;
  bidCancel = 2;
  bidDirBrowse = 3;
  bidGroupBrowse = 4;

  BASS_MUSIC_RAMP        = 1;
  BASS_MUSIC_RAMPS        = 2;
  BASS_MUSIC_LOOP        = 4;
  BASS_MUSIC_FT2MOD      = 16;
  BASS_MUSIC_PT1MOD      = 32;
  BASS_MUSIC_SURROUND            = 512;
  BASS_MUSIC_SURROUND2          = 1024;

GCL_HCURSOR = (-12);
OCR_NORMAL = 32512;


function LoadCursorFromFile(FileName: String): Longint;
 external 'LoadCursorFromFileA@user32 stdcall';

function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint;
 external 'SetClassLongA@user32 stdcall';

function SetCursor(Cursor: Longint): Longint;
 external 'SetCursor@user32 stdcall';

function SetSystemCursor(Cursor, CurType: Longint): Longint;
 external 'SetSystemCursor@user32 stdcall';

function GetCursor(): Longint;
 external 'GetCursor@user32 stdcall';

 procedure BASSMOD_MusicFree();
external 'BASSMOD_MusicFree@files:BASSMOD.dll stdcall delayload';

function BASSMOD_Init(device: Integer; freq, flags: DWORD): Boolean;
external 'BASSMOD_Init@files:BASSMOD.dll stdcall delayload';

function BASSMOD_MusicLoad(mem: BOOL; f: PChar; offset: DWORD; length: DWORD; flags: DWORD): Boolean;
external 'BASSMOD_MusicLoad@files:BASSMOD.dll stdcall delayload';

function BASSMOD_MusicPlay(): Boolean;
external 'BASSMOD_MusicPlay@files:BASSMOD.dll stdcall delayload';

procedure BASSMOD_Free();
external 'BASSMOD_Free@files:BASSMOD.dll stdcall delayload';

function BASSMOD_MusicStop(): Boolean;
external 'BASSMOD_MusicStop@files:BASSMOD.dll stdcall delayload';

Var
  ButtonPanel: array [0..4] of TPanel;
  ButtonImage: array [0..4] of TBitmapImage;
  ButtonLabel: array [0..4] of TLabel;

WizardImage: TBitmapImage;
YesRadio,NoRadio: TRadioButton;
WelcomeLabel1,WelcomeLabel2,LicenseLabel1,LicenseAcceptedLabel,LicenseNotAcceptedLabel,PasswordLabel,PasswordEditLabel,
InfoBeforeClickLabel,UserInfoNameLabel,UserInfoOrgLabel,UserInfoSerialLabel,SelectDirLabel,SelectDirBrowseLabel,DiskSpaceLabel,
SelectComponentsLabel,ComponentsDiskSpaceLabel,SelectStartMenuFolderLabel,SelectStartMenuFolderBrowseLabel,NoIconsLabel,
SelectTasksLabel,ReadyLabel,StatusLabel,InfoAfterClickLabel,FinishedHeadingLabel,FinishedLabel,YesRadioLabel,NoRadioLabel,
BeveledLabel: TLabel;
CheckBox: TCheckBox;
CheckBoxLabel: Tlabel;
ResultCode: Integer;

OldCursor, NewCursor, NewCursor1: Longint;

procedure ButtonLabelClick(Sender: TObject);
var
  Button: TButton;
begin
  ButtonImage[TLabel(Sender).Tag].Left:=0
  case TLabel(Sender).Tag of
    bidBack: Button:=WizardForm.BackButton
    bidNext: Button:=WizardForm.NextButton
    bidCancel: Button:=WizardForm.CancelButton
    bidDirBrowse: Button:=WizardForm.DirBrowseButton
    bidGroupBrowse: Button:=WizardForm.GroupBrowseButton
  else
    Exit
  end
  Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  if ButtonLabel[TLabel(Sender).Tag].Enabled then
    ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure LoadButtonImage(AButton: TButton; AButtonIndex: integer);
var
  Image: TBitmapImage;
  Panel: TPanel;
  Labl: TLabel;

begin
  Panel:=TPanel.Create(WizardForm)
  Panel.Left:=AButton.Left
  Panel.Top:=AButton.Top
  Panel.Width:=AButton.Width
  Panel.Height:=AButton.Height
  Panel.Tag:=AButtonIndex
  Panel.Parent:=AButton.Parent
  ButtonPanel[AButtonIndex]:=Panel

  Image:=TBitmapImage.Create(WizardForm)    //Рисунок который ложится на кнопку
  Image.Width:=160                          //Обязательно прописать оригинальный размер рисунка
  Image.Height:=23
  Image.Enabled:=False
  Image.Bitmap.LoadFromFile(ExpandConstant('{tmp}\button2.bmp'))
  Image.Parent:=Panel
  ButtonImage[AButtonIndex]:=Image

  with TLabel.Create(WizardForm) do begin
    Tag:=AButtonIndex
    Parent:=Panel
    Width:=Panel.Width
    Height:=Panel.Height
    Transparent:=True
    OnClick:=@ButtonLabelClick
    OnDblClick:=@ButtonLabelClick
    OnMouseDown:=@ButtonLabelMouseDown
    OnMouseUp:=@ButtonLabelMouseUp
  end

  Labl:=TLabel.Create(WizardForm)        //Текст кнопок
  Labl.Left:=23                          //Указываем положение текста
  Labl.Top:=5
  Labl.Autosize:=True
  Labl.Alignment:=taCenter
  Labl.Tag:=AButtonIndex
  Labl.Transparent:=True
  Labl.Font.Color:=clWhite              //Цвет текста
  Labl.Caption:=AButton.Caption
  Labl.OnClick:=@ButtonLabelClick
  Labl.OnDblClick:=@ButtonLabelClick
  Labl.OnMouseDown:=@ButtonLabelMouseDown
  Labl.OnMouseUp:=@ButtonLabelMouseUp
  Labl.Parent:=Panel
  ButtonLabel[AButtonIndex]:=Labl
end;

procedure UpdateButton(AButton: TButton;AButtonIndex: integer);
begin
  ButtonLabel[AButtonIndex].Caption:=AButton.Caption
  ButtonPanel[AButtonIndex].Visible:=AButton.Visible
  ButtonLabel[AButtonIndex].Enabled:=Abutton.Enabled
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
  ButtonLabel[bidNext].Enabled:=True
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
  ButtonLabel[bidNext].Enabled:=False
end;

Procedure NoIconsLabelOnClick (Sender: TObject);
begin
WizardForm.NoIconsCheck.Checked:=Not(WizardForm.NoIconsCheck.Checked)
end;

Procedure YesRadioOnClick (Sender: TObject);
begin
WizardForm.YesRadio.Checked:=True
end;

Procedure NoRadioOnClick (Sender: TObject);
begin
WizardForm.NoRadio.Checked:=True
end;

Procedure HideAll();
begin
WizardForm.Bevel.Hide
WizardForm.Bevel1.Hide
WizardForm.MainPanel.Hide
WizardForm.BeveledLabel.Hide
WizardForm.OuterNotebook.Hide
WizardForm.InnerNotebook.Hide

WelcomeLabel1.Hide
WelcomeLabel2.Hide
LicenseLabel1.Hide
WizardForm.LicenseMemo.Hide
WizardForm.LicenseAcceptedRadio.Hide
LicenseAcceptedLabel.Hide
WizardForm.LicenseNotAcceptedRadio.Hide
LicenseNotAcceptedLabel.Hide
PasswordLabel.Hide
PasswordEditLabel.Hide
WizardForm.PasswordEdit.Hide
InfoBeforeClickLabel.Hide
WizardForm.InfoBeforeMemo.Hide
UserInfoNameLabel.Hide
WizardForm.UserInfoNameEdit.Hide
UserInfoOrgLabel.Hide
WizardForm.UserInfoOrgEdit.Hide
UserInfoSerialLabel.Hide
WizardForm.UserInfoSerialEdit.Hide
SelectDirLabel.Hide
SelectDirBrowseLabel.Hide
WizardForm.DirEdit.Hide
WizardForm.DirBrowseButton.Hide
DiskSpaceLabel.Hide
SelectComponentsLabel.Hide
WizardForm.TypesCombo.Hide
WizardForm.ComponentsList.Hide
ComponentsDiskSpaceLabel.Hide
SelectStartMenuFolderLabel.Hide
SelectStartMenuFolderBrowseLabel.Hide
WizardForm.GroupEdit.Hide
WizardForm.GroupBrowseButton.Hide
WizardForm.NoIconsCheck.Hide
NoIconsLabel.Hide
SelectTasksLabel.Hide
WizardForm.TasksList.Hide
ReadyLabel.Hide
WizardForm.ReadyMemo.Hide
StatusLabel.Hide
WizardForm.ProgressGauge.Hide
InfoAfterClickLabel.Hide
WizardForm.InfoAfterMemo.Hide
FinishedHeadingLabel.Hide
FinishedLabel.Hide

WizardForm.RunList.Hide

YesRadio.Hide
YesRadioLabel.Hide
NoRadio.Hide
NoRadioLabel.Hide
end;

Procedure InitializeSkin();
begin
ExtractTemporaryFile('WizardImage2.bmp')

WizardImage:=TBitmapImage.Create(WizardForm)
WizardImage.AutoSize:=True
WizardImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardImage2.bmp'))
WizardImage.Parent:=WizardForm

WizardForm.ClientWidth:=690
WizardForm.ClientHeight:=496
WizardForm.Font.Color:=$ffffff
WizardForm.Center

  WizardForm.BackButton.Left:=293
  WizardForm.BackButton.Top:=462
  WizardForm.BackButton.Width:=80
  WizardForm.BackButton.Height:=23

  WizardForm.NextButton.Left:=375
  WizardForm.NextButton.Top:=462
  WizardForm.NextButton.Width:=80
  WizardForm.NextButton.Height:=23

  WizardForm.CancelButton.Left:=600
  WizardForm.CancelButton.Top:=462
  WizardForm.CancelButton.Width:=80
  WizardForm.CancelButton.Height:=23

BeveledLabel:=TLabel.Create(WizardForm)
BeveledLabel.Left:=10
BeveledLabel.Top:=468
BeveledLabel.Font.Color:=clWhite
BeveledLabel.Transparent:=True
BeveledLabel.Caption:=WizardForm.BeveledLabel.Caption
BeveledLabel.Parent:=WizardForm

WizardForm.BeveledLabel.Left:=700

// wpWelcome
WelcomeLabel1:=TLabel.Create(WizardForm)
WelcomeLabel1.Left:=205
WelcomeLabel1.Top:=90
WelcomeLabel1.Width:=465
WelcomeLabel1.Height:=28
WelcomeLabel1.AutoSize:=False
WelcomeLabel1.WordWrap:=True
WelcomeLabel1.Transparent:=True
WelcomeLabel1.Font.Color:=$ffffff
WelcomeLabel1.Font.Style:=[fsBold]
WelcomeLabel1.Caption:=WizardForm.WelcomeLabel1.Caption
WelcomeLabel1.Parent:=WizardForm

WelcomeLabel2:=TLabel.Create(WizardForm)
WelcomeLabel2.Left:=205
WelcomeLabel2.Top:=130
WelcomeLabel2.Width:=465
WelcomeLabel2.Height:=200
WelcomeLabel2.AutoSize:=False
WelcomeLabel2.WordWrap:=True
WelcomeLabel2.Transparent:=True
WelcomeLabel2.Caption:=WizardForm.WelcomeLabel2.Caption
WelcomeLabel2.Parent:=WizardForm

// wpLicense
LicenseLabel1:=TLabel.Create(WizardForm)
LicenseLabel1.Left:=205
LicenseLabel1.Top:=90
LicenseLabel1.Width:=465
LicenseLabel1.Height:=28
LicenseLabel1.AutoSize:=False
LicenseLabel1.WordWrap:=True
LicenseLabel1.Transparent:=True
LicenseLabel1.Caption:=WizardForm.LicenseLabel1.Caption
LicenseLabel1.Parent:=WizardForm

WizardForm.LicenseMemo.Left:=205
WizardForm.LicenseMemo.Top:=128
WizardForm.LicenseMemo.Width:=465
WizardForm.LicenseMemo.Height:=266
WizardForm.LicenseMemo.Parent:=WizardForm

WizardForm.LicenseAcceptedRadio.Left:=205
WizardForm.LicenseAcceptedRadio.Top:=405
WizardForm.LicenseAcceptedRadio.Width:=14
WizardForm.LicenseAcceptedRadio.Height:=14
WizardForm.LicenseAcceptedRadio.Color:=clBlack
WizardForm.LicenseAcceptedRadio.Parent:=WizardForm

LicenseAcceptedLabel:=TLabel.Create(WizardForm)
LicenseAcceptedLabel.Left:=221
LicenseAcceptedLabel.Top:=405
LicenseAcceptedLabel.Transparent:=True
LicenseAcceptedLabel.Caption:=WizardForm.LicenseAcceptedRadio.Caption

LicenseAcceptedLabel.Parent:=WizardForm

WizardForm.LicenseNotAcceptedRadio.Left:=205
WizardForm.LicenseNotAcceptedRadio.Top:=425
WizardForm.LicenseNotAcceptedRadio.Width:=14
WizardForm.LicenseNotAcceptedRadio.Height:=14
WizardForm.LicenseNotAcceptedRadio.Color:=clBlack
WizardForm.LicenseNotAcceptedRadio.Parent:=WizardForm

LicenseNotAcceptedLabel:=TLabel.Create(WizardForm)
LicenseNotAcceptedLabel.Left:=221
LicenseNotAcceptedLabel.Top:=425
LicenseNotAcceptedLabel.Transparent:=True
LicenseNotAcceptedLabel.Caption:=WizardForm.LicenseNotAcceptedRadio.Caption

LicenseNotAcceptedLabel.Parent:=WizardForm

// wpPassword
PasswordLabel:=TLabel.Create(WizardForm)
PasswordLabel.Left:=205
PasswordLabel.Top:=90
PasswordLabel.Width:=465
PasswordLabel.Height:=28
PasswordLabel.AutoSize:=False
PasswordLabel.WordWrap:=True
PasswordLabel.Transparent:=True
PasswordLabel.Caption:=WizardForm.PasswordLabel.Caption
PasswordLabel.Parent:=WizardForm

PasswordEditLabel:=TLabel.Create(WizardForm)
PasswordEditLabel.Left:=205
PasswordEditLabel.Top:=124
PasswordEditLabel.Transparent:=True
PasswordEditLabel.Caption:=WizardForm.PasswordEditLabel.Caption
PasswordEditLabel.Parent:=WizardForm

WizardForm.PasswordEdit.Left:=205
WizardForm.PasswordEdit.Top:=140
WizardForm.PasswordEdit.Width:=465
WizardForm.PasswordEdit.Height:=21
WizardForm.PasswordEdit.Color:=$000000
WizardForm.PasswordEdit.Font.Color:=$ffffff
WizardForm.PasswordEdit.Parent:= WizardForm

// wpInfoBefore
InfoBeforeClickLabel:=TLabel.Create(WizardForm)
InfoBeforeClickLabel.Left:=205
InfoBeforeClickLabel.Top:=90
InfoBeforeClickLabel.Transparent:=True
InfoBeforeClickLabel.Caption:=WizardForm.InfoBeforeClickLabel.Caption
InfoBeforeClickLabel.Parent:=WizardForm

WizardForm.InfoBeforeMemo.Left:=205
WizardForm.InfoBeforeMemo.Top:=114
WizardForm.InfoBeforeMemo.Width:=465
WizardForm.InfoBeforeMemo.Height:=300
WizardForm.InfoBeforeMemo.Parent:= WizardForm

// wpUserInfo
UserInfoNameLabel:=TLabel.Create(WizardForm)
UserInfoNameLabel.Left:=205
UserInfoNameLabel.Top:=90
UserInfoNameLabel.Transparent:=True
UserInfoNameLabel.Caption:=WizardForm.UserInfoNameLabel.Caption
UserInfoNameLabel.Parent:=WizardForm

WizardForm.UserInfoNameEdit.Left:=205
WizardForm.UserInfoNameEdit.Top:=106
WizardForm.UserInfoNameEdit.Width:=465
WizardForm.UserInfoNameEdit.Height:=21
WizardForm.UserInfoNameEdit.Parent:= WizardForm

UserInfoOrgLabel:=TLabel.Create(WizardForm)
UserInfoOrgLabel.Left:=205
UserInfoOrgLabel.Top:=142
UserInfoOrgLabel.Transparent:=True
UserInfoOrgLabel.Caption:=WizardForm.UserInfoOrgLabel.Caption
UserInfoOrgLabel.Parent:=WizardForm

WizardForm.UserInfoOrgEdit.Left:=205
WizardForm.UserInfoOrgEdit.Top:=158
WizardForm.UserInfoOrgEdit.Width:=465
WizardForm.UserInfoOrgEdit.Height:=21
WizardForm.UserInfoOrgEdit.Color:=$000000
WizardForm.UserInfoOrgEdit.Font.Color:=$ffffff
WizardForm.UserInfoOrgEdit.Parent:= WizardForm

UserInfoSerialLabel:=TLabel.Create(WizardForm)
UserInfoSerialLabel.Left:=205
UserInfoSerialLabel.Top:=194
UserInfoSerialLabel.Transparent:=True
UserInfoSerialLabel.Caption:=WizardForm.UserInfoSerialLabel.Caption
UserInfoSerialLabel.Parent:=WizardForm

WizardForm.UserInfoSerialEdit.Left:=205
WizardForm.UserInfoSerialEdit.Top:=210
WizardForm.UserInfoSerialEdit.Width:=465
WizardForm.UserInfoSerialEdit.Height:=21
WizardForm.UserInfoSerialEdit.Color:=$000000
WizardForm.UserInfoSerialEdit.Font.Color:=$ffffff
WizardForm.UserInfoSerialEdit.Parent:= WizardForm

// wpSelectDir
SelectDirLabel:=TLabel.Create(WizardForm)
SelectDirLabel.Left:=205
SelectDirLabel.Top:=90
SelectDirLabel.Width:=465
SelectDirLabel.Height:=28
SelectDirLabel.AutoSize:=False
SelectDirLabel.WordWrap:=True
SelectDirLabel.Transparent:=True
SelectDirLabel.Caption:=WizardForm.SelectDirLabel.Caption
SelectDirLabel.Parent:=WizardForm

SelectDirBrowseLabel:=TLabel.Create(WizardForm)
SelectDirBrowseLabel.Left:=205
SelectDirBrowseLabel.Top:=120
SelectDirBrowseLabel.Width:=465
SelectDirBrowseLabel.Height:=28
SelectDirBrowseLabel.AutoSize:=False
SelectDirBrowseLabel.WordWrap:=True
SelectDirBrowseLabel.Transparent:=True
SelectDirBrowseLabel.Caption:=WizardForm.SelectDirBrowseLabel.Caption
SelectDirBrowseLabel.Parent:=WizardForm

WizardForm.DirEdit.Left:=205
WizardForm.DirEdit.Top:=380
WizardForm.DirEdit.Width:=370
WizardForm.DirEdit.Height:=21
WizardForm.DirEdit.Color:=$000000
WizardForm.DirEdit.Font.Color:=$ffffff
WizardForm.DirEdit.Parent:= WizardForm


    WizardForm.DirBrowseButton.Width:=80
    WizardForm.DirBrowseButton.Height:=23
    WizardForm.DirBrowseButton.Parent:= WizardForm

DiskSpaceLabel:=TLabel.Create(WizardForm)
DiskSpaceLabel.Left:=205
DiskSpaceLabel.Top:=415
DiskSpaceLabel.Transparent:=True
DiskSpaceLabel.Caption:=WizardForm.DiskSpaceLabel.Caption
DiskSpaceLabel.Parent:=WizardForm

// wpSelectComponents
SelectComponentsLabel:=TLabel.Create(WizardForm)
SelectComponentsLabel.Left:=205
SelectComponentsLabel.Top:=90
SelectComponentsLabel.Width:=465
SelectComponentsLabel.Height:=42
SelectComponentsLabel.AutoSize:=False
SelectComponentsLabel.WordWrap:=True
SelectComponentsLabel.Transparent:=True
SelectComponentsLabel.Caption:=WizardForm.SelectComponentsLabel.Caption
SelectComponentsLabel.Parent:=WizardForm

WizardForm.TypesCombo.Left:=205
WizardForm.TypesCombo.Top:=134
WizardForm.TypesCombo.Width:=465
WizardForm.TypesCombo.Height:=21
WizardForm.TypesCombo.Color:=$000000
WizardForm.TypesCombo.Font.Color:=$ffffff
WizardForm.TypesCombo.Parent:= WizardForm

WizardForm.ComponentsList.Left:=205
WizardForm.ComponentsList.Top:=158
WizardForm.ComponentsList.Width:=465
WizardForm.ComponentsList.Height:=243
WizardForm.ComponentsList.Color:=$000000
WizardForm.ComponentsList.Font.Color:=$ffffff
WizardForm.ComponentsList.Parent:= WizardForm

ComponentsDiskSpaceLabel:=TLabel.Create(WizardForm)
ComponentsDiskSpaceLabel.Left:=205
ComponentsDiskSpaceLabel.Top:=415
ComponentsDiskSpaceLabel.Transparent:=True
ComponentsDiskSpaceLabel.Caption:=WizardForm.ComponentsDiskSpaceLabel.Caption
ComponentsDiskSpaceLabel.Parent:=WizardForm

// wpSelectProgramGroup
SelectStartMenuFolderLabel:=TLabel.Create(WizardForm)
SelectStartMenuFolderLabel.Left:=205
SelectStartMenuFolderLabel.Top:=90
SelectStartMenuFolderLabel.Width:=465
SelectStartMenuFolderLabel.Height:=28
SelectStartMenuFolderLabel.AutoSize:=False
SelectStartMenuFolderLabel.WordWrap:=True
SelectStartMenuFolderLabel.Transparent:=True
SelectStartMenuFolderLabel.Caption:=WizardForm.SelectStartMenuFolderLabel.Caption
SelectStartMenuFolderLabel.Parent:=WizardForm

SelectStartMenuFolderBrowseLabel:=TLabel.Create(WizardForm)
SelectStartMenuFolderBrowseLabel.Left:=205
SelectStartMenuFolderBrowseLabel.Top:=120
SelectStartMenuFolderBrowseLabel.Width:=465
SelectStartMenuFolderBrowseLabel.Height:=28
SelectStartMenuFolderBrowseLabel.AutoSize:=False
SelectStartMenuFolderBrowseLabel.WordWrap:=True
SelectStartMenuFolderBrowseLabel.Transparent:=True
SelectStartMenuFolderBrowseLabel.Caption:=WizardForm.SelectStartMenuFolderBrowseLabel.Caption
SelectStartMenuFolderBrowseLabel.Parent:=WizardForm

WizardForm.GroupEdit.Left:=205
WizardForm.GroupEdit.Top:=380
WizardForm.GroupEdit.Width:=370
WizardForm.GroupEdit.Height:=21
WizardForm.GroupEdit.Color:=$000000
WizardForm.GroupEdit.Font.Color:=$ffffff
WizardForm.GroupEdit.Parent:= WizardForm

    WizardForm.GroupBrowseButton.Left:=378
    WizardForm.GroupBrowseButton.Top:=288
    WizardForm.GroupBrowseButton.Width:=80
    WizardForm.GroupBrowseButton.Height:=23
    WizardForm.GroupBrowseButton.Parent:= WizardForm

WizardForm.NoIconsCheck.Left:=205
WizardForm.NoIconsCheck.Top:=415
WizardForm.NoIconsCheck.Width:=13
WizardForm.NoIconsCheck.Height:=13
WizardForm.NoIconsCheck.Visible:=True
WizardForm.NoIconsCheck.Parent:= WizardForm

NoIconsLabel:=TLabel.Create(WizardForm)
NoIconsLabel.Left:=221
NoIconsLabel.Top:=415
NoIconsLabel.Transparent:=True
NoIconsLabel.OnClick:= @NoIconsLabelOnClick
NoIconsLabel.Caption:=WizardForm.NoIconsCheck.Caption
NoIconsLabel.Parent:=WizardForm

// wpSelectTasks
SelectTasksLabel:=TLabel.Create(WizardForm)
SelectTasksLabel.Left:=205
SelectTasksLabel.Top:=90
SelectTasksLabel.Width:=465
SelectTasksLabel.Height:=28
SelectTasksLabel.AutoSize:=False
SelectTasksLabel.WordWrap:=True
SelectTasksLabel.Transparent:=True
SelectTasksLabel.Caption:=WizardForm.SelectTasksLabel.Caption
SelectTasksLabel.Parent:=WizardForm

WizardForm.TasksList.Left:=205
WizardForm.TasksList.Top:=124
WizardForm.TasksList.Width:=465
WizardForm.TasksList.Height:=300
WizardForm.TasksList.Color:=$000000
WizardForm.TasksList.Font.Color:=$ffffff
WizardForm.TasksList.Parent:= WizardForm

// wpReady
ReadyLabel:=TLabel.Create(WizardForm)
ReadyLabel.Left:=205
ReadyLabel.Top:=90
ReadyLabel.Width:=465
ReadyLabel.Height:=28
ReadyLabel.AutoSize:=False
ReadyLabel.WordWrap:=True
ReadyLabel.Transparent:=True
ReadyLabel.Parent:=WizardForm

WizardForm.ReadyMemo.Left:=205
WizardForm.ReadyMemo.Top:=124
WizardForm.ReadyMemo.Width:=465
WizardForm.ReadyMemo.Height:=300
WizardForm.ReadyMemo.Color:=$000000
WizardForm.ReadyMemo.Font.Color:=$ffffff
WizardForm.ReadyMemo.Parent:= WizardForm

// wpInstalling
StatusLabel:=TLabel.Create(WizardForm)
StatusLabel.Left:=205
StatusLabel.Top:=90
StatusLabel.Transparent:=True
StatusLabel.Caption:=WizardForm.Caption +'...'
StatusLabel.Parent:=WizardForm

WizardForm.ProgressGauge.Left:=205
WizardForm.ProgressGauge.Top:=120
WizardForm.ProgressGauge.Width:=465
WizardForm.ProgressGauge.Height:=21
WizardForm.ProgressGauge.Parent:= WizardForm

// wpInfoAfter
InfoAfterClickLabel:=TLabel.Create(WizardForm)
InfoAfterClickLabel.Left:=205
InfoAfterClickLabel.Top:=90
InfoAfterClickLabel.Transparent:=True
InfoAfterClickLabel.Caption:=WizardForm.InfoAfterClickLabel.Caption
InfoAfterClickLabel.Parent:=WizardForm

WizardForm.InfoAfterMemo.Left:=205
WizardForm.InfoAfterMemo.Top:=124
WizardForm.InfoAfterMemo.Width:=465
WizardForm.InfoAfterMemo.Height:=300
WizardForm.InfoAfterMemo.Parent:= WizardForm

// wpFinished
FinishedHeadingLabel:=TLabel.Create(WizardForm)
FinishedHeadingLabel.Left:=205
FinishedHeadingLabel.Top:=90
FinishedHeadingLabel.Width:=465
FinishedHeadingLabel.Height:=28
FinishedHeadingLabel.AutoSize:=False
FinishedHeadingLabel.WordWrap:=True
FinishedHeadingLabel.Transparent:=True
FinishedHeadingLabel.Font.Color:=$ffffff
FinishedHeadingLabel.Font.Style:=[fsBold]
FinishedHeadingLabel.Caption:=WizardForm.FinishedHeadingLabel.Caption
FinishedHeadingLabel.Parent:=WizardForm

FinishedLabel:=TLabel.Create(WizardForm)
FinishedLabel.Left:=205
FinishedLabel.Top:=130
FinishedLabel.Width:=465
FinishedLabel.Height:=56
FinishedLabel.AutoSize:=False
FinishedLabel.WordWrap:=True
FinishedLabel.Transparent:=True
FinishedLabel.Caption:=WizardForm.FinishedLabel.Caption
FinishedLabel.Parent:=WizardForm

    WizardForm.RunList.Left:=0
    WizardForm.RunList.Top:=200
    WizardForm.RunList.Width:=465
    WizardForm.RunList.Height:=120
    WizardForm.RunList.Color:=$000000
    WizardForm.RunList.Font.Color:=$ffffff

YesRadio:=TRadioButton.Create(WizardForm)
YesRadio.Left:=205
YesRadio.Top:=290
YesRadio.Width:=13
YesRadio.Height:=13
YesRadio.Color:=$b58434
YesRadio.OnClick:=@YesRadioOnClick
YesRadio.Parent:=WizardForm

YesRadioLabel:=TLabel.Create(WizardForm)
YesRadioLabel.Left:=221
YesRadioLabel.Top:=290
YesRadioLabel.Transparent:=True
YesRadioLabel.Caption:=WizardForm.YesRadio.Caption
YesRadioLabel.Parent:=WizardForm

NoRadio:=TRadioButton.Create(WizardForm)
NoRadio.Left:=205
NoRadio.Top:=310
NoRadio.Width:=13
NoRadio.Height:=13
NoRadio.Color:=$b58434
NoRadio.OnClick:=@NoRadioOnClick
NoRadio.Parent:=WizardForm

NoRadioLabel:=TLabel.Create(WizardForm)
NoRadioLabel.Left:=221
NoRadioLabel.Top:=310
NoRadioLabel.Transparent:=True
NoRadioLabel.Caption:=WizardForm.NoRadio.Caption
NoRadioLabel.Parent:=WizardForm
end;

Procedure ShowPageComponents(CurPageID: Integer);
begin
Case CurPageID of

wpWelcome:
begin
WelcomeLabel1.Show
WelcomeLabel2.Show
end

wpLicense:
begin
LicenseLabel1.Show
WizardForm.LicenseMemo.Show
WizardForm.LicenseAcceptedRadio.Show
LicenseAcceptedLabel.Show
WizardForm.LicenseNotAcceptedRadio.Show
LicenseNotAcceptedLabel.Show
end

wpPassword:
begin
PasswordLabel.Show
PasswordEditLabel.Show
WizardForm.PasswordEdit.Show
end

wpInfoBefore:
begin
InfoBeforeClickLabel.Show
WizardForm.InfoBeforeMemo.Show
end

wpUserInfo:
begin
UserInfoNameLabel.Show
WizardForm.UserInfoNameEdit.Show
UserInfoOrgLabel.Show
WizardForm.UserInfoOrgEdit.Show
UserInfoSerialLabel.Show
WizardForm.UserInfoSerialEdit.Show
end

wpSelectDir:
begin
SelectDirLabel.Show
SelectDirBrowseLabel.Show
WizardForm.DirEdit.Show
WizardForm.DirBrowseButton.Show
DiskSpaceLabel.Show

end

wpSelectComponents:
begin
SelectComponentsLabel.Show
WizardForm.TypesCombo.Show
WizardForm.ComponentsList.Show
ComponentsDiskSpaceLabel.Show
end

wpSelectProgramGroup:
begin
SelectStartMenuFolderLabel.Show
SelectStartMenuFolderBrowseLabel.Show
WizardForm.GroupEdit.Show
WizardForm.GroupBrowseButton.Show

end

wpSelectTasks:
begin
SelectTasksLabel.Show
WizardForm.TasksList.Show
end

wpReady:
begin
ReadyLabel.Show
ReadyLabel.Caption:=WizardForm.ReadyLabel.Caption
WizardForm.ReadyMemo.Show
end

wpInstalling:
begin
StatusLabel.Show
WizardForm.ProgressGauge.Show
end

wpInfoAfter:
begin
InfoAfterClickLabel.Show
WizardForm.InfoAfterMemo.Show
end

wpFinished:
begin
FinishedHeadingLabel.Show
FinishedLabel.Show
FinishedLabel.Caption:=WizardForm.FinishedLabel.Caption
WizardForm.RunList.hide
//YesRadio.Checked:=True
//YesRadio.Show
//YesRadioLabel.Show
//NoRadio.Show
//NoRadioLabel.Show
end
end;
end;

function InitializeSetup(): Boolean;
var
  ResultCode: Integer;
  ResultStr:string;
begin
Result:=True;
begin
  If RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Inno Setup Scripting v5.1 Russian Edition_is1', 'UninstallString', ResultStr)
then
 begin
  If ResultStr<>''
then
 begin
  ResultStr:=RemoveQuotes(ResultStr);
  if MsgBox('Setup has detected that this program is already installed.' #13#13 'Would you like to uninstall the existing copy before continuing?', mbConfirmation, MB_YESNO) = idYes
then
  if not Exec(ResultStr, '/silent', '', SW_SHOW, ewWaitUntilTerminated, ResultCode)
then
  MsgBox('Uninstall Error. ' #13#13 '' + SysErrorMessage(ResultCode) + '.' #13#13 'Probably, uninstall files was moved, removed or renamed.', mbError, MB_OK);
end;
end;
end;
end;

procedure CancelButtonClick(CurPage: Integer; var Cancel, Confirm: Boolean);
begin
 Cancel:=False;
 Confirm:=False;
if MsgBox('Are you shure you want to cancel Setup?', mbError, MB_YESNO) = idYes
 then
  Cancel:=true;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  HideAll
  ShowPageComponents(CurPageID)
  UpdateButton(WizardForm.BackButton,bidBack)
  UpdateButton(WizardForm.NextButton,bidNext)
  UpdateButton(WizardForm.CancelButton,bidCancel)
  UpdateButton(WizardForm.DirBrowseButton,bidDirBrowse)
  UpdateButton(WizardForm.GroupBrowseButton,bidGroupBrowse)
end;

Procedure InitializeWizard();
var
  Name1: string;
begin
  ExtractTemporaryFile('WizardImage2.bmp')
  ExtractTemporaryFile('button2.bmp')
  ExtractTemporaryFile('Transparent Hand.cur')
  ExtractTemporaryFile('Transparent Arrow.cur')
  ExtractTemporaryFile('BASSMOD.dll');
  ExtractTemporaryFile('TWINKLE.IT');
 
  InitializeSkin

  NewCursor:= LoadCursorFromFile(ExpandConstant('{tmp}\Transparent Hand.cur'));
  NewCursor1:= LoadCursorFromFile(ExpandConstant('{tmp}\Transparent Arrow.cur'));
  OldCursor:= SetClassLong(WizardForm.NextButton.Handle, GCL_HCURSOR, NewCursor);
  OldCursor:= SetClassLong(WizardForm.Handle, GCL_HCURSOR, NewCursor1);
  OldCursor:= SetClassLong(WizardForm.MainPanel.Handle, GCL_HCURSOR, NewCursor);

  WizardForm.BackButton.Left:=293
  WizardForm.BackButton.Width:=ButtonWidth
  WizardForm.BackButton.Height:=ButtonHeight

  WizardForm.NextButton.Left:=375
  WizardForm.NextButton.Width:=ButtonWidth
  WizardForm.NextButton.Height:=ButtonHeight

  WizardForm.CancelButton.Left:=600
  WizardForm.CancelButton.Width:=ButtonWidth
  WizardForm.CancelButton.Height:=ButtonHeight

  WizardForm.DirBrowseButton.Top:=379
  WizardForm.DirBrowseButton.Left:=580
  WizardForm.DirBrowseButton.Width:=ButtonWidth
  WizardForm.DirBrowseButton.Height:=ButtonHeight

  WizardForm.GroupBrowseButton.Top:=379
  WizardForm.GroupBrowseButton.Left:=580
  WizardForm.GroupBrowseButton.Width:=ButtonWidth
  WizardForm.GroupBrowseButton.Height:=ButtonHeight

  LoadButtonImage(WizardForm.BackButton,bidBack)
  LoadButtonImage(WizardForm.NextButton,bidNext)
  LoadButtonImage(WizardForm.CancelButton,bidCancel)
  LoadButtonImage(WizardForm.DirBrowseButton,bidDirBrowse)
  LoadButtonImage(WizardForm.GroupBrowseButton,bidGroupBrowse)
 
    if not BASSMOD_Init(-1,44100,0)
      then
          begin
            BASSMOD_Free;
          end
        else
      Name1:=ExpandConstant('{tmp}\TWINKLE.IT');
  if BASSMOD_MusicLoad(FALSE, PChar(Name1), 0, 0, BASS_MUSIC_LOOP or BASS_MUSIC_SURROUND or 32 or 1) then
  BASSMOD_MusicPlay;
end;

procedure DeInitializeSetup();
begin
BASSMOD_MusicStop;
BASSMOD_Free();
SetSystemCursor(OldCursor, OCR_NORMAL);
end;

тоже нифига не понял

Johny777 23-03-2012 16:02 1885361

by_gangster,
убирай пожалуйста код дополнительно в конструкцию [more"][code"] сдесь твой код[/code"][/more"] без кавычек
пример из
Цитата:

Цитата El Sanchez
Example_RawDataResource.iss »

жирным выделено то для чего курсор используется в этом примере
(только курсор)
читать дальше »
Код:

#ifdef IS_ENHANCED
  #if (Pos('ee', IS_Ver_Str) >= 1)
    #define IS_Version_ee
  #endif
#else
  #error Enhanced edition of Inno Setup (restools) is required to compile this script
#endif

#ifdef UNICODE
  #define A "W"
#else
  #define A "A"
#endif

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
SolidCompression=yes
Compression=lzma/ultra
OutputDir=userdocs:Inno Setup Examples Output


[Files]
Source: cursor.ani; Flags: dontcopy

[  Code]
#ifdef IS_Version_ee
function LoadCursorFromFile(FileName: String): Cardinal; external 'LoadCursorFromFile{#A}@user32 stdcall';
function DeleteObject(p1: Longword): BOOL; external 'DeleteObject@gdi32.dll stdcall';

const
  MyCursor = 101;
#endif


var
  hcur: Cardinal;
 
procedure InitializeWizard();
begin
#ifdef IS_Version_ee
  ExtractTemporaryFile('cursor.ani');
  hcur := LoadCursorFromFile(ExpandConstant('{tmp}\cursor.ani'));
  Screen.Cursors[MyCursor] := hcur;
#endif


  with WizardForm do
  begin
    AutoScroll := False;
    ClientHeight := ScaleY(464);
    ClientWidth := ScaleX(620);

#ifdef IS_Version_ee
    Cursor := MyCursor;
#endif
  end;
end;

procedure DeinitializeSetup();
begin
#ifdef IS_Version_ee
  DeleteObject(hcur);
#endif
end;


cursor.ani лежит в папке ....\Inno Setup 5\Examples

Ivan_009 23-03-2012 19:19 1885445

как прикрутить скрипт для проверки системных требований если у меня черный инсталл почемуто не отображается нормально какой цвет надо сделать заранее спасибки............................................................................................ .......

Johny777 23-03-2012 19:47 1885456

Ivan_009,
давай смотреть вместе
кусок
читать дальше »
Код:

  HWREQSound1:= TMemo.Create(HWREQPage)
  HWREQSound1.SetBounds(ScaleX(AFirstLeft), ATop+(ScaleY(10)+AHeight)*2, AFirstWidth, AHeight);
  HWREQSound1.Alignment:= taCenter;
  HWREQSound1.Font:= HWREQFont;
  HWREQSound1.ReadOnly:= True;
  HWREQSound1.HideSelection:= True;
  HWREQSound1.Text:= CustomMessage('HWREQSoundCard');
  HWREQSound1.Color:= $C9C9C9;
  HWREQSound1.Parent:= AParent;


мы видим настройку
HWREQSound1.Color:= $C9C9C9;
меняем
HWREQSound1.Color:= clBlack;

Ivan_009 23-03-2012 19:53 1885459

Для такого скина

Johny777 23-03-2012 20:04 1885463

Цитата:

Цитата Ivan_009
Для такого скина »

не понимаю
какой цвет
где именно?
с чёрным со читается жёлтый. Я б все TMemo сделал бы жёлтым
если стандартные цвета типа clBlue или clBlack не подходят, то берёшь фотошоп
пипеткой образец цвета и смотришь
пример

получаем
cc9900
для инно меняем местами первые две буквы(цифры) с последними
получаем
Color:= $0099cc

Ivan_009 23-03-2012 20:11 1885465

Ну типа так чтобы а если не соответствует системным требованиям то выделялось красным цветом

Ivan_009 23-03-2012 20:40 1885477

Да вот если не трудно один вопрос как этот модуль одтелить тоесть если он не нужен то закоментить.... зараннее большое прибольшое спасибо.............

Johny777 23-03-2012 20:46 1885481

Ivan_009,
модуль это кусок скрипта
он подключён у тебя в основном скрипте через препроцессор
#include "HWREQ_Module.iss"
просто закомментируй ///

Ivan_009 23-03-2012 20:55 1885489

Ошибка

Johny777 23-03-2012 21:04 1885495

Ivan_009,
ну
модуль отключил, а в нём было:
procedure HWREQ_CreatePanelSimple(AFont: TFont);
var
.....
begin
....
end;
откуда инно знать, что такое HWREQ_CreatePanelSimple(nil) в основном скрипте?
здесь не только модуль, но и строка в InitializeWizard(), относящаяся туда же. Ты её тоже закоментируй
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
касательно смены цвета там же
смотри
читать дальше »
Код:

  if not HWREQ_CompareProcessor then begin Test:= False; HWREQProc2.Color:= $CCCCFF; end;
  if not HWREQ_CompareVideo then begin Test:= False; HWREQVid2.Color:= $CCCCFF; end;
  if not HWREQ_CompareSound then begin Test:= False; HWREQSound2.Color:= $CCCCFF; end;
  if not HWREQ_CompareRAM then begin Test:= False; HWREQRam2.Color:= $CCCCFF; end;
  if not HWREQ_CompareWindows then begin Test:= False; HWREQWin2.Color:= $CCCCFF; end;


Iska 23-03-2012 21:09 1885497

Цитата:

Цитата Johny777
убирай пожалуйста код дополнительно в конструкцию [more"][code"] сдесь твой код[/code"][/more"] без кавычек »

Использование тэга «noparse»…

Для показа тэгов BBCode «как есть» можно использовать тэг «noparse», например:
Цитата:

убирай пожалуйста код дополнительно в конструкцию [more][code]Здесь твой код[/code][/more]
— обработка тэгов BBCode, вложенных внутрь тэга «noparse», не ведётся.

Ivan_009 23-03-2012 21:17 1885501

Johny777 спасибо разобрался что к чему

rasim933 23-03-2012 23:15 1885558

Такая ситуация. У меня есть 11 игр. При помощи AutoPlay Media Studio собрал все эти игры в антологию с автораном. Всё это весит 18 гигов. Как-то можно разбить это всё на 3 или 4 dvd5 диска с помощью Inno Setup?

Johny777 23-03-2012 23:48 1885576

rasim933,
[Setup]
DiskSpanning=true
DiskSliceSize=1566000000
SlicesPerDisk=4

rasim933 23-03-2012 23:54 1885578

Щяс проверю.

Ivan_009 24-03-2012 01:19 1885611

Что за ошибка вот скрипт

Ivan_009 24-03-2012 01:20 1885612

скрипт

Johny777 24-03-2012 01:29 1885615

Ivan_009,
ты бы не мог пожалуйста не писать сообщения одно за другим, а отредактировать предыдущее?
это не чат!
скрин с ошибкой можно залить на тот же rghost
или скопировать текст из окна ошибки сочетанием клавиш ctrl + c
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
duplicate - дубликат
identifier - структура данных
function GetSystemMetrics.... уже где-то есть
Цитата:

Цитата Johny777
дубликат »

значит больше раз чем нужно
сотри лишнюю строку
(возможно в модуле)

Ivan_009 24-03-2012 01:51 1885619

А как обьеденить в одну функцию

Gnom_aka_Lexander 24-03-2012 12:19 1885733

Цитата:

Цитата Ivan_009
А как обьеденить »

Эта функция берется из внешней dll, поэтому нужно не объединять, а просто удалить одну из них.

rasim933 24-03-2012 15:49 1885814

Сделал. Получилось не как я хотел.

Собранную антологию через AutoPlay Media Studio, начал упаковывать через Inno Setup. В конце получилось так, что сначала распаковывалась вся антология, а затем из этой распакованной антологии надо было установливать игры.

Можно как-то сделать так, чтоб сразу началась установка из антологии а не распоковка антологии?

Iska 24-03-2012 16:05 1885824

rasim933, сначала, безо всяких AutoPlay Media Studio, готовите инсталляцию посредством Inno Setup, разбитую на потребное количество дисков (не забыв оставить на диске место под будущий Autorun), и лишь затем уже создаёте Autorun посредством AutoPlay Media Studio, из которого и будет запускаться созданная инсталляция.

Ivan_009 24-03-2012 16:09 1885826

Можно пример текструированья прогресс бара

Johny777 24-03-2012 16:25 1885830

Ivan_009,
1. через ботву. В примерах есть (в директории установки Inno Ultra ...Inno Setup 5\Modules\South\botva2_example\progressbar_example.iss )
2. в шапке пример замены цвета стандартного прогресбара
3. Используй скин, тк проще всего

rasim933 24-03-2012 17:11 1885853

Цитата:

Iska
, хоршая идей, сеёчас проверю её.

Ivan_009 24-03-2012 20:20 1885922

помогите пожалуйста текструировать прогресс бар через ботву к этому скрипту

rasim933 24-03-2012 21:16 1885945

Или я идиот или что-то пошло нетак.

Собрал я все игры через Inno Setup, получился инсталятор, который распаковывает все игры, котрые потом ещё устанавливать нужно. Как бЭ, это неустраивает меня.

Есть ещё какие-то предложния:?

Gnom_aka_Lexander 24-03-2012 21:19 1885947

Чего уж проще-то? Каждую игру отдельно пакуешь в Inno Setup-инсталлятор, а в авторане на AutoPlay Media Studio прописываешь на каком диске, какая игра лежит и при нажатии на кнопку, просишь этот диск вставить. По моему, это первое, что должно прийти в голову.

rasim933 24-03-2012 21:24 1885951

Нет смылсла какждую игры повторно упаковывать через Inno. Ведь каждая игры уже упакованы в инстолятор. Я все игры собрал вместе. И это всё занимает 18 гигов. Записывать отдельные игры на диски меня неустраивает. Через общий авторан прикольней получится.

Кстати, я незнаю как прописать в AMS, чтоб он просил нужный диск. Поэтому ищю помощи в Inno.

Gnom_aka_Lexander 24-03-2012 21:31 1885953

Цитата:

Цитата rasim933
Записывать отдельные игры на диски меня неустраивает »

Эммм.. ты расчитываешь разместить 18 гигабайт на одном диске?
Можно и на инно авторан сделать, это не сложно, в принципе.

rasim933 24-03-2012 21:37 1885960

Ненет! 18 гио на ё1 диске. нет. Я хочу их разделить на 4 диска. В моём случае, авторан вот такой: . Я неуверен что подобное можно сделать в иннго.

Gnom_aka_Lexander 24-03-2012 22:04 1885978

Цитата:

Цитата rasim933
Я неуверен что подобное можно сделать в иннго. »

В инно можно все!
Ну, или почти все :) А чего нельзя, но очень хочется, то все равно можно.
читать дальше »
Код:

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
  Cancel := True;
end;

procedure NewButtonClick(Sender: TObject);
begin
  case TNewButton(Sender).Tag of
    0: MsgBox('Вы нажали кнопку 1',mbInformation,MB_OK);
    1: MsgBox('Вы нажали кнопку 2',mbInformation,MB_OK);
    2: MsgBox('Вы нажали кнопку 3',mbInformation,MB_OK);
    3: MsgBox('Вы нажали кнопку 4',mbInformation,MB_OK);
    4: MsgBox('Вы нажали кнопку 5',mbInformation,MB_OK);
    5: MsgBox('Вы нажали кнопку 6',mbInformation,MB_OK);
    6: MsgBox('Вы нажали кнопку 7',mbInformation,MB_OK);
    7: WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
  end;
end;

procedure InitializeWizard();
Var
  i:Integer;
begin
  with WizardForm do
  begin
    AutoScroll := False;
    ClientHeight := ScaleY(260);
    ClientWidth := ScaleX(190);

    Bevel.Hide;
    OuterNotebook.Hide;
    NextButton.Hide;
   
    for i:=0 to 7 do
    begin
      with TNewButton.Create(WizardForm) do
      begin
        Parent := WizardForm;
        SetBounds(ScaleX(10),ScaleY(10+i*30),ScaleX(170),ScaleY(25));
          case i of
            0: Caption := 'Кнопка 1';
            1: Caption := 'Кнопка 2';
            2: Caption := 'Кнопка 3';
            3: Caption := 'Кнопка 4';
            4: Caption := 'Кнопка 5';
            5: Caption := 'Кнопка 6';
            6: Caption := 'Кнопка 7';
            7: Caption := 'Выход';
          end;
        OnClick := @NewButtonClick;
        Tag := i;
      end;
    end;
  end;
end;


rasim933 24-03-2012 22:18 1885989

А можно кнкретней? Я несмогу это всё перечитать....

Gnom_aka_Lexander 24-03-2012 22:25 1885994

Там по минимуму - восемь кнопок и обработчик для каждой с примером выполнения команды. Команды вместо меседжбоксов свои вставляй и пользуйся. Ну и надписи на кнопках - надеюсь, понятно, где их поменять?

rasim933 24-03-2012 22:36 1886005

К сожалению, я с эти вообще незнаком. Сейчас я попробрую полазить в литературе.

Нашёл вроде вот это. Это пойдёт доя кнопки?
читать дальше »
Цитата:

[Setup]
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=userdocs:Test.

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

[Files]
;Изображение размером 320х23
Source: button2.bmp; DestDir: {tmp}; Flags: dontcopy
[code]
const
ButtonWidth = 80;
ButtonHeight = 23;

var
WizardLabel: TLabel;
ButtonPanel: array of TPanel;
ButtonImage: array of TBitmapImage;
ButtonLabel: array of TLabel;
UsedButtons: array of TButton;
ButtonsCount: Integer;

procedure ButtonLabelClick(Sender: TObject);
var Button: TButton; n, i: Integer;
begin
i:= TLabel(Sender).Tag; ButtonImage[i].Left:= 0
for n:=0 to (ButtonsCount-1) do begin
if i = n then Button:= UsedButtons[n];
end;
Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n, I: Integer;
begin
I:=TLabel(Sender).Tag;
//Сначала восстанавливаем картинку у всех кнопок, так надо иначе могут быть глюки
for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end;
//Теперь собственно ставим нужную картинку
if (ButtonLabel[i].Enabled)and(ButtonImage[i].Left <> -ButtonWidth*2) then begin ButtonImage[i].Left:= -ButtonWidth; end;
end;

procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n: Integer;
begin
//Т.к Sender'ом выступает WizardLabel то не получится испльзовать индекс кнопки
for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end;
end;

procedure LoadButtonImage(AButton: TButton);
var n: Integer;
begin
n:=ButtonsCount; SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1); SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1); UsedButtons[n]:= AButton;

ButtonPanel[n]:=TPanel.Create(WizardForm)
ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height)
ButtonPanel[n].Tag:= n
ButtonPanel[n].Enabled:= AButton.Enabled
ButtonPanel[n].Parent:=AButton.Parent

ButtonImage[n]:=TBitmapImage.Create(WizardForm)
ButtonImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(320), ScaleY(23))
ButtonImage[n].Enabled:=False
ButtonImage[n].Bitmap.LoadFromFile(ExpandConstant('{tmp}\Button2.bmp'))
ButtonImage[n].Parent:=ButtonPanel[n]

with TLabel.Create(WizardForm) do begin
Tag:=n
Parent:=ButtonPanel[n]
Width:=AButton.Width
Height:=AButton.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseMove:=@ButtonLabelMove
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end

ButtonLabel[n]:=TLabel.Create(WizardForm)
ButtonLabel[n].Autosize:=True
ButtonLabel[n].Alignment:=taCenter
ButtonLabel[n].Tag:=n
ButtonLabel[n].Enabled:= AButton.Enabled
ButtonLabel[n].Transparent:=True
ButtonLabel[n].Font.Color:=clWhite
ButtonLabel[n].Caption:=AButton.Caption
ButtonLabel[n].OnClick:=@ButtonLabelClick
ButtonLabel[n].OnDblClick:=@ButtonLabelClick
ButtonLabel[n].OnMouseMove:=@ButtonLabelMove
ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown
ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp
ButtonLabel[n].Parent:=ButtonPanel[n]

ButtonsCount:= ButtonsCount+1
end;

procedure UpdateButtons();
var n: Integer;
begin
for n:=0 to ButtonsCount-1 do begin
ButtonLabel[n].Caption:=UsedButtons[n].Caption
ButtonPanel[n].Visible:=UsedButtons[n].Visible
if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0;
ButtonLabel[n].Enabled:= UsedButtons[n].Enabled;
ButtonPanel[n].Enabled:= UsedButtons[n].Enabled;
//Ставим Left и Top лейбла соразмерно размеру лейбла
ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку активной
WizardForm.NextButton.Enabled:= True;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку неактивной
WizardForm.NextButton.Enabled:= False;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons()
end;

procedure InitializeWizard();
begin
WizardLabel:= TLabel.Create(WizardForm)
WizardLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(WizardForm.Width), ScaleY(WizardForm.Height))
WizardLabel.Transparent:= True;
WizardLabel.AutoSize:=false;
WizardLabel.OnMouseMove:=@WizardLabelMove
WizardLabel.Parent:= WizardForm;

WizardForm.BackButton.Width:= ButtonWidth
WizardForm.BackButton.Height:= ButtonHeight

WizardForm.NextButton.Width:= ButtonWidth
WizardForm.NextButton.Height:= ButtonHeight

WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:= ButtonHeight

WizardForm.DirBrowseButton.Left:=ScaleX(337)
WizardForm.DirBrowseButton.Width:= ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight

WizardForm.GroupBrowseButton.Left:=ScaleX(337)
WizardForm.GroupBrowseButton.Width:= ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick

WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button2.bmp')
LoadButtonImage(WizardForm.BackButton)
LoadButtonImage(WizardForm.NextButton)
LoadButtonImage(WizardForm.CancelButton)
LoadButtonImage(WizardForm.DirBrowseButton)
LoadButtonImage(WizardForm.GroupBrowseButton)
end;

procedure CurPageChanged(CurPageID: Integer);
begin
UpdateButtons()
end;

Gnom_aka_Lexander 24-03-2012 22:46 1886012

Цитата:

Цитата rasim933
Это пойдёт доя кнопки? »

Это пример текстурирования кнопки битмапами. Если ты считаешь, что осилишь этот пример и тебе нужны именно текстурированные кнопки, то вполне пойдет. Если тебе нужно просто создать кнопки и обработать их клики, как у тебя на скрине, то моего примера больше, чем достаточно.

rasim933 24-03-2012 23:08 1886023

Лучьше твой пример. Но, ведь я незнаю как именно по твоему примеру делать кнопки(((( Если можено, то пришли пожалста сюда коды кнопок.

Johny777 25-03-2012 00:05 1886058

rasim933,
для начала убери пожалуйста свой код на пол страницы в [more][code] твой код [/code][/more]

и у меня вопрос
дисков 4?
а где авторан лежит?
если на каждом, то это малость странно. Ладно ты пишешь на блюрей, но хочешь чтоб каждая игра имела свой инсталлер.
если всё таки на всех дисках лежит одинаковый авторан, то проще всего вести поиск файла в {src}\game_1.exe и если он существует, то кнопка активна, а другие нет
в противном случае нужно копировать авторан на комп (ведь если нужная игра не на диске и нужно вставить другой, то активная копия авторана закроется) и вести поиск вроде {drive:{src}}
если у тебя setup.exe один, а bin фалы разбиты на диски, то при выборе компонента (игры) инно сам попросит вставить диск и причём здесь тогда авторан?
короче я не рублю
скажи как оно должно работать и возможно тогда будет легче тебе помочь

rasim933 25-03-2012 00:19 1886069

Я хоч сделать 4 диска. Вот скрин всех файлов: . Сечас, все файлы по папкам распиханы. Пока дисков нет.

Цитата:

Цитата Johny777
и убери пожалуйста свой код на пол страницы в
читать дальше »
Код:

твой код
»

Теперь буду знать как это делается)))))

Johny777 25-03-2012 00:32 1886074

rasim933,
ты не ответил на мой вопос
как оно должно работать пусть на твоём текущем авторане?
куда и как запишешь?
что должно запускать что и откуда?
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
мой тебе совет. На каждый двухслойный диск свой авторан, сколько бы игр на нём не лежало
от 4 старых до 1 новой на диск

rasim933 25-03-2012 01:01 1886091

1 *.exe файл авторана на первом диске, на остальных дисках, другие файлы. Соберу всё и запишу на 4 DVD5 диска. Сую первый диск, запускается авторан, жму на кнопу, требует диск 2. сую диск 2, жму на кнопку, установка начинается. авторан запускается с 1 диска.

Johny777 25-03-2012 01:19 1886100

Цитата:

Цитата rasim933
другие файлы »

а именно?
Цитата:

Цитата rasim933
требует диск 2. сую диск 2, жму на кнопку »

Скажи сколько установщиков у тебя?
Если один, то запрос дика это работа инно и авторан тут никаким боком
вывод
если инсталяторов много, то авторан с кучей кнопок это сложно (для меня), тк игры на разных дисках.
Если установщик один, а в нём много игр, то опять же аторан нужен, но не такой, тк в конечном итоге выбор игры осуществляется в самом инсталлере а не через авторан

rasim933 25-03-2012 01:47 1886117

Описать про другие файлы несмогу. Вот картинки -

1 картинка со всеми файлами - ,
2 картинка 1 папки -
3 картинка 2 папки - .

У меня 10 игр, у каждой игры есть свой екзешник (*.exe).
При нажатии одной кнопки в антолгии, запускается экзешник (*.exe) одной игры.

У меня такая фигня -

Johny777 25-03-2012 01:59 1886122

rasim933,
ну теперь понятно
завтра попробую сделать

rasim933 25-03-2012 02:00 1886123

УРРААААААРАРА!!!! Спасибо)))))) Наконец-то я смог нормально обьяснит ь)))) Буду ждать)))

Johny777 25-03-2012 04:23 1886145

rasim933,
вот
http://rghost.ru/37205735
____________________________функционал:
я не знаю где и как ты раскидаешь игры, но это не важно.
на авторане 10 кнопок + кнопка "выход"
каждая их 10 запускает свой инсталлер из внешней папки
если какого-то инталлера нет, то кнопка отвечающая за его запуск не активна
____________________________внешне:
1. добавил скин
2. добавил фон
3. анимированный курсор на кнопках

PS: всё что тебе надо настроить это строки для каждой игры.
например:

#define Button_1 "Spider-Man (PC)"
#define Path_1 "{src}\1 Spider-Man - 1[PC]\setup.exe"
,
где "Spider-Man (PC)" - название кнопки и "{src}\1 Spider-Man - 1[PC]\setup.exe" - это путь к инсталлеру той самой игры относительно расположения авторана

Iska 25-03-2012 04:59 1886149

Johny777, я тоже изначально понял так, что коллега rasim933 пересобрал каждую игру под InnoSetup и задача стоит в том, чтобы: а) сделать из кучи отдельных инсталляций InnoSetup одну единую (например, указав каждую игру отдельной задачей в инсталляции) и б) создать и прилепить к диску Autorun, который будет рисовать красивые картинки и запускать инсталляцию с заданными параметрами в зависимости от выбранных игр. Как оказалось, я ошибался в исходных данных.

rasim933 25-03-2012 05:20 1886150

Ок. ЩЯс проверю.

Johny777, Гениально!!

Боже! Теперь прога требует ISSP. Ааааа. Теперь искать надо.

Gnom_aka_Lexander 25-03-2012 09:28 1886180

Цитата:

Цитата rasim933
Если можено, то пришли пожалста сюда коды кнопок. »

читать дальше »
Код:

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);// Встроенная процедура
begin
  Confirm := False; // убираем окно потверждения нажатия на кнопку отмены
  Cancel := True;  // Разрешаем выход
end;

procedure NewButtonClick(Sender: TObject); // Обработчик кнопок.
begin
  case TNewButton(Sender).Tag of // Узнаем, какая кнопка нажата, по ее тегу
    0: MsgBox('Вы нажали кнопку 1',mbInformation,MB_OK);
    1: MsgBox('Вы нажали кнопку 2',mbInformation,MB_OK);
    2: MsgBox('Вы нажали кнопку 3',mbInformation,MB_OK);
    3: MsgBox('Вы нажали кнопку 4',mbInformation,MB_OK);
    4: MsgBox('Вы нажали кнопку 5',mbInformation,MB_OK);
    5: MsgBox('Вы нажали кнопку 6',mbInformation,MB_OK);
    6: MsgBox('Вы нажали кнопку 7',mbInformation,MB_OK);
    7: WizardForm.CancelButton.OnClick(WizardForm.CancelButton);
  end;
end;

procedure InitializeWizard();
Var
  i:Integer; // локальная переменная, с ее помощью запустим цикл
begin
  with WizardForm do // Делаем сразу общее обращение (минимальноя оптимизация, но торморза из мелочей собираются)
  begin
    AutoScroll := False;
    ClientHeight := ScaleY(260); // размер в высоту
    ClientWidth := ScaleX(190); // размер в ширину

    OuterNotebook.Hide; //Скрываем основной слой, на котором лежат почти все элементы
    Bevel.Hide;  // Скрываем полоску внизу инсталла, чтоб не маячила
    NextButton.Hide;  // Скрываем кнопку далее, чтоб нельзя было добраться до нее табом
   
    for i:=0 to 7 do // Запускаем цикл от 0 до 7, то-есть то, что внутри цикла, будет сделано 8 раз
    begin
      with TNewButton.Create(WizardForm) do // Собственно создаем кнопку
      begin
        Parent := WizardForm;  // указываем где ей лежать, в данном случае - окно инсталлятора Inno
        SetBounds(ScaleX(10),ScaleY(10+i*30),ScaleX(170),ScaleY(25)); // Задаем координаты и размеры 10+i*30 - тут простая математика 10 от верха будет первая кнопка, остальные лягут с интервалом в 30, в зависимости от того, чему равна локольная переменная I в данный момент
          case i of // тут задаем текст кнопки, в зависимости от того, какая из них создается в данный момент
            0: Caption := 'Кнопка 1';
            1: Caption := 'Кнопка 2';
            2: Caption := 'Кнопка 3';
            3: Caption := 'Кнопка 4';
            4: Caption := 'Кнопка 5';
            5: Caption := 'Кнопка 6';
            6: Caption := 'Кнопка 7';
            7: Caption := 'Выход';
          end;
        OnClick := @NewButtonClick; // Адрес обработчика нажатия на кнопку.
        Tag := i; // очень важно не забыть указать тег, поскольку создаем объект неименованый. Тег будет i.
      end;
    end;
  end;
end;

Вот, вроде достаточно подробно описал.

Johny777 25-03-2012 11:36 1886236

Лександер,
спасибо!
возьму твой пример
мне как раз на одной из страниц много кнопок надо, а код у тебя короткий
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Теперь у меня вопрос
допустим у меня свой кастомный(!) чекбокс для установки директикса и появляется он если снаружи есть директ икс
под ним идёт такой же, но только для визуала
ниже идут чекбоксы с самоизвлекающимися рахивами, собержащими в себе обнновления и появление их опять же зависит от двух факторов: 1 отмечен нужный компонент, 2 есть ли снаружи архив.

все эти чекбоксы очень нестабильны в своём появлении и в конечном итоге если какого то нет, то на форме они будут создаваться через однин или через 2
вопрос
как сделать добавление (какие добавятся в зависимости от...) ровно в столбик с расстоянием скажем в 10 пикселем между друг другом по вертикали
вот как я сделал пока что только с одним чекбоксом
читать дальше »
Код:

 
    /// создание формы звдач /// часть 2 из 2 /// начало
    begin
      TForm := CreateCustomForm();
      TForm.BorderIcons := [];
      // TForm.ClientWidth := ScaleX(256);
      // TForm.ClientHeight := ScaleY(256);
      TForm.Caption := 'Tasks';
      TForm.SetBounds(WizardForm.Left-TForm.Width-8  , WizardForm.Top, ScaleX(256), ScaleY(410));
      TForm.Color := clWindow;

      OKButton := TNewButton.Create(TForm);
      OKButton.Parent := TForm;
      OKButton.Width := ScaleX(75);
      OKButton.Height := ScaleY(23);
      OKButton.Left := TForm.ClientWidth - ScaleX(75 + 6 + 75 + 10);
      OKButton.Top := TForm.ClientHeight - ScaleY(23 + 10);
      OKButton.Caption := 'OK';
      OKButton.OnClick := @FormClose;
   
      TForm.ActiveControl := OKButton;
      /// задачи на форме /// начало
      If FileExists(ExpandConstant('{src}\outer\DirectX\DXSETUP.exe')) then
        begin
        DirectX_Checkbox := TCheckBox.Create(TForm);
          with DirectX_Checkbox do
          begin
            Parent := TForm;
            Caption := 'установить DirectX';
            Left := ScaleX(8);
            Top := ScaleY(8);
            Width := ScaleX(300);
            Height := ScaleY(15);
            Checked := False;
          end;
        end;
      /// конец
      TForm.Repaint;
    end;
    /// конец


для этой формы есть кнопка
читать дальше »
Код:


/// создание формы звдач /// часть 1 из 2 /// начало
var
  TForm: TSetupForm;
  OKButton, CancelButton: TNewButton;
  DirectX_Checkbox : TCheckBox;
 
function Run_DirectX: Boolean;
 begin
  Result:=DirectX_Checkbox.Checked;
  end;
 
procedure FormButtonClick(Sender: TObject);
begin
 TForm.Show;
end;
procedure FormClose(Sender: TObject);
begin
 TForm.Hide;
end;
/// конец


Gnom_aka_Lexander 25-03-2012 12:10 1886256

Johny777, Создавай объект NewCheckListBox. пример создания и добавления элементов можно посмотреть в Example_NewCheckListBox.iss. при его заполнении нужно сперва удалить все элементы : CheckListBox.Items.Free;
Только хоть массивом в цикле, хоть чеклистбоксом, все равно нужно проверку довольно сложную делать.
Еще вариант - создать сразу все чекбоксы, при сокрытии все остальные чекбоксы сдвигать вверх на заданный шаг.
Цитата:

Цитата Johny777
расстоянием скажем в 10 пикселем »

Высота по умолчанию - 14, значит шаг будет 24 у тебя.

Johny777 25-03-2012 15:56 1886378

Цитата:

Цитата Лександер
при сокрытии все остальные чекбоксы сдвигать вверх на заданный шаг. »

это то и проблема
логики не хватает
или прописывать 30-40 комбинаций для (у меня 6-7 задач максимум)
дыры будут, а от всяких ListBox ов у себя в скрипте отказался, тк с отдельными элементами работать легче
да и при скине чекбоксы в ListBox-е виндовсовские а не со скина,
ладно
думаю как на авторане можно сделать просто неактивными

Ivan_009 25-03-2012 18:24 1886475

Какая фукция в ISDone вызывает откат установки подскажите пожалуйста

Ivan_009 25-03-2012 20:23 1886550

Как мне сменить надпись на установить

Johny777 25-03-2012 22:42 1886671

Ivan_009,
идёшь в директорию ...\Inno Setup 5\Languages
в ней открываешь блокнотом Russian.isl, а там весь диалог инсталла, расписанный по разделам
; *** "Select Additional Tasks" wizard page
SelectTasksLabel2=Выберите дополнительные задачи, которые должны выполниться при установке [name], после этого нажмите «Далее»:
....
из справки мы узнаём о секции [Messages] (Секция [Messages] используется для определения текста сообщений в инсталляторе и деинсталляторе.) и получаем:
читать дальше »

Код:

[Messages]
SelectTasksLabel2=Выберите дополнительные задачи, которые должны выполниться при установке [name], после этого нажмите «Установить»:

а можно так, если языков больше одного
Код:

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

[Messages]
Russian.SelectTasksLabel2=Выберите дополнительные задачи, которые должны выполниться при установке [name], после этого нажмите «Установить»:
English.SelectTasksLabel2=Select the additional tasks you would like Setup to perform while installing [name], then click Install.


________________
вот на всякий случай русская справка http://rghost.ru/37221111

brauni 26-03-2012 15:03 1887072

Вложений: 1
Уважаемые форумчане! Помогите начинающему разобраться с проблемой. Мне было нужно создать простой инсталятор для игры (700Мб) с использованием модуля распаковки архивов FreeArc. За основу был взят шаблон FreeArc_Example (секция [code] была перенесена без изменений). Вот что у меня получилось: см. вложение.
Скрипт получился вроде рабочий: инсталлятор создавался, компиляция проходила без сообщений о ошибках. Но в готовом инсталяторе обнаружилась проблема - распаковка архива (datapack.arc) происходит только когда инсталятор находится в той-же папке где был собран (т.е. в папке с файлами игры, скриптом и unarc.dll. При переносе инсталятора в другое место и его запуске оттуда - распаковка архива не происходит. Подскажите пожалуйста - где и в чем я ошибся.

PS: Пользуюсь IS v5.2.3.0 (ansi) c ISPP.

Johny777 26-03-2012 16:16 1887127

Цитата:

Цитата brauni
Подскажите пожалуйста - где и в чем я ошибся. »

ни в чём!
вот смотри
Код:

[code]
const
    Archives = '{src}\*.arc';    // укажите расположение архивов FreeArc; для внешних файлов строку в [Files] добавлять

здесь идёт поиск архива по расширению \*.arc
{src} это константа пути и означает "снаружи"
если написать {src}\data\*.arc , то ахивы лежат в папке data, которая лежит рядом с setup.exe
в этих примерах ты таскаешь архив вместе с инсталлятором!

brauni 26-03-2012 19:36 1887252

Цитата:

Цитата Johny777
здесь идёт поиск архива по расширению \*.arc
{src} это константа пути и означает "снаружи"
если написать {src}\data\*.arc , то ахивы лежат в папке data, которая лежит рядом с setup.exe
в этих примерах ты таскаешь архив вместе с инсталлятором! »

Намек понял! Заменил в указанной строке константу {src} на {app} и инсталятор начал распаковывать архив вне зависимости от своего местоположения (что и требовалось). СПАСИБО!!!

Ivan_009 28-03-2012 15:54 1888603

как можно сделать в isSlideShow v1.02 в первом примере где слайд шоу на весь экран показ слайдов не по процентам а по времени. Мне нужно для ISDone.. :help:

rasim933 28-03-2012 19:00 1888717

Помните мою антологию? Мне почти удалось всё сделать)))) ТОлько опять, не все игры помещяются на 4 дисках. Кто-то сможет мне помочь сделать репак игры которая весить 1,75 ГБ? Мне только нужно её перепаковать и при этом разделить на файлы весом 100 мб каждый. Кто-то поможет это всё проделать или предложите ещё какие-нибудь варианты?

alert30 28-03-2012 20:33 1888777

rasim933, возможно UPX по-может, но причины при запуске инсталлятора бывают разные...


Кстати, можно убрать галочку "Использовать загрузчик"; а сами форматы BIN'ы - само надо разбираться.

Gnom_aka_Lexander 28-03-2012 20:51 1888795

Цитата:

Цитата rasim933
и при этом разделить на файлы весом 100 мб »

Если вопрос касается Inno Setup, то ответ - пожалуйста:
Код:

[Setup]
DiskSpanning=True
DiskSliceSize=104857600

- разбиение на части, по 100 мегабайт каждая.
если тебе это нужно делать не с помощью Inno Setup, то ты ошибся темой...

rasim933 28-03-2012 23:32 1888898

Не, насчёт разбивания, этот код непоможет, как мне кажется. Я пробовал уже так, я запоковал установщик игры, протом его приходилось распаковывать сам установщик, а затем устнавливать игру. Я неправильно сделал?

Или мне прийдётся сначала установить игру, потом вес файлы упаковывать заново?

Johny777 28-03-2012 23:56 1888910

Цитата:

Цитата rasim933
весом 100 мб каждый »

тебе Лександер да рабочую настройку разбиения по 100 метров на .bin
Не пойму
Тебе не удаётся ужать до этого размера?
Цитата:

Цитата rasim933
которая весить 1,75 ГБ »

попробуй стандартными средствами
вот настройка на максимальное сжатие
сожми сначала со словарём 262144, а потом с 131072 и посмотри. Если не получится, то используй фриарк
читать дальше »

Compression=lzma2/ultra64
LZMAUseSeparateProcess=yes
LZMAMatchFinder=BT
LZMANumFastBytes=273
LZMADictionarySize=262144
///LZMADictionarySize=131072
InternalCompressLevel=ultra64
SolidCompression=true
MergeDuplicateFiles=true

SolidCompression не используй, если есть выбор компонентов

al70 29-03-2012 00:05 1888917

Всем доброго времени суток.
У меня вопрос. Мне нужно вызвать ф-ю из DLL после установки приложения, но перед появлением окна Finish. Причем вызов должен происходить только во время установки, а не деинстала приложения. Сам процесс вызова ф-ии я знаю, а вот как поймать нужный момент?

R.i.m.s.k.y. 29-03-2012 08:06 1889006

al70, использовать CurStep = ssPostInstall или CurStep = ssDone
Код:

procedure CurStepChanged(CurStep: TSetupStep);
begin
    if CurStep = ssPostInstall then
    begin
      MsgBox('это шаг ssPostInstall', mbInformation, MB_OK);
      твоя_функция;
    end;
    if CurStep = ssDone then
    begin
      MsgBox('это шаг ssDone', mbInformation, MB_OK);
      твоя_функция;
    end;
end;


R.i.m.s.k.y. 29-03-2012 15:30 1889345

Ivan_009, ну типа опа, нюхай сюдой
Риальне поцанчеги никада, слыш бро, никагда не ставят на программерских и админских тачилах по-умолчанию русскую раскладку потому кактаместь такое западло как буковка цэ, с то есть. це буква выглядит одинаково на обоих мовах, но компилятор он же сцукотупой как мой трындец и не понимает етого и вопит как касперский над стухнетом.
А истчо бывает такое что на пацанских форумах, к примеру как этот да, когда братишки друг другу хелпают, тег (во слово-заумь Э!) [code] подменяют на [*code] или [_code] чтобы пихло форума схарчило подгон как надо, форум он же брат по разуму компилятора не жди от что он щаз дипблю порвет как [П] на выборах
Так что сотри эту строчку, копирни [code], вставь и будет тебе хэппи, ну до следующей ошибки

PS какой квесчен такой и ансвер

==============
как грится вместо тысячи слов один скриншот ошибки

R.i.m.s.k.y. 29-03-2012 15:45 1889362

Ivan_009,
да я тоже твой вопрос не очень понял
скрин/текст ошибки покажи

R.i.m.s.k.y. 29-03-2012 16:08 1889384

Ivan_009
1. как ни странно - понять, самому, исходя из факта что Inno при компиляции идет сверху вниз
2. писать по русски

rasim933 29-03-2012 17:02 1889423

Предположим, есть файл setup.exe, он весит 1,75 гб. Я его через инно перезжимаю. В конце получается setup1.exe + setup1 (1).bin + setup1 (2).bin +setup1 (3).bin +.... При желании установить игру, мне надо из setup1.exe распаковать setup.exe, а потом из этого setup.exe установить игру. Меня это неустраивает. Понимаете что именно я хочу сделать?

alert30 29-03-2012 18:03 1889469

rasim933, пока еще не понимаем, каким способом сжать установщик > 30 %. Сейчас подумаю...

Johny777 29-03-2012 19:12 1889512

Ivan_009,Что случилось?
Ваня!
Родимый!
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Цитата:

Цитата Ivan_009
А то я подключаю 12 модулей »

вот почему модули не использую
в одном скрипте при компиляции и отладке он проблемные строки посвечивает, а в модуле нет.
Модуль хорош, когда у тебя много сообщений и они готовы.
Или секция файлов полностью готова.
Убрал из скрипта и перематывать меньше!
.,......................................................
rasim933,
инсталл в инсталле?

rasim933 29-03-2012 19:32 1889522

В этом то и прикол. Инстал в инстале неустраивает меня. А другого способоба я незнаю. Вот у вас и спрашиваю..

МНе не обязательно перезжать игру, мне необходимо её разбить на много частей. Если я начинаю разбивать игру, то получается инсталл в инсталле.

Johny777 29-03-2012 20:15 1889541

ну так перепакуй
или ты знаешь как разбить готовый инсталл?
Я нет
И скажи
зачем тебе его разбивать?

rasim933 29-03-2012 20:47 1889564

Цитата:

Цитата Johny777
или ты знаешь как разбить готовый инсталл? »

Готовый инсталл, только если в архив пихнуть. Но это нето.

Цитата:

Цитата Johny777
ну так перепакуй »

Я знаю, что игру сначала надо установить, потом все файлы из папки с установленной игрой запихать в инно, потом ключи реестра доста (мне неизвестен способ достования и поиска ключей реестра), и запокавать. Возжно что я ошибаюсь.

Цитата:

Цитата Johny777
зачем тебе его разбивать? »

Затем, что эта игра на 1,75 гб, непомещяется на 4-ёх дисках. В 1 диске остаётся 810 мегабайт свободного места, во 2 - 100 мб, в 3 - 510 мб, в 4 - 310 мб. Вот я и хочу разбить игру, чтоб запихать половинки на диски со свободным местом.

Скрин:.

Предоставить вам скрины с размерами игр?



P.S. - Я извиняюсь за причинённые неприятности, но без вашей помощи я несправлюсь сам.

Johny777 29-03-2012 23:25 1889665

Цитата:

Цитата rasim933
Я знаю, что игру сначала надо установить, потом все файлы из папки с установленной игрой запихать в инно, потом ключи реестра доста (мне неизвестен способ достования и поиска ключей реестра), и запокавать. Возжно что я ошибаюсь. »

для начала
если игра запакована в инно, то используй инно анпакер (есть в комплекте Inno Ultra) и нет, то ключи доставай сам.
Цитата:

Цитата rasim933
но без вашей помощи я несправлюсь сам. »

ну проблем нет. Чем смогу помогу.
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,\
и кстати. Есть такая штука. Называется overburn, которая доступна например в ImageBurn
позволяет записать больше чем дозволено.

rasim933 30-03-2012 12:21 1889938

ОК. Попробую.

Johny777 30-03-2012 14:48 1890041

Подскажите пожалуйста
на выкатывающейся панели разместил InfoBeforeMemo
в нём находятся параметры консоли.
Как активировать копирование.
Т.е. выделяешь нужную команду, правой кнопкой - "копировать" и потом вставить в эдит
вот наглядный пример

пока что работает только через связку ctrl+c и shift+insert.
если это слишком сложно реализовать, то не надо, т.к. это не самое важное :good:

El Sanchez 30-03-2012 16:38 1890138

Цитата:

Цитата Johny777
Как активировать копирование »

Johny777, забыл, что ли, как в авторане я тебе делал? :)
Код:

[code]
var
    PopMenu: TPopupMenu;
    Menu: TMenuItem;

procedure MenuOnClick(Sender: TObject);
begin
    WizardForm.InfoBeforeMemo.CopyToClipboard;
end;
   
procedure InitializeWizard();
begin
    PopMenu := TPopupMenu.Create(WizardForm);
    Menu := TMenuItem.Create(WizardForm);
    Menu.Caption := 'Копировать';
    Menu.OnClick := @MenuOnClick;
    PopMenu.Items.Add(Menu);
    WizardForm.InfoBeforeMemo.PopupMenu := PopMenu;
end;


Johny777 30-03-2012 17:04 1890159

Спасибо! Теперь как в консоли самой игры и очень удобно!
Цитата:

Цитата El Sanchez
забыл, что ли, как в авторане я тебе делал? »

никак нет! Его я проштудировал и многое реализовал. В том числе перенёс деинсталятор на ту же форму.
а про всплывающее меню даже не подумал, тк там при нажатии на кнопку (это теперь я тоже могу (спасибо ещё раз! :bow: )).

Кстати. Деинсталятор с выбором компонентов ещё доработал и полностью перенёс в код
может кому-то пригодится!
вот пример.
читать дальше »

это в основной скрипт

читать дальше »
Код:

[Setup]
UninstallFilesDir={app}\uninstall
/// привык держать деинсталятор в отдельной папке

[Files]
/// наш заранее скомпилированный деинсталятор пакуется вместе с файлами основного инсталятора
Source: uninstall\Setup\Uninstall.exe; DestDir: {app}\uninstall; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension;

[UninstallDelete]
/// удаление приложени нацелено на удаление всей папки!
Type: filesandordirs; Name: {app}

[code]
procedure CurPageChanged(CurPageID: Integer);  /// при смене страниц
begin
    if CurPageID=wpInstalling then  /// страница установки
/// столкнулся с проблемой. Если установить с действиями на станице завершения без действий строкой ниже и потом
/// установить ещё раз поверх, то второй раз из списка удаления программ вызывается уже не форма с выбором компонентов,
///а простой стандартный стиратель с вопросом "Удалть? Да и Нет"
// поэтому при повторной установке в ту же директорию проверяем есть ли там деинсталяторы и стираем их, если они есть
/// родной создаётся заново, а наш, в виде формы, копируется и (описание ниже)
      begin
        if FileExists(ExpandConstant('{app}\uninstall\unins000.exe')) then
        DeleteFile(ExpandConstant('{app}\uninstall\unins000.exe'));
        if FileExists(ExpandConstant('{app}\uninstall\unins007.dat')) then
        DeleteFile(ExpandConstant('{app}\uninstall\unins007.dat'));
        if FileExists(ExpandConstant('{app}\uninstall\unins007.exe')) then
        DeleteFile(ExpandConstant('{app}\uninstall\unins007.exe'));
      end;
    if CurPageID=wpFinished then /// завершающая страница
      begin
/// переименовываем созданный автоматом родной деинсталятор в например unins007.exe и unins007.dat
        if FileExists(ExpandConstant('{app}\uninstall\unins000.exe')) then
        RenameFile(ExpandConstant('{app}\uninstall\unins000.exe'), ExpandConstant('{app}\uninstall\unins007.exe'))
        if FileExists(ExpandConstant('{app}\uninstall\unins000.dat')) then
        RenameFile(ExpandConstant('{app}\uninstall\unins000.dat'), ExpandConstant('{app}\uninstall\unins007.dat'))
///теперь переименовываем наш деинсталятор в родное название (см выше) unins000.exe
        if FileExists(ExpandConstant('{app}\uninstall\Uninstall.exe')) then
        RenameFile(ExpandConstant('{app}\uninstall\Uninstall.exe'), ExpandConstant('{app}\uninstall\unins000.exe'))
    end;
end;


сам деинсталятор но в отличии от старого в виде формы
читать дальше »
Код:

#define MyAppName "Uninstall"

[Setup]
#define MyAppName "Uninstall"

[Setup]
AppId=proto15
SourceDir=.
OutputDir=Setup
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false
//SetupIconFile=hl2.ico
//BitmapResource=bgnd:orangebox.bmp
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no


[CustomMessages]
ru.Uninstall=удалить
en.Uninstall=Uninstall

ru.Exit=выход
en.Exit=Exit

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

[Files]
Source: ISSkin.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression
Source: steam.cjstyles; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

[  Code]
procedure LoadSkin(lpszPath: String; lpszIniFileName: String); external 'LoadSkin@files:isskin.dll stdcall';
procedure UnloadSkin(); external 'UnloadSkin@files:isskin.dll stdcall';
/// тень окна /// начало
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetClassLong(hWnd: HWND; Index, NewLong: Longint): Longint; external 'SetClassLongA@user32 stdcall';
/// конец

////////////////////////////////////////////////////////////////////////
var
    AutoRun: TForm;
    ExitButton, UninstallButton: TButton;
    ResultCode: Integer;
    hl2_Checkbox, ep1_Checkbox, ep2_Checkbox, portal_Checkbox: TCheckBox;
//////////////////////////////////////////////////

function Check_hl2: Boolean; begin Result:=hl2_Checkbox.Checked; end;
function Check_ep1: Boolean; begin Result:=ep1_Checkbox.Checked; end;
function Check_ep2: Boolean; begin Result:=ep2_Checkbox.Checked; end;
function Check_portal: Boolean; begin Result:=portal_Checkbox.Checked; end;

/////////////////////////////////////////////////////////////////////

procedure Unstall(Sender: TObject); /// выполняется сверху вниз
begin
///  сначало удаляются эксклюзивные файлы и папки для кждого компонента, если
  begin
    if hl2_Checkbox.Checked = true then  /// чекбокс этого компонента отмечен, то
      begin /// начало удаления
        DelTree(ExpandConstant('{src}\..\common\half-life 2'), True, True, True) // трём папку
        DeleteFile(ExpandConstant('{src}\..\half-life 2 buka russian.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 2007 base content.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 content.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 game dialog.gcf'));
        DeleteFile(ExpandConstant('{commondesktop}\Half-Life 2.lnk'));  /// удаляем ярлык
      end // конец
  end;
 
  begin
    if ep1_Checkbox.Checked = true then
      begin
        DelTree(ExpandConstant('{src}\..\common\half-life 2 episode one'), True, True, True)
        DeleteFile(ExpandConstant('{src}\..\episode one 2007 content.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 episode one.gcf'));
        DeleteFile(ExpandConstant('{commondesktop}\Half-Life 2 Episode One.lnk'));
      end
  end;

  begin
    if ep2_Checkbox.Checked = true then
      begin
        DelTree(ExpandConstant('{src}\..\common\half-life 2 episode two'), True, True, True)
        DeleteFile(ExpandConstant('{src}\..\episode two content.gcf'));
        DeleteFile(ExpandConstant('{src}\..\episode two maps.gcf'));
        DeleteFile(ExpandConstant('{src}\..\episode two materials.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 episode two english.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 episode two russian.gcf'));
        DeleteFile(ExpandConstant('{commondesktop}\Half-Life 2 Episode Two.lnk'));
      end
  end;

  begin
    if portal_Checkbox.Checked = true then
      begin
        DelTree(ExpandConstant('{src}\..\common\portal'), True, True, True)
        DeleteFile(ExpandConstant('{src}\..\portal content.gcf'));
        DeleteFile(ExpandConstant('{src}\..\portal english.gcf'));
        DeleteFile(ExpandConstant('{src}\..\portal russian.gcf'));
        DeleteFile(ExpandConstant('{commondesktop}\Portal.lnk'));
      end
  end;
  //// конец первой части. Действие идёт дальше после верхнего удаления. Даже если удаления не было и кто-то просто нажал кнопку "Удалить" ничего не произойдёт, тк
    begin  /// начинается вторая проверка полуэксклюзивных файлов, те файлов относящихся к 2 из 3 из 4 имеющихся (здесь) коммпонентов. Например half-life 2 episode one russian.gcf
      begin /// часть озвучки которого используется во втором эпизоде и вся в первом.
        if (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and /// если этого компонента нет
          (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') //// и этого тоже, то
        then /// удаляем общие для них (и только для них) файлы
        DeleteFile(ExpandConstant('{src}\..\episode 1 shared.gcf'));
        DeleteFile(ExpandConstant('{src}\..\episodic 2007 shared.gcf'));
        DeleteFile(ExpandConstant('{src}\..\half-life 2 episode one russian.gcf'));
      end
      begin  /// а это проверка для удаления файла half-life 2_russian.gcf, ресурсы которго в той или иной степени нужнв всем hl2 в той или иной мере
    /// Напимер
        If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') and  // проверка раз  --- нету
          (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and /// два  --- нету
          (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='')  /// три --- есть. Файл не стирается
        then
        DeleteFile(ExpandConstant('{src}\..\half-life 2_russian.gcf'));
      end
    //// конец второй проверки
      /// начало 3 -й.
/// А теперь главное. Идёт такая же проверка как и сверху но ведётся поиск всех компонентов и если нет ни одного компонента (уникального файла, подтверждающего наличие компонента), то
/// выпоняется родное удаление в очень тихом режиме и удаляется вся папка. Разберём пример. При инициализации деинсталятор "видит" 2 компонента - hl2 и портал.
/// При удалении только портала удаляется всё уникальное от портала (выше), но hl2 и общие файлы остаются, тут же доходит до дейстий кода ниже. Идёт третья проверка,
/// но не нацеленная не на создание чекбокса, а на проверку есть ли хоть один компонент и он есть - это hl2. Вызываем деинстаятор ещё раз и видим в списке только hl2.
/// Удаляем и снова доходит до третьей проверки. Он не видит не одного hl2.exe в разных директория, и вызывает другой деинсталятор, который трёт всё.
        If (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2'))='') and
          (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode one'))='') and
          (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\half-life 2 episode two'))='') and
          (FileSearch('hl2.exe', ExpandConstant('{src}\..\common\portal'))='')
        then
      Exec(ExpandConstant('{src}\unins007.exe'),'/VERYSILENT','', SW_SHOW, ewNoWait, ResultCode); /// запускаем родной деинсталятор в очень тихом режиме.
    end;
  AutoRun.Close;
end;

///////////////////////////////////////////////////////////


procedure CreateAutoRun();
begin
  //AutoRun
    AutoRun := TForm.Create(nil);
    with AutoRun do
    begin
        BorderIcons := [];
        SetClassLong(AutoRun.Handle, (-26), GetWindowLong(AutoRun.Handle, (-26)) or $00020000); //тень окна
        Position := poScreenCenter;
        Caption := 'Uninstall';
        ClientWidth := ScaleX(256);
        ClientHeight := ScaleY(350);
    end;
/////////////////// чекбоксы /// начало
/// создание чекбоксов. По одному на компонент.
    begin
        begin
        hl2_Checkbox := TCheckBox.Create(AutoRun);
          with hl2_Checkbox do
          begin
            Parent := AutoRun;
            Caption := 'half-life 2';
            Left := ScaleX(40);
            Top := ScaleY(20);
            Width := ScaleX(200);
            Height := ScaleY(15);
            Checked := False;
          end;
        end;

        begin
        ep1_Checkbox := TCheckBox.Create(AutoRun);
          with ep1_Checkbox do
          begin
            Parent := AutoRun;
            Caption := 'half-life 2 episode one';
            SetBounds(hl2_Checkbox.Left, hl2_Checkbox.Top + ScaleY(30), ScaleX(200), ScaleY(15));
            Checked := False;
          end;
        end;

        begin
        ep2_Checkbox := TCheckBox.Create(AutoRun);
          with ep2_Checkbox do
          begin
            Parent := AutoRun;
            Caption := 'half-life 2 episode two';
            SetBounds(ep1_Checkbox.Left, ep1_Checkbox.Top + ScaleY(30), ScaleX(200), ScaleY(15));
            Checked := False;
          end;
        end;

        begin
        portal_Checkbox := TCheckBox.Create(AutoRun);
          with portal_Checkbox do
          begin
            Parent := AutoRun;
            Caption := 'portal';
            SetBounds(ep2_Checkbox.Left, ep2_Checkbox.Top + ScaleY(30), ScaleX(200), ScaleY(15));
            Checked := False;
          end;
        end;
    end;
/////////// конец создания чекбоксов. Нихе начинается кусок (procedure CreateAutoRun()) в котором проверяется наличие компонента. Для проверки наличия компонента.
// необходии хотя бы один уникальный файл. Правда здесь в примере идёт поиск одного и того же hl2.exe вразных директориях
// Пример>
// если файл существует здесть (\..\- поднимаемся на уровень выше), то
If FileExists(ExpandConstant('{src}\..\common\half-life 2\hl2.exe')) then  /// Half-Life 2
  begin
  /// чекбоксы этого включен (можно добавить видим/невидим )
    hl2_Checkbox.Enabled:= true;
  end
else /// в противном случае
  begin
    hl2_Checkbox.Enabled:= false; /// выключен
  end;
///////////
If FileExists(ExpandConstant('{src}\..\common\half-life 2 episode one\hl2.exe')) then  /// Half-Life 2 Episode One
  begin
    ep1_Checkbox.Enabled:= true;
  end
else
  begin
    ep1_Checkbox.Enabled:= false;
  end;
///////////
If FileExists(ExpandConstant('{src}\..\common\half-life 2 episode two\hl2.exe')) then  /// Half-Life 2 Episode Two
  begin
    ep2_Checkbox.Enabled:= true;
  end
else
  begin
    ep2_Checkbox.Enabled:= false;
  end;
///////////
If FileExists(ExpandConstant('{src}\..\common\portal\hl2.exe')) then  /// Portal
  begin
    portal_Checkbox.Enabled:= true;
  end
else
  begin
    portal_Checkbox.Enabled:= false;
  end;
/// конец проверки

  AutoRun.Repaint;

/////////////////// кнопки /// начало
    ///кнопка "Удалить"
    UninstallButton := TButton.Create(AutoRun);
    with UninstallButton do
    begin
        Parent := AutoRun;
        Left := ScaleX(50);
        Top := ScaleY(265);
        Width := ScaleX(90);
        Height := ScaleY(22);
        Cursor := crHand;
        Caption := ExpandConstant('{cm:Uninstall}');
        OnClick := @Unstall; ///при нажатии выполниется удаление
    end;
    /// кнопка выход
    ExitButton := TButton.Create(AutoRun);
    with ExitButton do
    begin
        Parent := AutoRun;
        Left := ScaleX(150);
        Top := ScaleY(265);
        Width := ScaleX(50);
        Height := ScaleY(22);
        Caption := ExpandConstant('{cm:Exit}');
        Cursor := crHand;
        ModalResult := mrCancel;
    end;
/// конец

  AutoRun.ShowModal;
end;

function InitializeSetup(): Boolean;
begin
    ExtractTemporaryFile('steam.cjstyles');
    LoadSkin(ExpandConstant('{tmp}\steam.cjstyles'), '');
    CreateAutoRun();
    Result := False;
end;

procedure DeinitializeSetup;
begin
    AutoRun.Hide;
    UnloadSkin();
end;


проверено
работает как ядерные часы


Devils Night 31-03-2012 00:25 1890448

Цитата:

Цитата rasim933
мне неизвестен способ достования и поиска ключей реестра »

Знаю только 2 варианта,
Первый с помощью Regshot, надеюсь тут понятно без слов.
Второй немного по извращённей, с помощью Revo Uninstaller.
читать дальше »
Запускаешь Revo Uninstaller, кликаешь на установленную игру, выбираешь Удалить, появится окно, жмёшь Да, выбираешь Расширенный режим, жмёшь Дальше, после появится окно Самого деинсталятора с подтверждением, жмёшь Нет, потом жмёшь Дальше, ждёшь пока он там всё просканит, жмёшь Дальше, вот у тебя должны появиться Найденные записи реестра, а дальше открываешь regedit, смотришь что нашёл Revo Uninstaller, и ищешь в regedit, что нужно сохраняешь. После всей проделанной работы, в Revo Uninstaller, жмёшь отмена и закрывешь, вот и всё. Ну вот как то так.

valyok666 31-03-2012 05:55 1890496

Devils Night, можно также " извращённый " токо через Unistall Tools правый клик по программе показать запись в реестре

R.i.m.s.k.y. 31-03-2012 08:14 1890519

valyok666, Devils Night, rasim933 это именно что извращенный способ тк прога не всегда сносит при деинсталляции все ключи реестра, а вот при инсталляции пишет точно все, так что регшот: снимок1 - поставили - снимок2 - сравнили - через истул импортировали - пути поправили и натюрлих

Devils Night 31-03-2012 18:54 1890878

Цитата:

Цитата valyok666
токо через Unistall Tools правый клик по программе показать запись в реестре »

А причём тут SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall? Revo Uninstaller тоже так может, ПКМ -> Открыть ключ реестра, но это не то что нужно.
Цитата:

Цитата R.i.m.s.k.y.
тк прога не всегда сносит при деинсталляции все ключи реестра »

Это вариант, когда без вариантов (на худой конец).
А так то несомненно Regshot, но так или иначе и тут придётся допиливать, удалять не нужное, т.к он много лишнего хлама за собой тащит.

Gnom_aka_Lexander 31-03-2012 19:48 1890927

Цитата:

Цитата R.i.m.s.k.y.
через истул импортировали »

А чем Серегин конвертер не угодил? Проверял лично, хексовые записи он единственный конвертит адекватно.

Devils Night 31-03-2012 20:22 1890942

Сложный вопрс!
читать дальше »

Монтируется образ, в нём присутствует AutoRun.dat, в котором прописан следующий конфиг
Код:

[SETUP_CONFIG]
PRODUCT_GUID_KEY=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0E01BD6F-4E8E-4E08-B578-D3EB0972C093}
USB_ID=USB\Vid_00D0&Pid_0000
APP_SETUP_PATH=Data\setup.exe
APP_VERSION_KEY=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0E01BD6F-4E8E-4E08-B578-D3EB0972C093}
APP_VERSION_NAME=AppVersion
APP_VERSION_VALUE=1.0
APP_FILE_NAME=Program.exe
APP_PARAMETER_FLAG=0
APP_PARAMETER= -appid DESKBOARDAPP
APP_PATH_KEY=SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{0E01BD6F-4E8E-4E08-B578-D3EB0972C093}
APP_PATH_NAME=InstallLocation
FILE_CHECK_NUM=1

[FILE_CHECK_LIST]
FILE0=Program.exe

Краткое описание AutoRun.dat:
[SETUP_CONFIG]
PRODUCT_GUID_KEY - Определяет установлена программа или нет
USB_ID - Определяет вставленно ли устройство (Если устройство не вставлено, то ничего не происходит, если же вставлено, то происходит либо установка setup.exe (если программа не установлена), либо запуск программы Program.exe (при условии если программа установлена)).
APP_SETUP_PATH - если программа не установлена то благодаря этой секции запускает setup.exe

а благодаря
[SETUP_CONFIG]
APP_FILE_NAME и

[FILE_CHECK_LIST]
FILE0
При нахождении ключа {0E01BD6F-4E8E-4E08-B578-D3EB0972C093} запускает программу, и с тем учётом если программа установлена, это определяется по ключу {0E01BD6F-4E8E-4E08-B578-D3EB0972C093}.
Как сделать так, чтобы всё работало?

В основном интересует:
Код:

[SETUP_CONFIG]
PRODUCT_GUID_KEY
USB_ID
APP_SETUP_PATH
APP_FILE_NAME

и
Код:

[FILE_CHECK_LIST]FILE0

Raf-9600 01-04-2012 16:14 1891325

Собсно я хочу добавить поддержку нескольких языков инсталлятора, но вот как это реализовать в секции Code, мне неизвестно =(
Может какой-то добрый человек помочь с этой проблемой?

Вот четыре кода, которые нуждаются в добавлении поддержки многоязычности:

Проверка на кирилицу в пути установки
читать дальше »
function NextButtonClick(CurPageID: Integer): Boolean;
var
i,j: integer;
s,c: string;
begin
Result := True;
if CurPageID = wpSelectDir then
begin
c := 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя';
for i:=1 to length(WizardForm.DirEdit.text) do
for j:=1 to length(c) do
begin
if WizardForm.DirEdit.text[i] = c[j] then //{app} содержит русские символы
begin
s := 'В пути установки присутствуют русские буквы, что недопустимо'#13#13'Пожалуйста, повторите ввод.';
MsgBox(s, mbError, mb_Ok);
Result := False ; //запрет перехода на следующую страницу
exit;
end
else Result := True; //разрешаем переход на следующую страницу
end;
end;
end;

Скрипт для вывода данных о винтах.
читать дальше »
var
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel: TLabel;
n: Integer;
VolumeName, FileSystemName: String;
VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
ListBox: TListBox;
StartMenuTreeView: TStartMenuFolderTreeView;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := 'Требуется как минимум '+ FloatToStr(round(NeedSize/1024*100)/100) + ' Гб свободного дискового пространства.' else
NeedSpaceLabel.Caption := 'Требуется как минимум '+ IntToStr(NeedSize)+ ' Мб свободного дискового пространства.';end;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

procedure InitializeWizard();
begin
NeedSize := 6100; //Здесь указывается место для приложения
WizardForm.DiskSpaceLabel.Hide;
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
ListBox:= TListBox.Create(WizardForm)
ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
ListBox.Font.Size:= 9
ListBox.Font.Style:= []
ListBox.Font.Name:= 'Courier New';
ListBox.OnClick:= @ObjectOnClick;
ListBox.Parent:= WizardForm.SelectDirPage;
WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID=wpSelectDir then
begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
ListBoxRefresh
end;
end;

Описание компонентов
читать дальше »
procedure InitializeWizard();
begin
WizardForm.TypesCombo.Visible:=False;
WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
WizardForm.ComponentsList.Width := ScaleX(212);
WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription

InfoPanel := TPanel.Create(WizardForm);
InfoPanel.Parent := WizardForm.SelectComponentsPage;
InfoPanel.Caption := '';
InfoPanel.Top := WizardForm.ComponentsList.Top;
InfoPanel.Left := ScaleX(220);
InfoPanel.Width := ScaleX(197);
InfoPanel.Height := WizardForm.ComponentsList.Height;
InfoPanel.BevelInner := bvRaised;
InfoPanel.BevelOuter := bvLowered;
InfoCaption := TNewStaticText.Create(WizardForm);
InfoCaption.Parent := WizardForm.SelectComponentsPage;
InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
InfoCaption.Left := ScaleX(234);
InfoCaption.Top := InfoPanel.Top - ScaleY(5);
InfoCaption.Font.Color := clActiveCaption;

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

AddDescription(1, 'текст1.');
AddDescription(2, 'текст2.');
AddDescription(3, 'текст3.');
AddDescription(4, 'текст4.');
end;

И такой
читать дальше »
procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
WizardForm.StatusLabel.Caption := 'Распаковка слайдов...';
for z:=2 to N1 do ExtractTemporaryFile('Image_'+inttostr(bmp[z])+'.bmp');
end;
if CurStep = ssPostInstall then begin
if (IsComponentSelected('GameDiablo2\VoiceD2\German') or IsComponentSelected('GameLoD\VoiceLoD\Italian') or IsComponentSelected('GameLoD\VoiceLoD\Polish') or IsComponentSelected('GameLoD\VoiceLoD\Russian') ) then begin
ChangeCaption('Конвертация монологов...');
RecodeOgg;
end; //if IsComponentSelected
if CurStep = ssPostInstall then RecodeOgg;
end; //CurStep = ssPostInstall
end;

Johny777 01-04-2012 16:31 1891341

Raf-9600,
может так
выплняется то или иное, если ActiveLanguage='Russian'
[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl;
Name: English; MessagesFile: compiler:Languages\English.isl;

и вот первый пример на запрет кириллицы в пути
читать дальше »
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
var
i,j: integer;
s,c: string;
if ActiveLanguage='Russian' then
begin
Result := True;
if CurPageID = wpSelectDir then
begin
c := 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя';
for i:=1 to length(WizardForm.DirEdit.text) do
for j:=1 to length(c) do
begin
if WizardForm.DirEdit.text[i] = c[j] then //{app} содержит русские символы
begin
s := 'В пути установки присутствуют русские буквы, что недопустимо'#13#13'Пожалуйста, повторите ввод.';
MsgBox(s, mbError, mb_Ok);
Result := False ; //запрет перехода на следующую страницу
exit;
end
else Result := True; //разрешаем переход на следующую страницу
end;
end;
end;


R.i.m.s.k.y. 01-04-2012 16:32 1891343

Raf-9600,
языки делаются воттаг, я не буду парить моск вакуумическими примерами, дерну из рабочего скрипта
Код:

# define AppName "SmoothVideo Project"

[Languages]
Name: russian; MessagesFile: compiler:Languages\Russian.isl; LicenseFile: License_rus.txt
Name: english; MessagesFile: compiler:Languages\English.isl; LicenseFile: License_eng.txt

[CustomMessages]
english.ResProf=Reset Profiles
russian.ResProf=Сбросить настройки
english.code1={#AppName} depends on the following components:
russian.code1=Для работы {#AppName} требуются следующие программы и компоненты:
english.code2=It is not alowed to install program to the folder with russian characters.%nPlease select another path
russian.code2=В пути установки присутствуют русские буквы, что недопустимо%nПожалуйста, повторите ввод.

[Icons]
Name: {group}\{cm:ResProf}; Filename: {app}\reset-profiles.cmd; WorkingDir: "{app}";

[*CODE]
function IsRus(): Boolean;
begin
if ( Lowercase(ActiveLanguage) = Lowercase('russian') ) then Result := True else Result := False;
end;

function IsEng(): Boolean;
begin
if ( Lowercase(ActiveLanguage) = Lowercase('english') ) then Result := True else Result := False;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
var
i,j: integer;
s,c: string;
begin
Result := True;
if CurPageID = wpSelectDir then
begin
if isRus then begin
c := 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя';
for i:=1 to length(WizardForm.DirEdit.text) do
for j:=1 to length(c) do
begin
if WizardForm.DirEdit.text[i] = c[j] then //{app} содержит русские символы
begin
MsgBox(ExpandConstant('{cm:code2}'), mbError, mb_Ok);
Result := False ; //запрет перехода на следующую страницу
exit;
end
else Result := True; //разрешаем переход на следующую страницу
end; end; end; end;


Johny777 01-04-2012 16:43 1891350

:) использую отображение процентов в установке
вот так
читать дальше »
Код:

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

[  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:= 10;
    ProgressLabel.Left:= 270;
    ProgressLabel.Caption:= '0%';
    ProgressLabel.AutoSize:= True;
    ProgressLabel.Font.Color:= cl3DdkShadow;
    ProgressLabel.Font.Style:= [fsBold];
    ProgressLabel.Transparent:= True;
    ProgressLabel.Parent:= WizardForm.ProgressGauge;
end;


проблема в том, что лейбл обновляется после копирования файла и если он большой, то рывками например с 50% до 60%
Есть вроде возможность считывать положение прогресбара
может у кого есть пример (там кажется задействована InnoCallBack.dll) для отображения таких процентов?
оно будет точнее

Gnom_aka_Lexander 01-04-2012 16:44 1891353

Raf-9600, В каком смысле? Если менять язык инсталлятора на ходу, то это страшное дело - абсолютно все надписи нужно перерисовывать заново - это долгий процесс, и на слабых компах вызовет дикие тормоза.
по предложенным тобой примерам:
Проверка кириллицы в пути - слегка правленый вариант товарища VoLT:
читать дальше »
Код:

[Setup]
AppName = MyApp
AppVername = MyApp
DefaultDirName = {pf}\MyApp

[*Code]

function IsAnsi(S: string): boolean;
begin
  if CompareStr(AnsiLowercase(S), Uppercase(S)) = 0 then
    if CompareStr(Lowercase(S), AnsiLowercase(S)) = 0 then
  Result := True;
end;

function NextButtonClick(CurPageID: Integer): Boolean;
begin
  Result := True;
  if CurPageID = wpSelectDir then
    if not (IsAnsi(WizardForm.DirEdit.Text)) then
    begin
      MsgBox('В пути установки присуствуют русские символы'+#13#10+'Пожалуйста, повторите ввод.', mbError, mb_Ok);
      Result := False;
    end;
end;


Скрипт для вывода данных о винтах - слегка правленный вариант от YURSHAT(требует get_hw_caps.dll):
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: compiler:Dll Pack\get_hw_caps.dll; Flags: dontcopy

[*Code]

var
  DirList: TNewListBox;
  Text: TNewStaticText;

function GetHardDriveFreeSpace(hdd: integer): Integer;
  external 'hwc_GetHardDriveFreeSpace@files:get_hw_caps.dll stdcall';
function GetHardDriveName(hdd: integer): PAnsiChar;
  external 'hwc_GetHardDriveName@files:get_hw_caps.dll stdcall';
function GetHardDriveTotalSpace(hdd: integer): Integer;
  external 'hwc_GetHardDriveTotalSpace@files:get_hw_caps.dll stdcall';
function GetHardDrivesCount(): Integer; external 'hwc_GetHardDrivesCount@files:get_hw_caps.dll stdcall';

function NumToStr(Float: Extended): string;
begin
  Result:=Format('%.2n', [Float]);
  StringChange(Result, ',', '.');
  while ((Result[Length(Result)]='0')
    or (Result[Length(Result)]='.'))
      and (Pos('.',Result)>0) do
  SetLength(Result,Length(Result)-1);
end;

function TBorGBorMB(Float: Extended): string;
// функция определения ТБ, ГБ или МБ
begin
  if Float<1024 then Result:=NumToStr(Float)+' MB'
  else if (Float/1024)<1024 then Result:=NumToStr(Float/1024)+' GB'
  else if (Float/(1024*1024))<1024 then Result:=NumToStr(Float/(1024*1024))+' TB'
end;

procedure ListBoxOnClick(Sender: TObject);
var
  NewLetter, OldString: string;
begin
  with TNewListBox(Sender) do
  begin
    NewLetter := Copy(Items[ItemIndex], 0, 1);
    OldString := Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text));
    WizardForm.DirEdit.Text := NewLetter + OldString;
  end;
end;

procedure InitializeWizard();
var
  i : Integer;
begin
  { DirList }
  DirList := TNewListBox.Create(WizardForm);
  with DirList do
  begin
    Parent := WizardForm.SelectDirPage;
    SetBounds(ScaleX(0),ScaleY(112),ScaleX(417),ScaleY(97));
    ItemHeight := 13;
    ItemIndex := 0;
    for i:= 0 to GetHardDrivesCount() - 1 do
      Items.Add(GetHardDriveName(i)+ '      ' + 'Свободно: ' + IntToStr((GetHardDriveFreeSpace(i)*100) div GetHardDriveTotalSpace(i)) + '%  '+'('+ TBorGBorMB(GetHardDriveFreeSpace(i))+')'+'    '+'из'+'    '+TBorGBorMB(GetHardDriveTotalSpace(i)));
    OnClick := @ListBoxOnClick;
  end;
end;


На описания тоже гдето есть скрипт более оптимальный и в плане производительности и в плане косячности работы, за авторством Shegorat, но лень искать (эти два под рукой просто были).

Johny777 01-04-2012 16:50 1891360

Цитата:

Цитата Лександер
Проверка кириллицы в пути - слегка правленый вариант товарища VoLT: »

а в чём разница?
(у себя использую тот, что страницей назад и если оно того стоит поменяю на твой)

Gnom_aka_Lexander 01-04-2012 16:54 1891365

Johny777, Все у тебя правильно, и опора идет по позиции прогрессбара, как раз. просто у тебя обновление по окончании копирования предидущего файла. делай эту процедуру в таймере, чтоб обновлялась позиция с минимальными интервалами.
Цитата:

Цитата Johny777
а в чём разница? »

В скорости работы. И это не мой, это VolT-а. нет у меня привычки чужие наработки присваивать.

Johny777 01-04-2012 17:21 1891384

Лександер,
извиняюсь за неточный оборот речи
под словом "твой" имелось в виду не авторство, а твой пример (или готовый "пример из твоего сообщения"). Коточе в таком смысле
Да и бред говорить что он твой(авторство) после того как ты сам сказал, что "правленый вариант товарища VoLT"
Цитата:

Цитата Лександер
нет у меня привычки чужие наработки присваивать »

и в мыслях не было!
Скажу честно.
У меня 90% функций скрипта - чужие примеры и я благодарен их авторам (хотя многих даже не знаю, тк взял из коллекции скриптов).
А то что твои скрипты кое кто воровал я в курсе. Тк перечитывал предыдущие ветки в поисках знаний и примеров. И можешь не поверить, но у меня нет ни одного того скрипта с сам знаешь какого сайта, тк они там "грязные"

R.i.m.s.k.y. 01-04-2012 18:07 1891407

Цитата:

Цитата Johny777
У меня 90% функций скрипта »

у всех так...
...мы все учились понемногу чему-нибудь и как-нибудь...

JHeavy 01-04-2012 19:54 1891455

Здравствуйте у меня небольшой вопрос по копированию файла из секции [Components]. Как сделать так чтобы если выбирая компоненты a и b, компонент b копируется одну папку, а если b и с, то компонент b копируется в другую папку. И все три файла разные.

Raf-9600 01-04-2012 20:09 1891460

Johny777, R.i.m.s.k.y., благодарю, ваши примеры мне пригодились.
Лександер, опубликованный вами скрипт проверяющий "некорректные" символы в пути установки, выглядит более универсальным, но по непонятным мне причинам, он жалуется на некорректные символы, даже если в пути установки только буквы латиницы.
А скрипт для вывода сведений о винчестерах мне больше по душе тот, к которому я привык, к тому же для него не нужны дополнительные библиотеки.

Собсно с используемым мной скриптом для вывода сведений о винчестерах возникла трудность. Я бы хотел добавить в него мультиязычность по средствам CustomMessages, но я не ориентируюсь в "правописании". Может ли кто-нибудь показать пример решения этой проблемы?

На всякий случай копирую скрипт о котором речь:
читать дальше »
Код:

var
  NeedSize:Integer;
  FreeMB, TotalMB: Cardinal;
  NeedSpaceLabel: TLabel;
  n: Integer;
  VolumeName, FileSystemName: String;
  VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint;
  ListBox: TListBox;
  StartMenuTreeView: TStartMenuFolderTreeView;

procedure GetFreeSpaceCaption(Sender: TObject);
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled := False else
  WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
  if NeedSize > 1024 then
  NeedSpaceLabel.Caption := 'Требуется как минимум '+ FloatToStr(round(NeedSize/1024*100)/100) + ' Гб свободного дискового пространства.' else
  NeedSpaceLabel.Caption := 'Требуется как минимум '+ IntToStr(NeedSize)+ ' Мб свободного дискового пространства.';end;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
Begin while (Pos(' ', String) > 0) do Delete(String, Pos(' ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
Begin
if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
else Result:= String;
End;

Procedure GetDiskInfo(Disk: String);
Begin
FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
End;

Procedure ListBoxRefresh; var FreeB, TotalB: Cardinal; Path, String: string; Begin
ListBox.Items.Clear
for n:= 1 to 31 do // диск 'А' пропустить
if (GetLogicalDrives and (1 shl n)) > 0 then
if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
Path:= Copy(ListBox.Items[n],1,2) +'\' { если в накопителе нет диска, пропустить обновление }
if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего -'+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
ListBox: for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
StartMenuTreeView: if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
WizardForm.NoIconsCheck: begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

procedure InitializeWizard();
begin
  NeedSize := 6100;                  //Здесь указывается место для приложения
  WizardForm.DiskSpaceLabel.Hide;
  NeedSpaceLabel := TLabel.Create(WizardForm);
  with NeedSpaceLabel do
  begin
  Parent := WizardForm.SelectDirPage;
  Left := ScaleX(0);
  Top := ScaleY(220);
  Width := ScaleX(209);
  Height := ScaleY(13);
  end;
  ListBox:= TListBox.Create(WizardForm)
  ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
  ListBox.Font.Size:= 9
  ListBox.Font.Style:= []
  ListBox.Font.Name:= 'Courier New';
  ListBox.OnClick:= @ObjectOnClick;
  ListBox.Parent:= WizardForm.SelectDirPage;
  WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
  WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
  end;

procedure CurPageChanged(CurPageID: Integer);
  begin
  if CurPageID=wpSelectDir then
  begin
  GetNeedSpaceCaption;
  if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled:=False
  ListBoxRefresh
  end;
  end;


Gnom_aka_Lexander 01-04-2012 20:18 1891465

Цитата:

Цитата Raf-9600
он жалуется на некорректные символы »

Цитата:

Цитата Лександер
{pf}\MyApp »

Скорей всего в этой строчке пробел - проверь. При копировании с форумов такое бывает

Johny777 01-04-2012 20:20 1891466

Raf-9600,
пример использования самописных констант в коде

[CustomMessages]
Russian.upd_hl2=обновить Half-Life 2
English.upd_hl2=Update Half-Life2

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

[ code]
Caption := ExpandConstant('{cm:upd_hl2}');
+++++++++++++++++++++++++++++++++++++++
другой пример для запрета кириллицы в пути
Russian.rus_symbol_1=В пути установки присутствуют русские буквы, что недопустимо
English.rus_symbol_1=The installation path contains Russian letters, which is unacceptable

Russian.rus_symbol_2=Пожалуйста, повторите ввод.
English.rus_symbol_2=Please try again.

[ code]
MsgBox(ExpandConstant('{cm:rus_symbol_1}' #13#13 '{cm:rus_symbol_2}'), mbError, mb_Ok);

Raf-9600 01-04-2012 20:33 1891468

Цитата:

Цитата Лександер
Скорей всего в этой строчке пробел - проверь. При копировании с форумов такое бывает »

Удалил все пробелы, проблема осталась =\

Johny777, благодарю, вроде разобрался.

R.i.m.s.k.y. 01-04-2012 20:38 1891470

Цитата:

Цитата Raf-9600
Собсно с используемым мной скриптом для вывода сведений о винчестерах возникла трудность. Я бы хотел добавить в него мультиязычность по средствам CustomMessages, но я не ориентируюсь в "правописании". Может ли кто-нибудь показать пример решения этой проблемы? »

мой пример разбери внимательно, он и с CustomMessages, и в коде он расшифровывается и в не_в_коде

Johny777, Raf-9600, блеать, кто вас научил пустую строчку делать #13#13??!!11
#13 всего лишь опускает курсор по вертикали на строчку ниже но позиция по горизонтали остается таже самая!!11
в ДОСнах!!11
т.е. пример+#13+строка№2 канонически даст на выходе
Код:

пример
      строка№2

тк курсор надо переводить в начало строки, это называется "возврат каретки"
т.е. правильно пример+#13#10+строка№2 даст на выходе
Код:

пример
строка№2

нужна пустая строка? #13#10+#13#10
Вообще #13#10 забейте как константу один раз и не парьтесь!!!
Не, #13#13 конечно работает пока виндовый-оконный-рендер понимает, но ведь он может и вернуться к исходному пониманию!

Johny777 01-04-2012 20:59 1891484

Цитата:

Цитата R.i.m.s.k.y.
#13#10 »

думаешь она так часто используется?
у меня только в проверке кириллицы
и насчёт
Цитата:

Цитата R.i.m.s.k.y.
правильно пример+#13#10+строка№2 »

спасибо
я протупил
вот как у меня например в одном из rtf созданном в дизайнере>
читать дальше »
Код:

  { RichEditViewer8 }
  RichEditViewer8 := TRichEditViewer.Create(WizardForm);
  with RichEditViewer8 do
  begin
    Name := 'RichEditViewer8';
    Parent := Part1_ScrollBox;
    Left := ScaleX(0);
    Top := ScaleY(2728);
    Width := ScaleX(244);
    Height := ScaleY(382);
    BorderStyle := bsNone;
    Color := clHighlight;
    RTFText := '{\rtf1\fbidis\ansi\ansicpg1251\deff0{\fonttbl{\f0\froman\fprq2\fcharset204{\*\fname Times New Roman;}Times New Roman CYR;}{\f1\fnil\fcharset134 Tahoma;}}' + #13#10 +
        '\viewkind4\uc1\pard\ltrpar\nowidctlpar\lang1049\f0\fs24  \''cf\''ee\''ec\''e8\''ec\''ee \''ef\''ee\''eb\''ff \''ef\''ee\''e4\''e0\''e2\''eb\''e5\''ed\''e8\''ff \par' + #13#10 +
        '\''c0\''eb\''fc\''ff\''ed\''f1, \''ef\''f0\''e5\''e4\''ef\''ee\''eb\''ee\''e6\''e8\''f2\''e5\''eb\''fc\''ed\''ee, \par' + #13#10 +
        '\''ef\''f0\''e0\''ea\''f2\''e8\''ea\''f3\''e5\''f2 \''ea\''ee\''ed\''f2\''f0\''ee\''eb\''fc \''f0\''e0\''e7\''f3\''ec\''e0 \par' + #13#10 +
        '\''e8 \''e7\''e0\''ec\''e5\''ed\''f3 \''ef\''e0\''ec\''ff\''f2\''e8, \''ea\''e0\''ea \''ed\''e0\''ec \par' + #13#10 +
        '\''f1\''f2\''e0\''ed\''ee\''e2\''e8\''f2\''f1\''ff \''e8\''e7\''e2\''e5\''f1\''f2\''ed\''ee \''ef\''f0\''e8 \par' + #13#10 +
        '\''f0\''e0\''e7\''e3\''ee\''e2\''ee\''f0\''e0 \''f1 \''ee\''e4\''ed\''e8\''ec \''e8\''e7 \par' + #13#10 +
        '\''ab\''e3\''f0\''e0\''e6\''e4\''e0\''ed\''bb \''ed\''e0 \''e2\''ee\''ea\''e7\''e0\''eb\''e5, \par' + #13#10 +
        '\''ea\''ee\''f2\''ee\''f0\''fb\''e9, \''e2\''fb\''ef\''e8\''e2 \''e2\''ee\''e4\''f3, \''e7\''e0\''e1\''fb\''eb \par' + #13#10 +
        '\''ea\''e0\''ea \''ee\''ed \''f1\''fe\''e4\''e0 \''ef\''ee\''ef\''e0\''eb. \par' + #13#10 +
        '\''cd\''e0\''ef\''f0\''e0\''f8\''e8\''e2\''e0\''e5\''f2\''f1\''ff \''e2\''fb\''e2\''ee\''e4, \par' + #13#10 +
        '\''f7\''f2\''ee \''f2\''e0\''ea\''e8\''ec \''f1\''ef\''ee\''f1\''ee\''e1\''ee\''ec \''c0\''eb\''fc\''ff\''ed\''f1 \par' + #13#10 +
        '\''f5\''ee\''f7\''e5\''f2, \''f7\''f2\''ee\''e1\''fb \''eb\''fe\''e4\''e8 \''e7\''e0\''e1\''fb\''eb\''e8, \par' + #13#10 +
        '\''ef\''ee\''f7\''e5\''ec\''f3 \''ee\''ed\''e8 \''ed\''e5\''ed\''e0\''e2\''e8\''e4\''ff\''f2 \''e8\''f5 \''e8 \par' + #13#10 +
        '\''f1\''eb\''e5\''e4\''ee\''e2\''e0\''eb\''e8 \''e7\''e0 \''ed\''e8\''ec\''e8 \''ed\''e0 \''ef\''f3\''f2\''e8 \''ea \par' + #13#10 +
        '\''f1\''ee\''e7\''e4\''e0\''ed\''e8\''fe \''ed\''ee\''e2\''ee\''e3\''ee \''e8 \''e3\''ee\''f2\''ee\''e2\''ee\''e3\''ee \par' + #13#10 +
        '\''ea \''ef\''e5\''f0\''e5\''e2\''ee\''f1\''ef\''e8\''f2\''e0\''ed\''e8\''fe \''f0\''e0\''e7\''f3\''ec\''e0. \par' + #13#10 +
        ' \''cf\''f0\''ee\''f6\''e5\''f1\''f1 \''f1\''f2\''e8\''f0\''e0\''ed\''e8\''ff \''e2\''ee\''f1\''ef\''ee\''ec\''e8\''ed\''e0\''ed\''e8\''e9, \''ef\''f0\''ee\''ef\''e0\''e3\''e0\''ed\''e4\''fb \''c0\''eb\''fc\''ff\''ed\''f1\''e0 \''e8 \''e7\''e0\''ec\''e5\''ed\''fb \''ef\''e0\''ec\''ff\''f2\''e8 \''ef\''f0\''e5\''e4\''f1\''f2\''e0\''e2\''eb\''ff\''e5\''f2 \''ed\''e0\''ec \''f1\''ee\''eb\''e4\''e0\''f2\''e0 \''ed\''e5 \''f1\''ef\''ee\''f1\''ee\''e1\''ed\''ee\''e3\''ee \''ea \''f1\''ee\''ef\''f0\''ee\''f2\''e8\''e2\''eb\''e5\''ed\''e8\''fe \par' + #13#10 +
        '\pard\ltrpar\f1\fs16\par' + #13#10 +
        '}' + #13#10 +
        '';
  end;


везде через + пишется а раньше не замечал
что правда удобно через константу использовать это цвет
const
ColorA = $48c1ca;

R.i.m.s.k.y. 02-04-2012 07:59 1891705

Цитата:

Цитата Лександер
А чем Серегин конвертер не угодил? Проверял лично, хексовые записи он единственный конвертит адекватно »

хексовые записи я оставляю в reg-файле и импортирую через reg import
у меня есть подозрение что толстые бинарные/хексовые записи инно не заносит в реестр полностью а обрубает концовку
пример такой записи
Код:

"FilterData"=hex:02,00,00,00,01,00,80,ff,03,00,00,00,00,00,00,00,30,70,69,33,\
  00,00,00,00,00,00,00,00,6f,00,00,00,00,00,00,00,00,00,00,00,30,74,79,33,00,\
  00,00,00,98,07,00,00,a8,07,00,00,31,74,79,33,00,00,00,00,b8,07,00,00,a8,07,\
  00,00,32,74,79,33,00,00,00,00,b8,07,00,00,c8,07,00,00,33,74,79,33,00,00,00,\
  00,b8,07,00,00,d8,07,00,00,34,74,79,33,00,00,00,00,b8,07,00,00,e8,07,00,00,\
  35,74,79,33,00,00,00,00,98,07,00,00,f8,07,00,00,36,74,79,33,00,00,00,00,98,\
  07,00,00,08,08,00,00,37,74,79,33,00,00,00,00,98,07,00,00,18,08,00,00,38,74,\
  79,33,00,00,00,00,98,07,00,00,28,08,00,00,39,74,79,33,00,00,00,00,98,07,00,\
  00,38,08,00,00,3a,74,79,33,00,00,00,00,98,07,00,00,48,08,00,00,3b,74,79,33,\
  00,00,00,00,98,07,00,00,58,08,00,00,3c,74,79,33,00,00,00,00,98,07,00,00,68,\
  08,00,00,3d,74,79,33,00,00,00,00,98,07,00,00,d8,07,00,00,3e,74,79,33,00,00,\
  00,00,98,07,00,00,78,08,00,00,3f,74,79,33,00,00,00,00,98,07,00,00,88,08,00,\
  00,40,74,79,33,00,00,00,00,98,07,00,00,98,08,00,00,41,74,79,33,00,00,00,00,\
  98,07,00,00,a8,08,00,00,42,74,79,33,00,00,00,00,98,07,00,00,b8,08,00,00,43,\
  74,79,33,00,00,00,00,98,07,00,00,c8,08,00,00,44,74,79,33,00,00,00,00,98,07,\
  00,00,d8,08,00,00,45,74,79,33,00,00,00,00,98,07,00,00,e8,08,00,00,46,74,79,\
  33,00,00,00,00,98,07,00,00,f8,08,00,00,47,74,79,33,00,00,00,00,98,07,00,00,\
  08,09,00,00,48,74,79,33,00,00,00,00,98,07,00,00,18,09,00,00,49,74,79,33,00,\
  00,00,00,98,07,00,00,28,09,00,00,4a,74,79,33,00,00,00,00,98,07,00,00,38,09,\
  00,00,4b,74,79,33,00,00,00,00,98,07,00,00,48,09,00,00,4c,74,79,33,00,00,00,\
  00,98,07,00,00,58,09,00,00,4d,74,79,33,00,00,00,00,98,07,00,00,68,09,00,00,\
  4e,74,79,33,00,00,00,00,98,07,00,00,78,09,00,00,4f,74,79,33,00,00,00,00,98,\
  07,00,00,88,09,00,00,50,74,79,33,00,00,00,00,98,07,00,00,98,09,00,00,51,74,\
  79,33,00,00,00,00,98,07,00,00,a8,09,00,00,52,74,79,33,00,00,00,00,98,07,00,\
  00,b8,09,00,00,53,74,79,33,00,00,00,00,98,07,00,00,c8,09,00,00,54,74,79,33,\
  00,00,00,00,98,07,00,00,d8,09,00,00,55,74,79,33,00,00,00,00,98,07,00,00,e8,\
  09,00,00,56,74,79,33,00,00,00,00,98,07,00,00,e8,07,00,00,57,74,79,33,00,00,\
  00,00,98,07,00,00,f8,09,00,00,58,74,79,33,00,00,00,00,98,07,00,00,08,0a,00,\
  00,59,74,79,33,00,00,00,00,98,07,00,00,18,0a,00,00,5a,74,79,33,00,00,00,00,\
  98,07,00,00,28,0a,00,00,5b,74,79,33,00,00,00,00,98,07,00,00,38,0a,00,00,5c,\
  74,79,33,00,00,00,00,98,07,00,00,48,0a,00,00,5d,74,79,33,00,00,00,00,98,07,\
  00,00,58,0a,00,00,5e,74,79,33,00,00,00,00,98,07,00,00,68,0a,00,00,5f,74,79,\
  33,00,00,00,00,98,07,00,00,78,0a,00,00,60,74,79,33,00,00,00,00,98,07,00,00,\
  88,0a,00,00,61,74,79,33,00,00,00,00,98,07,00,00,98,0a,00,00,62,74,79,33,00,\
  00,00,00,98,07,00,00,a8,0a,00,00,63,74,79,33,00,00,00,00,98,07,00,00,b8,0a,\
  00,00,64,74,79,33,00,00,00,00,98,07,00,00,c8,0a,00,00,65,74,79,33,00,00,00,\
  00,98,07,00,00,d8,0a,00,00,66,74,79,33,00,00,00,00,98,07,00,00,e8,0a,00,00,\
  67,74,79,33,00,00,00,00,98,07,00,00,f8,0a,00,00,68,74,79,33,00,00,00,00,98,\
  07,00,00,08,0b,00,00,69,74,79,33,00,00,00,00,98,07,00,00,18,0b,00,00,6a,74,\
  79,33,00,00,00,00,98,07,00,00,28,0b,00,00,6b,74,79,33,00,00,00,00,98,07,00,\
  00,38,0b,00,00,6c,74,79,33,00,00,00,00,98,07,00,00,c8,07,00,00,6d,74,79,33,\
  00,00,00,00,98,07,00,00,48,0b,00,00,6e,74,79,33,00,00,00,00,98,07,00,00,58,\
  0b,00,00,6f,74,79,33,00,00,00,00,98,07,00,00,68,0b,00,00,70,74,79,33,00,00,\
  00,00,98,07,00,00,78,0b,00,00,71,74,79,33,00,00,00,00,98,07,00,00,88,0b,00,\
  00,72,74,79,33,00,00,00,00,98,07,00,00,98,0b,00,00,73,74,79,33,00,00,00,00,\
  98,07,00,00,a8,0b,00,00,74,74,79,33,00,00,00,00,98,07,00,00,b8,0b,00,00,75,\
  74,79,33,00,00,00,00,98,07,00,00,c8,0b,00,00,76,74,79,33,00,00,00,00,98,07,\
  00,00,d8,0b,00,00,77,74,79,33,00,00,00,00,98,07,00,00,e8,0b,00,00,78,74,79,\
  33,00,00,00,00,98,07,00,00,f8,0b,00,00,79,74,79,33,00,00,00,00,98,07,00,00,\
  08,0c,00,00,7a,74,79,33,00,00,00,00,98,07,00,00,18,0c,00,00,7b,74,79,33,00,\
  00,00,00,98,07,00,00,28,0c,00,00,7c,74,79,33,00,00,00,00,98,07,00,00,38,0c,\
  00,00,7d,74,79,33,00,00,00,00,98,07,00,00,48,0c,00,00,7e,74,79,33,00,00,00,\
  00,98,07,00,00,58,0c,00,00,7f,74,79,33,00,00,00,00,98,07,00,00,68,0c,00,00,\
  80,74,79,33,00,00,00,00,98,07,00,00,78,0c,00,00,81,74,79,33,00,00,00,00,98,\
  07,00,00,88,0c,00,00,82,74,79,33,00,00,00,00,98,07,00,00,98,0c,00,00,83,74,\
  79,33,00,00,00,00,98,07,00,00,a8,0c,00,00,84,74,79,33,00,00,00,00,98,07,00,\
  00,b8,0c,00,00,85,74,79,33,00,00,00,00,98,07,00,00,c8,0c,00,00,86,74,79,33,\
  00,00,00,00,98,07,00,00,d8,0c,00,00,87,74,79,33,00,00,00,00,98,07,00,00,e8,\
  0c,00,00,88,74,79,33,00,00,00,00,98,07,00,00,f8,0c,00,00,89,74,79,33,00,00,\
  00,00,98,07,00,00,08,0d,00,00,8a,74,79,33,00,00,00,00,98,07,00,00,18,0d,00,\
  00,8b,74,79,33,00,00,00,00,98,07,00,00,28,0d,00,00,8c,74,79,33,00,00,00,00,\
  98,07,00,00,38,0d,00,00,8d,74,79,33,00,00,00,00,98,07,00,00,48,0d,00,00,8e,\
  74,79,33,00,00,00,00,98,07,00,00,58,0d,00,00,8f,74,79,33,00,00,00,00,98,07,\
  00,00,68,0d,00,00,90,74,79,33,00,00,00,00,98,07,00,00,78,0d,00,00,91,74,79,\
  33,00,00,00,00,98,07,00,00,88,0d,00,00,92,74,79,33,00,00,00,00,98,07,00,00,\
  98,0d,00,00,93,74,79,33,00,00,00,00,98,07,00,00,a8,0d,00,00,94,74,79,33,00,\
  00,00,00,98,07,00,00,b8,0d,00,00,95,74,79,33,00,00,00,00,98,07,00,00,c8,0d,\
  00,00,96,74,79,33,00,00,00,00,98,07,00,00,d8,0d,00,00,97,74,79,33,00,00,00,\
  00,98,07,00,00,e8,0d,00,00,98,74,79,33,00,00,00,00,98,07,00,00,f8,0d,00,00,\
  99,74,79,33,00,00,00,00,98,07,00,00,08,0e,00,00,9a,74,79,33,00,00,00,00,98,\
  07,00,00,18,0e,00,00,9b,74,79,33,00,00,00,00,98,07,00,00,28,0e,00,00,9c,74,\
  79,33,00,00,00,00,98,07,00,00,38,0e,00,00,9d,74,79,33,00,00,00,00,98,07,00,\
  00,48,0e,00,00,9e,74,79,33,00,00,00,00,98,07,00,00,58,0e,00,00,31,70,69,33,\
  08,00,00,00,00,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,30,74,79,33,00,\
  00,00,00,98,07,00,00,a8,07,00,00,32,70,69,33,00,00,00,00,00,00,00,00,04,00,\
  00,00,00,00,00,00,00,00,00,00,30,74,79,33,00,00,00,00,68,0e,00,00,a8,07,00,\
  00,31,74,79,33,00,00,00,00,78,0e,00,00,a8,07,00,00,32,74,79,33,00,00,00,00,\
  78,0e,00,00,88,0e,00,00,33,74,79,33,00,00,00,00,98,07,00,00,98,0e,00,00,76,\
  69,64,73,00,00,10,00,80,00,00,aa,00,38,9b,71,00,00,00,00,00,00,00,00,00,00,\
  00,00,00,00,00,00,6a,91,0b,ed,4d,04,d1,11,aa,78,00,c0,4f,c3,1d,60,26,80,6d,\
  e0,46,db,cf,11,b4,d1,00,80,5f,6c,bb,ea,41,56,43,31,00,00,10,00,80,00,00,aa,\
  00,38,9b,71,57,56,43,31,00,00,10,00,80,00,00,aa,00,38,9b,71,58,56,49,44,00,\
  00,10,00,80,00,00,aa,00,38,9b,71,78,76,69,64,00,00,10,00,80,00,00,aa,00,38,\
  9b,71,44,49,56,58,00,00,10,00,80,00,00,aa,00,38,9b,71,64,69,76,78,00,00,10,\
  00,80,00,00,aa,00,38,9b,71,44,58,35,30,00,00,10,00,80,00,00,aa,00,38,9b,71,\
  64,78,35,30,00,00,10,00,80,00,00,aa,00,38,9b,71,48,32,36,34,00,00,10,00,80,\
  00,00,aa,00,38,9b,71,68,32,36,34,00,00,10,00,80,00,00,aa,00,38,9b,71,61,76,\
  63,31,00,00,10,00,80,00,00,aa,00,38,9b,71,43,43,56,31,00,00,10,00,80,00,00,\
  aa,00,38,9b,71,48,32,36,33,00,00,10,00,80,00,00,aa,00,38,9b,71,68,32,36,33,\
  00,00,10,00,80,00,00,aa,00,38,9b,71,44,49,56,33,00,00,10,00,80,00,00,aa,00,\
  38,9b,71,64,69,76,33,00,00,10,00,80,00,00,aa,00,38,9b,71,4d,50,34,33,00,00,\
  10,00,80,00,00,aa,00,38,9b,71,6d,70,34,33,00,00,10,00,80,00,00,aa,00,38,9b,\
  71,4d,50,34,32,00,00,10,00,80,00,00,aa,00,38,9b,71,6d,70,34,32,00,00,10,00,\
  80,00,00,aa,00,38,9b,71,4d,50,34,31,00,00,10,00,80,00,00,aa,00,38,9b,71,6d,\
  70,34,31,00,00,10,00,80,00,00,aa,00,38,9b,71,4d,50,34,56,00,00,10,00,80,00,\
  00,aa,00,38,9b,71,6d,70,34,76,00,00,10,00,80,00,00,aa,00,38,9b,71,4d,50,34,\
  53,00,00,10,00,80,00,00,aa,00,38,9b,71,6d,70,34,73,00,00,10,00,80,00,00,aa,\
  00,38,9b,71,53,45,44,47,00,00,10,00,80,00,00,aa,00,38,9b,71,73,65,64,67,00,\
  00,10,00,80,00,00,aa,00,38,9b,71,57,4d,56,31,00,00,10,00,80,00,00,aa,00,38,\
  9b,71,77,6d,76,31,00,00,10,00,80,00,00,aa,00,38,9b,71,57,4d,56,32,00,00,10,\
  00,80,00,00,aa,00,38,9b,71,77,6d,76,32,00,00,10,00,80,00,00,aa,00,38,9b,71,\
  57,4d,56,33,00,00,10,00,80,00,00,aa,00,38,9b,71,77,6d,76,33,00,00,10,00,80,\
  00,00,aa,00,38,9b,71,77,76,63,31,00,00,10,00,80,00,00,aa,00,38,9b,71,56,50,\
  35,30,00,00,10,00,80,00,00,aa,00,38,9b,71,76,70,35,30,00,00,10,00,80,00,00,\
  aa,00,38,9b,71,56,50,36,30,00,00,10,00,80,00,00,aa,00,38,9b,71,76,70,36,30,\
  00,00,10,00,80,00,00,aa,00,38,9b,71,56,50,36,31,00,00,10,00,80,00,00,aa,00,\
  38,9b,71,76,70,36,31,00,00,10,00,80,00,00,aa,00,38,9b,71,56,50,36,32,00,00,\
  10,00,80,00,00,aa,00,38,9b,71,76,70,36,32,00,00,10,00,80,00,00,aa,00,38,9b,\
  71,56,50,36,46,00,00,10,00,80,00,00,aa,00,38,9b,71,76,70,36,66,00,00,10,00,\
  80,00,00,aa,00,38,9b,71,46,4c,56,34,00,00,10,00,80,00,00,aa,00,38,9b,71,66,\
  6c,76,34,00,00,10,00,80,00,00,aa,00,38,9b,71,48,46,59,55,00,00,10,00,80,00,\
  00,aa,00,38,9b,71,68,66,79,75,00,00,10,00,80,00,00,aa,00,38,9b,71,33,49,56,\
  32,00,00,10,00,80,00,00,aa,00,38,9b,71,33,69,76,32,00,00,10,00,80,00,00,aa,\
  00,38,9b,71,33,49,56,58,00,00,10,00,80,00,00,aa,00,38,9b,71,33,69,76,78,00,\
  00,10,00,80,00,00,aa,00,38,9b,71,80,eb,36,e4,4f,52,ce,11,9f,53,00,20,af,0b,\
  a7,70,81,eb,36,e4,4f,52,ce,11,9f,53,00,20,af,0b,a7,70,4d,50,47,32,00,00,10,\
  00,80,00,00,aa,00,38,9b,71,6d,70,67,32,00,00,10,00,80,00,00,aa,00,38,9b,71,\
  45,4d,32,56,00,00,10,00,80,00,00,aa,00,38,9b,71,65,6d,32,76,00,00,10,00,80,\
  00,00,aa,00,38,9b,71,4d,4d,45,53,00,00,10,00,80,00,00,aa,00,38,9b,71,6d,6d,\
  65,73,00,00,10,00,80,00,00,aa,00,38,9b,71,56,50,33,31,00,00,10,00,80,00,00,\
  aa,00,38,9b,71,76,70,33,31,00,00,10,00,80,00,00,aa,00,38,9b,71,54,53,43,43,\
  00,00,10,00,80,00,00,aa,00,38,9b,71,74,73,63,63,00,00,10,00,80,00,00,aa,00,\
  38,9b,71,43,52,41,4d,00,00,10,00,80,00,00,aa,00,38,9b,71,63,72,61,6d,00,00,\
  10,00,80,00,00,aa,00,38,9b,71,41,56,52,4e,00,00,10,00,80,00,00,aa,00,38,9b,\
  71,61,76,72,6e,00,00,10,00,80,00,00,aa,00,38,9b,71,46,50,53,31,00,00,10,00,\
  80,00,00,aa,00,38,9b,71,66,70,73,31,00,00,10,00,80,00,00,aa,00,38,9b,71,57,\
  4d,56,50,00,00,10,00,80,00,00,aa,00,38,9b,71,77,6d,76,70,00,00,10,00,80,00,\
  00,aa,00,38,9b,71,57,56,50,32,00,00,10,00,80,00,00,aa,00,38,9b,71,77,76,70,\
  32,00,00,10,00,80,00,00,aa,00,38,9b,71,4d,4a,50,47,00,00,10,00,80,00,00,aa,\
  00,38,9b,71,6d,6a,70,67,00,00,10,00,80,00,00,aa,00,38,9b,71,4d,4a,50,41,00,\
  00,10,00,80,00,00,aa,00,38,9b,71,6d,6a,70,61,00,00,10,00,80,00,00,aa,00,38,\
  9b,71,41,4d,56,56,00,00,10,00,80,00,00,aa,00,38,9b,71,53,50,35,58,00,00,10,\
  00,80,00,00,aa,00,38,9b,71,44,56,53,44,00,00,10,00,80,00,00,aa,00,38,9b,71,\
  64,76,73,64,00,00,10,00,80,00,00,aa,00,38,9b,71,44,56,32,35,00,00,10,00,80,\
  00,00,aa,00,38,9b,71,64,76,32,35,00,00,10,00,80,00,00,aa,00,38,9b,71,44,56,\
  35,30,00,00,10,00,80,00,00,aa,00,38,9b,71,64,76,35,30,00,00,10,00,80,00,00,\
  aa,00,38,9b,71,43,44,56,43,00,00,10,00,80,00,00,aa,00,38,9b,71,63,64,76,63,\
  00,00,10,00,80,00,00,aa,00,38,9b,71,43,44,56,35,00,00,10,00,80,00,00,aa,00,\
  38,9b,71,63,64,76,35,00,00,10,00,80,00,00,aa,00,38,9b,71,44,56,49,53,00,00,\
  10,00,80,00,00,aa,00,38,9b,71,64,76,69,73,00,00,10,00,80,00,00,aa,00,38,9b,\
  71,50,44,56,43,00,00,10,00,80,00,00,aa,00,38,9b,71,70,64,76,63,00,00,10,00,\
  80,00,00,aa,00,38,9b,71,59,56,31,32,00,00,10,00,80,00,00,aa,00,38,9b,71,49,\
  59,55,56,00,00,10,00,80,00,00,aa,00,38,9b,71,59,55,59,32,00,00,10,00,80,00,\
  00,aa,00,38,9b,71,59,55,59,56,00,00,10,00,80,00,00,aa,00,38,9b,71,55,59,56,\
  59,00,00,10,00,80,00,00,aa,00,38,9b,71,56,59,55,59,00,00,10,00,80,00,00,aa,\
  00,38,9b,71,7e,eb,36,e4,4f,52,ce,11,9f,53,00,20,af,0b,a7,70,7d,eb,36,e4,4f,\
  52,ce,11,9f,53,00,20,af,0b,a7,70,7c,eb,36,e4,4f,52,ce,11,9f,53,00,20,af,0b,\
  a7,70,7b,eb,36,e4,4f,52,ce,11,9f,53,00,20,af,0b,a7,70,74,78,74,73,00,00,10,\
  00,80,00,00,aa,00,38,9b,71,08,eb,87,e4,26,6b,e9,4b,9d,d3,99,34,34,d3,13,fd,\
  3e,a5,eb,04,30,93,6c,43,91,33,55,3e,c8,70,31,dc,2d,80,6d,e0,46,db,cf,11,b4,\
  d1,00,80,5f,6c,bb,ea


Ivan_009 02-04-2012 13:45 1891871

Как растянуть выделенную область через редактор форм в расширенной версии Inno Setup подскажите пожалуйста :drug:

Johny777 02-04-2012 14:41 1891910

Ivan_009,
а вот тут косяк
растянуть можно только так

alert30 02-04-2012 19:05 1892097

Ivan_009, сделаю короткую запись от Johny777: где квадратики (вверх-вниз-вправо-влево-диагональ), можешь изменить как-угодно.

Johny777 02-04-2012 20:21 1892142

Лександер,
использую твою выкатывающуюся панель с предыдущей ветки
читать дальше »
Код:

var
Panel3: TPanel;

procedure ConsoleButtonClick(Sender: TObject);
var
i:integer;
begin
i:=Panel3.Left;
If i= -Panel3.Width then
begin
MnuItem.Caption := ExpandConstant('{cm:Console0}');
while True do
begin
Panel3.Left:= ScaleX(i);
//ComponentsPage.Surface.Repaint;
if i=0 then Break;
i:=i+1;
end;
end else
begin
while True do
begin
Panel3.Left:= ScaleX(i);
//ComponentsPage.Surface.Repaint;
if i=-Panel3.Width then Break;
i:=i-1;
end;
MnuItem.Caption := ExpandConstant('{cm:Console1}');
end;
end;


если эта строка задействована, то очень некрасиво мелькает страница
//ComponentsPage.Surface.Repaint;
вроде есть решение в виде WizardForm.DoubleBuffered := True, которая доступна только в Unicode. Но у меня ANSI
может есть другое решение?

Gnom_aka_Lexander 02-04-2012 20:23 1892145

Есть ,поищи, я выкладывал этот-же пример но на таймере - там более плавно и вроде без репайнта нормально отрисовывается.

Johny777 03-04-2012 15:36 1892619

использую флаг onlyifdoesntexist, тк общие файлы много весят и иногда просто нужно сменить озвучку, но заметил, что если файл не тот, но имеет то же название, то он пропускается.
хотел сделать две радиокнопки "дополнять" и "перезаписывать" (или "простая установка" и "ремонт")
так не работает
Flags: {code:flags}
читать дальше »

---------------------------
Ошибка компиляции
---------------------------
Строка 8:

Parameter "Flags" includes an unknown flag.
---------------------------
ОК
---------------------------

может дублировать строки?
например
Source: steamapps\common half-life 2\*; DestDir: {app}; Flags: другие флаги onlyifdoesntexist; AfterInstall: ExtLog(); BeforeInstall: AddToMemo; Check: make_hl2 and addon
Source: steamapps\common half-life 2\*; DestDir: {app}; Flags: другие флаги ; AfterInstall: ExtLog(); BeforeInstall: AddToMemo; Check: make_hl2 and overwrite
где addon это
function addon: Boolean;
begin
Result:=addonRadiobutton.Checked;
end;
ну и если .Checked, то эта строка
те же махинации для другой
но не знаю. Как-то странно получается
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
не
читать дальше »
может у кого есть идеи?

нашёл решение

вот кому пригодится
(проверено)
читать дальше »

Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=none
OutputDir=.


[Files]
; один и тот же файл 2 раза, но без флага onlyifdoesntexist
Source: setup\setup-1.bin; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension onlyifdoesntexist; Check: skip
Source: setup\setup-1.bin; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension; Check: ow

[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D003010E002000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167650D53656C656374446972506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED00000F544E6577526164696F427574746F6E144F7665727772697465526164696F427574746F6E044C656674022803546F7003800005576964746802710648656967687402110743617074696F6E120A0000003F04350440043504370430043F04380441044C0407436865636B656409085461624F7264657202050754616253746F700900000F544E6577526164696F427574746F6E0F536B6970526164696F427574746F6E044C656674022803546F7003A00005576964746802790648656967687402110743617074696F6E1421000000D0BFD180D0BED181D182D0B0D18F20D183D181D182D0B0D0BDD0BED0B2D0BAD0B0085461624F72646572020600000000000000

[  Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  OverwriteRadioButton: TNewRadioButton;
  SkipRadioButton: TNewRadioButton;

procedure RedesignWizardForm;
begin
  { OverwriteRadioButton }
  OverwriteRadioButton := TNewRadioButton.Create(WizardForm);
  with OverwriteRadioButton do
  begin
    Name := 'OverwriteRadioButton';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(40);
    Top := ScaleY(128);
    Width := ScaleX(113);
    Height := ScaleY(17);
    Caption := 'перезапись';
    Checked := True;
    TabStop := True;
  end;

  { SkipRadioButton }
  SkipRadioButton := TNewRadioButton.Create(WizardForm);
  with SkipRadioButton do
  begin
    Name := 'SkipRadioButton';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(40);
    Top := ScaleY(160);
    Width := ScaleX(121);
    Height := ScaleY(17);
    Caption := 'простая установка';
  end;

  OverwriteRadioButton.TabOrder := 5;
  SkipRadioButton.TabOrder := 6;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;


function skip: Boolean;
begin
  Result:=SkipRadioButton.Checked;
end;
function ow: Boolean;
begin
  Result:=OverwriteRadioButton.Checked;
end;


размер больше не становится, тк MergeDuplicateFiles по умолчанию true, но идёт двойная распаковка, если строка относится ещё к чему-то. Например к чекбоксу :(

R.i.m.s.k.y. 03-04-2012 15:44 1892629

Johny777, да можно делать две такие строчки
если файл пропускается - смотри на флаг ignoreversion

El Sanchez 03-04-2012 17:40 1892721

Цитата:

Цитата Johny777
вроде есть решение в виде WizardForm.DoubleBuffered := True, которая доступна только в Unicode. Но у меня ANSI
может есть другое решение? »

Johny777, самое простое - задать расширенный стиль WS_EX_COMPOSITED форме:
Код:

SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED);

Devils Night 03-04-2012 21:18 1892858

А что это за финтиклюшка такая {ini:{src}\setup.ini,Setup,AppName}? Файлы приложил!
Какие ещё секции могут работать? Ну может Code там, что можно ещё в Setup добавить?
setup.rar

Johny777 04-04-2012 00:14 1892965

Цитата:

Цитата El Sanchez
SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED); »

вроде полностью будет так:
читать дальше »
Код:

const
  GWL_EXSTYLE = 16;
  WS_EX_COMPOSITED = 20;

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

procedure initializeWizard();
begin
  SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED)
end;


а чему равны?
GWL_EXSTYLE = ?;
WS_EX_COMPOSITED = ?;
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,
Цитата:

Цитата Devils Night
что можно ещё в Setup добавить? »

да много чего
вот например El Sanchez выкладывал много страниц назад
не даёт пользователю запустить тот же инсталл несколько раз пока он работает
очень полезная штука!
читать дальше »
Код:

[Setup]
AppMutex=MyProgramMutexUniqueName

[  code]
procedure InitializeWizard();
begin
  CreateMutex('MyProgramMutexUniqueName');
end;


или
читать дальше »

/// обновить рабочий после установки
ChangesAssociations=true
ChangesEnvironment=true
/// поиск установленной версии через реестр
AppId=MySuperAppid
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID") }_is1,InstallLocation|{pf}\Source Engine 15}
/// максимальное сжатие /// начало
Compression=none
///lzma2/ultra64
LZMAUseSeparateProcess=yes
LZMAMatchFinder=BT
LZMANumFastBytes=273
LZMADictionarySize=262144
///LZMADictionarySize=131072
InternalCompressLevel=ultra64
///SolidCompression=true
MergeDuplicateFiles=true
/// конец
/// описание экзешника инсталла
VersionInfoDescription=не запускай меня
/// версия экзешника
VersionInfoVersion=1.1.1.1
/// не отображать окно выбора язык а при запуске
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage

Devils Night 04-04-2012 02:49 1893021

Цитата:

Цитата Johny777
да много чего »

Ну вообще это понятие растяжимое конечно, да и я виноват в том что точнее не выразился что нужно! А так за разъяснение спасибо, кое что не было известно.
Я имею ввиду не в *.iss добавить что-то в секцию [Setup] например DefaultDirName={pf}\My Program, а именно что ещё можно добавить в *.iss для Setup.ini в секцию [Setup]?
Например в iss хотел добавить DefaultDirName={pf}\My Program для ini, т.е DefaultDirName={ini:{src}\setup.ini,Setup,DefaultDirName}, а в ini добавил DefaultDirName={pf}\My Program, так в итоге нифига не получилось, при компиляции выдало ошибку.

wertulll 04-04-2012 06:55 1893038

помогите пожалуйста прикрутить к этому скрипту отображение времяни и процентов установки

скрипт
читать дальше »

#define MyAppName "Deus Ex Human Revolution"
#define NeedSize "7168"
#include "Module\Components.iss"


[Setup]
SetupIconFile=1.ico
Diskspanning=yes
AppName=Deus Ex - Human Revolution
AppVerName=Deus Ex - Human Revolution
DefaultDirName={pf}\Deus Ex - Human Revolution
DefaultGroupName=Deus Ex - Human Revolution
DirExistsWarning=no
AppVersion=1.0
OutputBaseFilename=setup
OutputDir=.
VersionInfoCopyright=Me
AppPublisher=Square Enix
WizardImageFile=Files\WizardImage.bmp
WizardSmallImageFile=Files\WizardSmallImage.bmp
UninstallDisplayIcon=1.ico
ShowTasksTreeLines=true

[UninstallDelete]
Type: filesandordirs; Name: {app}


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

[Tasks]
Name: desktopicon; Description: Создать значок на Рабочем столе; GroupDescription: Дополнительные значки:
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить Microsoft DirectX; Flags: unchecked
Name: Redist\VCCheck; Description: Установить Microsoft Visual C++ Redist; Flags: unchecked


[CustomMessages]
rus.Welcome2=Программа установит игру {#MyAppName} на Ваш компьютер.%n%nРекомендуется закрыть антивирусные пакеты, а также все прочие приложения перед тем, как продолжить.
rus.Finished=Игра {#MyAppName} установлена на Ваш компьютер.%n%nПриложение можно запустить с помощью соответствующего значка.%n%nНажмите «Завершить», чтобы выйти из программы установки.

[Files]

Source: Files\unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: Files\InnoCallback.dll; DestDir: {tmp}; Flags: dontcopy
Source: Files\facompress.dll; DestDir: {tmp}; Flags: dontcopy
Source: Files\papka.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\Finishe.bmp; DestDir: {tmp}; Flags: dontcopy

[Icons]
Name: "{group}\My Program"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon






[Run]
Filename: {src}\Redist\DirectX\DXSETUP.exe; StatusMsg: Обновление компонентов DirectX...; Tasks: Redist\DirectXCheck; Flags: waituntilterminated; Parameters: "/silent";
Filename: "{src}\Redist\vcredist_x86.exe"; StatusMsg: "Установка Microsoft Visual C++ Redist..."; Tasks: Redist\VCCheck; Flags: waituntilterminated; Parameters: "/Q";


[Registry]

Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "InstallPath"; ValueType: String; ValueData: "{app}";
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "Version"; ValueType: String; ValueData: "1.0";
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "Language"; ValueType: String; ValueData: "Russian";



[code]
var
WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;
PageNameLabel, PageDescriptionLabel: TLabel;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=True;
end;

procedure Labels();
begin
WelcomeLabel1:= TLabel.Create(WizardForm);
WelcomeLabel1.AutoSize:= False;
with WizardForm.WelcomeLabel1 do
//координаты WelcomeLabel1
WelcomeLabel1.SetBounds(ScaleX(30), ScaleY(10), ScaleX(200), ScaleY(220));
WelcomeLabel1.Font:= WizardForm.WelcomeLabel1.Font
WelcomeLabel1.Font.Color:= clWhite;
WelcomeLabel1.Transparent:= True;
WelcomeLabel1.WordWrap:= true;
WelcomeLabel1.Caption:= WizardForm.WelcomeLabel1.Caption;
WelcomeLabel1.Parent:= WizardForm.WelcomePage

WelcomeLabel2:= TLabel.Create(WizardForm);
WelcomeLabel2.AutoSize:= False;
with WizardForm.WelcomeLabel2 do
//координаты WelcomeLabel2
WelcomeLabel2.SetBounds(ScaleX(30), ScaleY(105), ScaleX(130), ScaleY(220));
WelcomeLabel2.Font:= WizardForm.WelcomeLabel2.Font
WelcomeLabel2.Font.Color:= clWhite;
WelcomeLabel2.Transparent:= True;
WelcomeLabel2.WordWrap:= true;
WelcomeLabel2.Caption:= ExpandConstant('{cm:Welcome2}');
WelcomeLabel2.Caption:= WizardForm.WelcomeLabel2.Caption;
WelcomeLabel2.Parent:= WizardForm.WelcomePage

WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);

PageNameLabel:= TLabel.Create(WizardForm)
with WizardForm.PageNameLabel do
PageNameLabel.SetBounds(Left, Top, Width, Height);
PageNameLabel.Transparent:= True;
PageNameLabel.Font:= WizardForm.PageNameLabel.Font;
PageNameLabel.Font.Color:= clWhite; //цвет надписи
PageNameLabel.Parent:= WizardForm.MainPanel;

PageDescriptionLabel:= TLabel.Create(WizardForm)
with WizardForm.PageDescriptionLabel do
PageDescriptionLabel.SetBounds(Left, Top, Width, Height);
PageDescriptionLabel.Transparent:= True;
PageDescriptionLabel.Font:= WizardForm.PageDescriptionLabel.Font;
PageDescriptionLabel.Font.Color:= clWhite; //цвет надписи
PageDescriptionLabel.Parent:= WizardForm.MainPanel;

FinishedHeadingLabel:= TLabel.Create(WizardForm);
FinishedHeadingLabel.AutoSize:= False;
with WizardForm.FinishedHeadingLabel do
//координаты FinishedHeadingLabel
FinishedHeadingLabel.SetBounds(ScaleX(30), ScaleY(20), ScaleX(200), ScaleY(220));
FinishedHeadingLabel.Font:= WizardForm.FinishedHeadingLabel.Font
FinishedHeadingLabel.Font.Color:= clWhite;
FinishedHeadingLabel.Transparent:= True;
FinishedHeadingLabel.WordWrap:= true;
FinishedHeadingLabel.Parent:= WizardForm.FinishedPage

FinishedLabel:= TLabel.Create(WizardForm);
FinishedLabel.AutoSize:= False;
with WizardForm.FinishedLabel do
//координаты FinishedLabel
FinishedLabel.SetBounds(ScaleX(30), ScaleY(120), ScaleX(130), ScaleY(220));
FinishedLabel.Font:= WizardForm.FinishedLabel.Font
FinishedLabel.Font.Color:= clWhite;
FinishedLabel.Transparent:= True;
FinishedLabel.WordWrap:= true;
FinishedLabel.Parent:= WizardForm.FinishedPage

WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.FilenameLabel.Hide;
WizardForm.StatusLabel.Caption:='Идет распаковка данных, ждем...'
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
end;


procedure InitializeWizard();
Begin
LabelSize();
ButtonTextures();
Labels();
ExtractTemporaryFile('Finishe.bmp');
WizardForm.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Finishe.bmp'));
ExtractTemporaryFile('papka.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=true;
WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=true;

end;
Procedure CurPageChanged(CurPageID: Integer);
Begin
UpdateButtons();
FinishedLabel.Caption:= ExpandConstant('{cm:Finished}');
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
//PageDescriptionLabel.Caption:= WizardForm.PageDescriptionLabel.Caption;

FinishedHeadingLabel.Caption:= WizardForm.FinishedHeadingLabel.Caption;



begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
begin
WizardForm.NextButton.Enabled := False;
ButtonLabel[bidNext].Enabled := False;
ButtonPanel[bidNext].Enabled := False;
end;
end;
end;


и к нему Components.iss

читать дальше »

[CustomMessages]
rus.Space=Доступно места на диске:
rus.Space1=Требуется места на диске:

[Files]
Source: Files\button2.bmp; DestDir: {tmp}; Flags: dontcopy

[code]
const
ButtonWidth = 80;
ButtonHeight = 23;
Color = clblack;

bidBack = 0;
bidNext = 1;
bidCancel = 2;
bidDirBrowse = 3;
bidGroupBrowse = 4;
bidbtnCancelUnpacking = 5;

var
WizardLabel: TLabel;
ButtonPanel: array of TPanel;
ButtonImage: array of TBitmapImage;
ButtonLabel: array of TLabel;
UsedButtons: array of TButton;
ButtonsCount: Integer;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.2n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ NumToStr(round(FreeMB/1024*100)/100) + ' Гб' else
FreeSpaceLabel.Caption := ExpandConstant('{cm:SPACE} ')+ IntToStr(FreeMB)+ ' Мб';
if WizardForm.CurPageID = wpSelectDir then begin //Чтоб не было глюков на других страницах
if FreeMB < NeedSize then begin
WizardForm.NextButton.Enabled := False;
ButtonPanel[bidNext].Enabled:= False;
ButtonLabel[bidNext].Enabled:= False;
end else begin
WizardForm.NextButton.Enabled := True;
ButtonPanel[bidNext].Enabled:= True;
ButtonLabel[bidNext].Enabled:= True; end;
end;
end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ NumToStr(round(NeedSize/1024*100)/100) + ' Гб' else
NeedSpaceLabel.Caption := ExpandConstant('{cm:SPACE1} ')+ NumToStr(NeedSize)+ ' Мб';
end;

procedure LabelSize();
begin
NeedSize:= {#NeedSize};
with WizardForm do
begin
DiskSpaceLabel.Hide;end;
////////////////////// SelectDirPage //////////////////////
NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;

FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;
end;

procedure ButtonLabelClick(Sender: TObject);
var Button: TButton; n, i: Integer;
begin
i:= TLabel(Sender).Tag; ButtonImage[i].Left:= 0
for n:=0 to (ButtonsCount-1) do begin
if i = n then Button:= UsedButtons[n];
end;
Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n, I: Integer;
begin
I:=TLabel(Sender).Tag;
//Сначала восстанавливаем картинку у всех кнопок, так надо иначе могут быть глюки
for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end;
//Теперь собственно ставим нужную картинку
if (ButtonLabel[i].Enabled)and(ButtonImage[i].Left <> -ButtonWidth*2) then begin ButtonImage[i].Left:= -ButtonWidth; end;
end;

procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n: Integer;
begin
//Т.к Sender'ом выступает WizardLabel то не получится испльзовать индекс кнопки
for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end;
end;

procedure LoadButtonImage(AButton: TButton);
var n: Integer;
begin
n:=ButtonsCount; SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1); SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1); UsedButtons[n]:= AButton;

ButtonPanel[n]:=TPanel.Create(WizardForm)
ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height)
ButtonPanel[n].Tag:= n
ButtonPanel[n].Enabled:= AButton.Enabled
ButtonPanel[n].Parent:=AButton.Parent

ButtonImage[n]:=TBitmapImage.Create(WizardForm)
ButtonImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(320), ScaleY(23))
ButtonImage[n].Enabled:=False
ButtonImage[n].Bitmap.LoadFromFile(ExpandConstant('{tmp}\Button2.bmp'))
ButtonImage[n].Parent:=ButtonPanel[n]

with TLabel.Create(WizardForm) do begin
Tag:=n
Parent:=ButtonPanel[n]
Width:=AButton.Width
Height:=AButton.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseMove:=@ButtonLabelMove
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end;

ButtonLabel[n]:=TLabel.Create(WizardForm)
ButtonLabel[n].Autosize:=True
ButtonLabel[n].Alignment:=taCenter
ButtonLabel[n].Tag:=n
ButtonLabel[n].Enabled:= AButton.Enabled
ButtonLabel[n].Transparent:=True
ButtonLabel[n].Font.Color:=clWhite
ButtonLabel[n].Caption:=AButton.Caption
ButtonLabel[n].OnClick:=@ButtonLabelClick
ButtonLabel[n].OnDblClick:=@ButtonLabelClick
ButtonLabel[n].OnMouseMove:=@ButtonLabelMove
ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown
ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp
ButtonLabel[n].Parent:=ButtonPanel[n]

ButtonsCount:= ButtonsCount+1
end;

procedure UpdateButtons();
var n: Integer;
begin
for n:=0 to ButtonsCount-1 do begin
ButtonLabel[n].Caption:=UsedButtons[n].Caption
ButtonPanel[n].Visible:=UsedButtons[n].Visible
if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0;
ButtonLabel[n].Enabled:= UsedButtons[n].Enabled;
ButtonPanel[n].Enabled:= UsedButtons[n].Enabled;
//Ставим Left и Top лейбла соразмерно размеру лейбла
ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку активной
WizardForm.NextButton.Enabled:= True;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку неактивной
WizardForm.NextButton.Enabled:= False;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons()
end;

procedure ButtonTextures();
begin
WizardForm.Font.Color:=clWhite;
WizardForm.Color:=Color;
WizardForm.WelcomePage.Color:=Color;
WizardForm.InnerPage.Color:=Color;
WizardForm.FinishedPage.Color:=Color;
WizardForm.LicensePage.Color:=Color;
WizardForm.PasswordPage.Color:=Color;
WizardForm.InfoBeforePage.Color:=Color;
WizardForm.UserInfoPage.Color:=Color;
WizardForm.SelectDirPage.Color:=Color;
WizardForm.SelectComponentsPage.Color:=Color;
WizardForm.SelectProgramGroupPage.Color:=Color;
WizardForm.SelectTasksPage.Color:=Color;
WizardForm.ReadyPage.Color:=Color;
WizardForm.PreparingPage.Color:=Color;
WizardForm.InstallingPage.Color:=Color;
WizardForm.InfoAfterPage.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.DiskSpaceLabel.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.GroupEdit.Color:=Color;
WizardForm.PasswordLabel.Color:=Color;
WizardForm.PasswordEdit.Color:=Color;
WizardForm.PasswordEditLabel.Color:=Color;
WizardForm.ReadyMemo.Color:=Color;
WizardForm.TypesCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.YesRadio.Color:=Color;
WizardForm.NoRadio.Color:=Color;
WizardForm.WelcomeLabel2.Color:=Color;
WizardForm.LicenseLabel1.Color:=Color;
WizardForm.InfoAfterClickLabel.Color:=Color;
WizardForm.ComponentsList.Color:=Color;
WizardForm.ComponentsDiskSpaceLabel.Color:=Color;
WizardForm.BeveledLabel.Color:=Color;
WizardForm.StatusLabel.Color:=Color;
WizardForm.FilenameLabel.Color:=Color;
WizardForm.SelectDirLabel.Color:=Color;
WizardForm.SelectStartMenuFolderLabel.Color:=Color;
WizardForm.SelectComponentsLabel.Color:=Color;
WizardForm.SelectTasksLabel.Color:=Color;
WizardForm.LicenseAcceptedRadio.Color:=Color;
WizardForm.LicenseNotAcceptedRadio.Color:=Color;
WizardForm.UserInfoNameLabel.Color:=Color;
WizardForm.UserInfoNameEdit.Color:=Color;
WizardForm.UserInfoOrgLabel.Color:=Color;
WizardForm.UserInfoOrgEdit.Color:=Color;
WizardForm.PreparingLabel.Color:=Color;
WizardForm.UserInfoSerialLabel.Color:=Color;
WizardForm.UserInfoSerialEdit.Color:=Color;
WizardForm.TasksList.Color:=Color;
WizardForm.RunList.Color:=Color;
WizardForm.SelectDirBrowseLabel.Color:=Color;
WizardForm.SelectStartMenuFolderBrowseLabel.Color:=Color;

WizardLabel:= TLabel.Create(WizardForm)
WizardLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(WizardForm.Width), ScaleY(WizardForm.Height))
WizardLabel.Transparent:= True;
WizardLabel.AutoSize:=false;
WizardLabel.OnMouseMove:=@WizardLabelMove
WizardLabel.Parent:= WizardForm;

WizardForm.BackButton.Width:= ButtonWidth
WizardForm.BackButton.Height:= ButtonHeight

WizardForm.NextButton.Width:= ButtonWidth
WizardForm.NextButton.Height:= ButtonHeight

WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:= ButtonHeight

WizardForm.DirBrowseButton.Left:=ScaleX(337)
WizardForm.DirBrowseButton.Width:= ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight

WizardForm.GroupBrowseButton.Left:=ScaleX(337)
WizardForm.GroupBrowseButton.Width:= ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick

WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button2.bmp')
LoadButtonImage(WizardForm.BackButton)
LoadButtonImage(WizardForm.NextButton)
LoadButtonImage(WizardForm.CancelButton)
LoadButtonImage(WizardForm.DirBrowseButton)
LoadButtonImage(WizardForm.GroupBrowseButton)
//Сначала текстурируются кнопки, затем выполняется процедура которую мы перенесли
WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;

Devils Night 04-04-2012 08:06 1893056

Цитата:

Цитата wertulll
помогите пожалуйста прикрутить »

Так что ли?!

Да и в следующий раз облочай всю свою портянку в CODE и под спойлер
PHP код:

[more][code][/code][/more

чтоб получилось примерно следующее:

, и какие нибудь файлы к скрипту прикрути, здесь люди не волшебники из страны ОЗ.

Script.7z

wertulll 04-04-2012 08:29 1893063

не получается не отображаются время и проценты установки

Raf-9600 04-04-2012 11:41 1893172

Ктонить может прикрутить возможность вертикальной прокрутки к коду на отображение комментариев к компонентам? В смысле чтоб если комментарий слишком велик, то справа него появлялся скроллбар.

Сам код:
читать дальше »
Код:

procedure InitializeWizard();
begin
  WizardForm.TypesCombo.Visible:=False;
  WizardForm.ComponentsList.Height := WizardForm.ComponentsList.Height + WizardForm.ComponentsList.Top - WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Top := WizardForm.TYPESCOMBO.Top;
  WizardForm.ComponentsList.Width := ScaleX(212);      //чем больше значение, тем уже
  WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription

  InfoPanel := TPanel.Create(WizardForm);
  InfoPanel.Parent := WizardForm.SelectComponentsPage;
  InfoPanel.Caption := '';
  InfoPanel.Top := WizardForm.ComponentsList.Top;        // поднимает панель, но опускает панель с текстом
  InfoPanel.Left := ScaleX(220);              //сдвигает текстовую панель
  InfoPanel.Width := ScaleX(197);
  InfoPanel.Height := WizardForm.ComponentsList.Height;
  InfoPanel.BevelInner := bvRaised;
  InfoPanel.BevelOuter := bvLowered;
  InfoCaption := TNewStaticText.Create(WizardForm);
  InfoCaption.Parent := WizardForm.SelectComponentsPage;
  InfoCaption.Caption := ExpandConstant('{cm:ComponentsInfoPanel1}');
  InfoCaption.Left := ScaleX(234);      // размещение слова Описание, по горизонтали
  InfoCaption.Top := InfoPanel.Top - ScaleY(5);    //поднять слово Описание
  InfoCaption.Font.Color := clActiveCaption;

  Info := TNewStaticText.Create(WizardForm);
  Info.Parent := InfoPanel;
  Info.AutoSize := False;
  Info.Left := ScaleX(6);
  Info.Width := ScaleX(188); //шырина текста
  Info.Top := ScaleY(12);    //Чем больше значение, тем ниже опускаеться полоска текста
  Info.Height := WizardForm.ComponentsList.Height - ScaleY(18);  //Чем больше значение, тем ниже опускаеться полоска текста
  Info.Caption := ExpandConstant('{cm:ComponentsInfoPanel2}');
  Info.WordWrap := true;

  AddDescription(1, 'текст1.');
  AddDescription(2, 'текст2.');
  AddDescription(3, 'текст3.');


Johny777 04-04-2012 13:21 1893249

wertulll,
так сойдёт?
http://rghost.ru/private/37400744/c2...fcdec6682fe96a
*(за скрипт который я добавил спасибо Serega скажи)
_______________________
блин
как вы вкладываете файл в сообщение?
"вложения"
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

Raf-9600,
ты в курсе?
есть всплывающие подсказки в расширенной версии.
Наводишь на элемент и появляется подсказка
вот сделал
если описание большое, то появляется скроллбар (здесь вертикальный)
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
ComponentsListTVStyle=true

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

[CustomMessages]
russian.ComponentsName1=Моя программа™
russian.ComponentsName2=Помощь
russian.ComponentsName2_1=Документация
russian.ComponentsName2_2=Руководство пользователя
russian.ComponentsInfoPanel1=Описание
russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=Устанавливается обязательно
russian.ComponentsDescription2=Помощь
russian.ComponentsDescription3=Прочитать документацию
russian.ComponentsDescription4=Прочитать руководство пользователя

[Components]
Name: readme; Description: Справка; Types: full custom;
Name: readme\en; Description: "Английская "; Types: full custom; Flags: fixed
Name: readme\ru; Description: Русская; Types: full

;*************************************************************************
Name: plugs; Description: Плагины; Types: full ; Flags: collapsed
Name: plugs\wlx; Description: Внутреннего просмотра; Types: full
Name: plugs\wcx; Description: Архиваторные; Types: full
Name: plugs\wfx; Description: Системные; Types: full
Name: plugs\wfx\CanonCam; Description: CanonCam; Types: full
Name: plugs\wfx\PluginManager; Description: PluginManager; Types: full
Name: plugs\wfx\Registry; Description: Registry; Types: full
Name: plugs\wfx\Services; Description: Services; Types: full
Name: plugs\wfx\StartupGuard; Description: StartupGuard; Types: full
Name: plugs\wdx; Description: Другие; Types: full

[  Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  DRTF: TRichEditViewer;

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Width := ScaleX(201);
  end;

  { DRTF }
  DRTF := TRichEditViewer.Create(WizardForm);
  with DRTF do
  begin
    Name := 'DRTF';
    Parent := WizardForm.SelectComponentsPage;
    Left := ScaleX(208);
    Top := ScaleY(74);
    Width := ScaleX(209);
    Height := ScaleY(131);
    ScrollBars := ssVertical;
    Text := '';
  end;

  DRTF.TabOrder := 4;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

type
  TComponentDesc = record Description: String; Index: Integer; end;
 
var
  Descs: array of TComponentDesc;
  Indx: Integer;
 
procedure ShowDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var i: Integer;
begin
  Indx:=-1;
  for i:= 0 to GetArrayLength(Descs)-1 do begin
  if (Descs[i].Index=Index) then begin Indx:=i; Break end; end;
  if (Indx >=0)and(Area=iaItem) then DRTF.Text:= Descs[Indx].Description else DRTF.Text:= ExpandConstant('{cm:ComponentsInfoPanel2}');
end;

procedure AddDescription(AIndex: Integer; ADescription: String);
var i, k: Integer;
begin
i:= GetArrayLength(Descs); SetArrayLength(Descs, i+1);
Descs[i].Description:= ADescription; Descs[i].Index:= AIndex-1
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
  WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription


  AddDescription(1, 'Справка'); //первый параметр - это номер компонента, идет последовательно от начала записи компонентов
  AddDescription(2, 'Эта сказка возникла в устных рассказах, пока не стала историей Великой Войны Кольца, включая множество эскурсов в более древние времена. Она начала создаваться после того, как был написан "Хоббит", и по его первой публикации в 1937 году: но я не торопился с продолжением, потому что хотел прежде собрать и привести в порядок мифологию и легенды древних дней, а для этого потребовалось несколько лет. Я делал это для собственного удовольствия и мало надеялся, что другие люди заинтересуются моей работой, особенно потому что она была преимущественно лингвистической по побуждениям и возникла из необходимости привести в порядок мои отрывочные сведения о языках эльфов.'); //Второй параметр - это собственно описание компонента
  AddDescription(3, 'Русская справка');
  AddDescription(4, 'Плагины');
  AddDescription(5, 'Внутреннего просмотра');
  AddDescription(6, 'Архиваторные');
  AddDescription(7, 'Системные');
  AddDescription(8, 'CanonCam');
  AddDescription(9, 'PluginManager');
  AddDescription(10, 'Registry');
  AddDescription(11, 'Services');
  AddDescription(12, 'StartupGuard');
  AddDescription(13, 'Другие');

end;

[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D003010A802000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167651453656C656374436F6D706F6E656E7473506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED0000F110544E6577436865636B4C697374426F780E436F6D706F6E656E74734C69737405576964746803C9000D4578706C69636974576964746803C9000000F10C544E6577436F6D626F426F780A5479706573436F6D626F0A4974656D486569676874020D00000F5452696368456469745669657765720444525446044C65667403D00003546F70024A05576964746803D100064865696768740383000A5363726F6C6C42617273070A7373566572746963616C085461624F72646572020400000000000000


под расширенную версию
без использования библиотеки

wertulll 04-04-2012 13:54 1893271

Johny777, не работает не отображается ни проценты не время

nik1967 04-04-2012 13:57 1893274

Вложений: 1
Цитата:

Цитата Johny777
блин
как вы вкладываете файл в сообщение?
"вложения" »


Johny777 04-04-2012 14:13 1893295

wertulll,
я проверил перед тем как выложить
к тому же везде где куски скрипта вставил приписал, что они вставлены
ты можешь легко всё убрать
Цитата:

Цитата wertulll
не отображается ни проценты не время »

100% ты не сделал как написано в коментарии
/// к каждой строке фалов, относящейся к отображению процентов и размера нужно приписать ;AfterInstall: Progress;
/// Пример Source: Files\screenshots\*;DestDir: {app};AfterInstall: Progress;

Raf-9600 04-04-2012 14:51 1893324

Цитата:

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

Я знаю про такую фишку, и использовал её реализацию от Shegorat http://forum.oszone.net/post-1769157.html#post1769157

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

wertulll 04-04-2012 14:58 1893332

Johny777, блин точно пропустил :) Спасиб большой всё работает :up

Johny777 04-04-2012 15:20 1893345

Цитата:

Цитата Raf-9600
, и использовал её реализацию от Shegorat »

не
не то
вот к каждому элементу приписываешь
Код:

    Hint := 'я всплывающая подсказка';
    ParentShowHint := False;
    ShowHint := True;

Цитата:

Цитата Raf-9600
Это можно как-то изменить? »

так поставь
http://forum.oszone.net/attachment.p...1&d=1333538391

Raf-9600 04-04-2012 15:26 1893349

Цитата:

Цитата Johny777
Hint := 'я всплывающая подсказка'; »

Полноценного описания компонентов это конечно не заменит, но все же любопытно... Можешь показать реализацию? А то я слегка нюб :)

Цитата:

Цитата Johny777
так поставь »

Пробовал. Но тогда текст становиться менее темным и скроллбар блокируется =(

Johny777 04-04-2012 15:51 1893360

Цитата:

Цитата Raf-9600
о тогда текст становиться менее темным и скроллбар блокируется =( »

тогда хз
да и какая разница. Пусть выделяется!
Цитата:

Цитата Raf-9600
Можешь показать реализацию? А то я слегка нюб »

вот готовый пример
скомпилируй и наведи курсор на чекбокс
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
PrivilegesRequired=none
OutputDir=.

[  Code]
var
  Demo_CheckBox: TCheckBox;

procedure InitializeWizard();
begin
Demo_CheckBox := TCheckBox.Create(WizardForm);
 with Demo_CheckBox do
  begin
    Parent := WizardForm;
    Caption := 'Я чекбокс';
    Left := ScaleX(20);
    Top :=  ScaleY(327);
    Width := ScaleX(100);
    Height := ScaleY(15);
    Checked := False;
    /// всплывающая подсказака /// начало
    Hint := 'а я всплывающая подсказка';
    ParentShowHint := False;
    ShowHint := True;
    /// конец
  end;
end;


а делается легко
http://forum.oszone.net/attachment.p...1&d=1333540276
раньше тоже как ты скрипт использовал для описания в отдельном окошке, но потом отказался от ComponentList-a, тк криво отрисовываются чекбоксы (заместо тех, что в скине виндовсовские). Двигать их нельзя и прочее
в месте с компонентами улетело и описание, тк ему на смену пришли всплывающие подсказки

Raf-9600 04-04-2012 16:12 1893375

Цитата:

Цитата Johny777
да и какая разница. Пусть выделяется! »

Ну да, хоть и менее солидно, но не критично. Возможно на ру-боарде ещё уточню, на всякий случай.

Цитата:

Цитата Johny777
а делается легко »

Благодарю, весьма полезная штукенция.

Тогда у меня возникает вопрос:
У меня есть некоторые правила для автоматического выбора компонентов и блокировки их, а можно ли сделать так, чтобы когда одно из таких правил срабатывало, и пользователь наводил курсор на заблокированный компонент, то высвечивалась бы всплывашка, объясняющая, почему компонент заблокирован?

Интуиция подсказывает мне что это фантастика... Но вдруг я ошибаюсь? :)

Собсно сами правила блокировки:
читать дальше »
Код:

var
OldEvent_ComponentsListClickCheck: TNotifyEvent;

procedure ComponentsListClickCheck(Sender: TObject);

begin
If IsComponentSelected('PlugY') or IsComponentSelected('GameLoD') then begin
WizardForm.ComponentsList.ItemEnabled[84]:=False  //Version\104c
WizardForm.ComponentsList.ItemEnabled[85]:=False  //Version\105b
end else begin
WizardForm.ComponentsList.ItemEnabled[84]:=True
WizardForm.ComponentsList.ItemEnabled[85]:=True
OldEvent_ComponentsListClickCheck(Sender);
end;

begin
If IsComponentSelected('GameLoD') and not IsComponentSelected('PlugY') then begin
WizardForm.ComponentsList.ItemEnabled[86]:=True; //Version\107
WizardForm.ComponentsList.ItemEnabled[87]:=True; //Version\108
end else begin
WizardForm.ComponentsList.ItemEnabled[86]:=False;
WizardForm.ComponentsList.ItemEnabled[87]:=False;
OldEvent_ComponentsListClickCheck(Sender);
end;
end;

begin
If IsComponentSelected('GameLoD') and (IsComponentSelected('Version\109') or IsComponentSelected('Version\109b') or IsComponentSelected('Version\109d') or IsComponentSelected('Version\110') or IsComponentSelected('Version\111') or IsComponentSelected('Version\111b') or IsComponentSelected('Version\112a') or IsComponentSelected('Version\113c')) then
WizardForm.ComponentsList.ItemEnabled[104]:=True  //PlugY
else
WizardForm.ComponentsList.ItemEnabled[104]:=False;
OldEvent_ComponentsListClickCheck(Sender);
end;


begin
If IsComponentSelected('PlugY') then
WizardForm.ComponentsList.ItemEnabled[96]:=False  //Version\113d
else
WizardForm.ComponentsList.ItemEnabled[96]:=True;
OldEvent_ComponentsListClickCheck(Sender);
end;


end;



procedure InitializeWizard();
begin
with WizardForm.ComponentsList do
begin
OldEvent_ComponentsListClickCheck := OnClickCheck;
OnClickCheck := @ComponentsListClickCheck;
ItemEnabled[84]:=False;  //Version\104c
ItemEnabled[85]:=False;  //Version\105b
ItemEnabled[104]:=False;  //PlugY
end;
end;
//---


//Автоматический выбр компонентов
procedure ComponentsListOnClickCheck(Sender: TObject);
begin
  if wizardform.ComponentsList.Checked[1] then
    wizardform.ComponentsList.Checked[5]:=true; //GameDiablo2\Text

begin
  if wizardform.ComponentsList.Checked[50] then  //GameLoD
    wizardform.ComponentsList.Checked[51]:=true; //GameLoD\VoiceLoD

begin
  if wizardform.ComponentsList.Checked[1] then
    wizardform.ComponentsList.Checked[83]:=true; //Version

begin
  if wizardform.ComponentsList.Checked[1] then
  wizardform.ComponentsList.Checked[17]:=true; //GameDiablo2\VoiceD2
end;
end;
end;
end;

procedure InitializeWizard6();
begin
  wizardform.ComponentsList.OnClickCheck:=@ComponentsListOnClickCheck
end;
//---


sergey3695 04-04-2012 16:22 1893381

Цитата:

Цитата Johny777
вот например El Sanchez выкладывал много страниц назад
не даёт пользователю запустить тот же инсталл несколько раз пока он работает
очень полезная штука! »

Так та оно прикольно, но ведь эта же штука не даст сделать откат установки исдона (или ISExec и т.п.). Т.к. при откате запускается деинсталлятор, а он тоже будет проверять наличие запущенного приложения. А оно будет запущено, следовательно выдаст уведовмление и деинсталляция не произведется.

Johny777 04-04-2012 16:35 1893396

Raf-9600,
сложно для меня
не знаю как добавить подсказку, если компонент "выключен" (ItemEnabled[86]:=False)
и попробовав скажу, что для заблокированного элемента подсказка не всплывает
вот так могу сделать (других идей нет)
скомпилируй
посмотри
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
PrivilegesRequired=none
OutputDir=.




[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D0030107D01000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F101134F6E436F6E73747261696E6564526573697A6507036F66660C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000000C544E6577436865636B426F780C6F66665F636865636B626F78044C65667403980003546F7003480105576964746802610648656967687402110743617074696F6E120400000032044B043A043B04085461624F726465720205074F6E436C69636B07036F6666000000

[  Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  off_checkbox: TNewCheckBox;

procedure off(Sender: TObject); forward;

procedure RedesignWizardForm;
begin
  { off_checkbox }
  off_checkbox := TNewCheckBox.Create(WizardForm);
  with off_checkbox do
  begin
    Name := 'off_checkbox';
    Parent := WizardForm;
    Left := ScaleX(152);
    Top := ScaleY(328);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'выкл';
    OnClick := @off;
  end;

  off_checkbox.TabOrder := 5;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!
  var
  Demo_CheckBox: TCheckBox;

procedure InitializeWizard();
begin
  RedesignWizardForm;

Demo_CheckBox := TCheckBox.Create(WizardForm);
 with Demo_CheckBox do
  begin
    Parent := WizardForm;
    Caption := 'Я чекбокс';
    Left := ScaleX(20);
    Top :=  ScaleY(327);
    Width := ScaleX(120);
    Height := ScaleY(15);
    Checked := False;
    /// всплывающая подсказака /// начало
    Hint := 'а я всплывающая подсказка';
    ParentShowHint := False;
    ShowHint := True;
    /// конец
  end;
end;


function make: Boolean;
begin
  Result:=off_checkbox.Checked;
end;

procedure off(Sender: TObject);
begin
  If off_checkbox.Checked = false
  then
    begin
      Demo_CheckBox.Enabled:= true;
      Demo_CheckBox.Caption := 'Я чекбокс';
    end
  else
    begin
      Demo_CheckBox.Enabled:= false;
      Demo_CheckBox.Caption := 'меня заблокировали';
    end;
end;



Цитата:

Цитата sergey3695
запускается деинсталлятор »

какой?
можно пример?

Raf-9600 04-04-2012 16:43 1893404

Johny777, Это не подойдет. Но все равно спасибо за помощь :)

El Sanchez 04-04-2012 20:50 1893575

Цитата:

Цитата Johny777
вроде полностью будет так:
читать дальше »
а чему равны?
GWL_EXSTYLE = ?;
WS_EX_COMPOSITED = ?; »

Johny777, ну, почти угадал.
Код:

const
  GWL_EXSTYLE = (-20)
  WS_EX_COMPOSITED = $2000000


Devils Night 04-04-2012 23:09 1893655

Как добавить ключ реестра?
Не каким образом не добавляет, по разному пробовал:
читать дальше »
Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{D1514D66-7796-4DAB-BF64-9B54924EA9F7}_is1; ValueType: dword; ValueName: IsAppInstalled; ValueData: $00000001

Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{#AppID}_is1; ValueType: dword; ValueName: IsAppInstalled; ValueData: $00000001

Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{#AppID}; ValueType: dword; ValueName: IsAppInstalled; ValueData: $00000001



.

R.i.m.s.k.y. 04-04-2012 23:53 1893674

Devils Night, в секцию Uninstall реестра во время установки доступа нет, туда можно сунуться во время InitializeSetup или после [Run]

Devils Night 05-04-2012 15:57 1894036

Цитата:

Цитата R.i.m.s.k.y.
в секцию Uninstall реестра во время установки доступа нет, туда можно сунуться во время InitializeSetup или после [Run] »

Понял, значит придётся использовать секцию RUN.

Ребят, подскажите такую вещь, как по средствам INNO По VID & PID сделать так чтобы определялось устройство и высвечивалось в инсталяторе?

Ivan_009 05-04-2012 16:04 1894050

Как у новой bass.dll v2.4.8 создать кнопку вкл выкл музыки... :help:

R.i.m.s.k.y. 05-04-2012 16:06 1894052

Devils Night, если мне нужны названия и пиды/виды - я из реестра дергаю, в шапке есть ultimate Black Skin, он выдергивает названия, ис тех же ключей реестра можно дернуть и пиды

в общем за основу возьми из шапки скрипт "проверку системных требований"
вот так я дергаю для видюшки пид/вид, на выходе список видюшек с пидами/видами, каждая видюшка на новой строчке
Код:

function GetAllVideoCard():String; // HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}
var
  Keys : TArrayOfString;
  key, DriverDesc, MatchingDeviceId : string;
  i : integer;
begin
  Result := '';
  key := 'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}'; RegGetSubkeyNames(HKLM, key, Keys)
  for i := 0 to GetArrayLength(Keys)-1 do begin
    RegQueryStringValue(HKLM, key + '\' + Keys[i], 'DriverDesc', DriverDesc);
    RegQueryStringValue(HKLM, key + '\' + Keys[i], 'MatchingDeviceId', MatchingDeviceId); StringChangeEx(MatchingDeviceId, 'pci\', '', True);
    if (Pos(LowerCase(DriverDesc), LowerCase(Result)) = 0) then Result := Result + #13#10 + DriverDesc + ' (' + MatchingDeviceId + ')';
  end;
end;

заодно GUID устройств http://msdn.microsoft.com/en-us/libr...(v=vs.85).aspx

Johny777 05-04-2012 16:28 1894066

подскажите пожалуйста
как убрать кнопку системного меню в середине?

(правый фрвгмент скрина из готового инсталла на основе Inno, а не фотошоп)
за эти кнопки отвечает
WizardForm.BorderIcons := [biSystemMenu];
вот так не убирается
Procedure InitializeWizard();
begin
WizardForm.BorderIcons :=WizardForm.BorderIcons - [biMaximize];
end;
:(

Devils Night 05-04-2012 16:58 1894083

Цитата:

Цитата R.i.m.s.k.y.
если мне нужны названия и пиды/виды - я из реестра дергаю »

Да вот рыскаю реестр, ищу.

Цитата:

Цитата R.i.m.s.k.y.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX} »

Ага, спасибо большое.
А вот когда устройство есть но не установлены драйвера, оно определяется в Class\{4D36E968-E325-11CE-BFC1-08002BE10318} или HARDWARE?

Цитата:

Цитата R.i.m.s.k.y.
в шапке есть ultimate Black Skin »

читать дальше »
Я можно сказать весь этот код закоментировал, и в итоге он вообще перестал работать, хотел чтоб осталось одно устройство, например:
Код:

Видеоадаптер:  NVIDIA GeForce 8600
, но без оформления рамками, в общем не получается. Если можно кодик одного устройства (без всяких там виндовсов, файлов подкачек), пожалуста?!


читать дальше »
Цитата:

Цитата R.i.m.s.k.y.
Код:

function GetAllVideoCard():String; // HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}
var
  Keys : TArrayOfString;
  key, DriverDesc, MatchingDeviceId : string;
  i : integer;
begin
  Result := '';
  key := 'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}'; RegGetSubkeyNames(HKLM, key, Keys)
  for i := 0 to GetArrayLength(Keys)-1 do begin
    RegQueryStringValue(HKLM, key + '\' + Keys[i], 'DriverDesc', DriverDesc);
    RegQueryStringValue(HKLM, key + '\' + Keys[i], 'MatchingDeviceId', MatchingDeviceId); StringChangeEx(MatchingDeviceId, 'pci\', '', True);
    if (Pos(LowerCase(DriverDesc), LowerCase(Result)) = 0) then Result := Result + #13#10 + DriverDesc + ' (' + MatchingDeviceId + ')';
  end;
end;

»

Ну вот вставил:
Код:

[Code ]
function GetAllVideoCard():String; // HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}
var
  Keys : TArrayOfString;
  key, DriverDesc, MatchingDeviceId : string;
  i : integer;
begin
  Result := '';
  key := 'SYSTEM\CurrentControlSet\Control\Class\{4D36E968-E325-11CE-BFC1-08002BE10318}'; RegGetSubkeyNames(HKLM, key, Keys)
  for i := 0 to GetArrayLength(Keys)-1 do begin
    RegQueryStringValue(HKLM, key + '\' + Keys[i], 'DriverDesc', DriverDesc);
    RegQueryStringValue(HKLM, key + '\' + Keys[i], 'MatchingDeviceId', MatchingDeviceId); StringChangeEx(MatchingDeviceId, 'pci\', '', True);
    if (Pos(LowerCase(DriverDesc), LowerCase(Result)) = 0) then Result := Result + #13#10 + DriverDesc + ' (' + MatchingDeviceId + ')';
  end;
end;


А как сделать чтоб оно в инсаляторе где нибудь внизу выдало например Видеоадаптер: Такой то, такой то. Естественно без оформления и рамок.

Raf-9600 05-04-2012 17:57 1894142

В Inno Setup от Restools есть замечательная возможность сворачивать компоненты (ComponentsListTVStyle=true), а возможно ли сделать так, чтобы при выборе какого-то компонента, сворачивалась определённое древо компонентов?

Допустим у меня есть:
Код:

[Components]
Name: "Game1"; Description: Игра 1;
Name: "Game1\One"; Description: Пункт 1;
Name: "Game1\Two"; Description: Пункт 2;
Name: "Game2"; Description: Игра 2;
Name: "Game2\One"; Description: Пункт 1;
Name: "Game2\Two"; Description: Пункт 2;

Нужно чтобы при выборе Game2 сворачивалось древо компонентов Game1, и наоборот. Такое реально?

Devils Night 05-04-2012 18:19 1894153

Raf-9600, не оно ?

alert30 05-04-2012 18:36 1894161

Как сделать выборочный компонент, чтобы при галочке: после установки прописывался реестр (reg-файл), при не галочке: после установки не прописывался реестр (reg-файл)?

Raf-9600 05-04-2012 18:38 1894164

Цитата:

Цитата Devils Night
не оно ? »

Если не сложно, можете показать пример, в котором допустим выбрав компонент Game1, сворачивалось бы древо Game2? :pray:

Johny777 05-04-2012 18:43 1894166

Raf-9600,
нафига?
а если у него дочерние как у тебя в примере?
смотри
я выбираю основной - игру. И тут дерево дочерних сворачивается. Т.е. рабиокнопки с выбором озвучек, чекбоксы к ним ещё дочерние
Тебе разве такое нужно?

R.i.m.s.k.y. 05-04-2012 18:44 1894167

Цитата:

Цитата Devils Night
Да вот рыскаю реестр, ищу. »

я ж тебе гуиды девайсов выше показал, дергай гуиды и смотри в ключе HKLM\SYSTEM\CurrentControlSet\Control\Class\ГУИД

Цитата:

Цитата Devils Night
А как сделать чтоб оно в инсаляторе где нибудь внизу выдало например Видеоадаптер: Такой то, такой то. Естественно без оформления и рамок. »

в расширенной версии через редактор форм


alert30, вот ты сейчас одним предложением описал [Components] и как он работает, его и используй

Devils Night 05-04-2012 18:45 1894169

Цитата:

Цитата Raf-9600
Если не сложно, можете показать пример, »

Ну наверно так:
читать дальше »
Код:

[Setup]
AppName=1
AppVersion=1
AppVerName=1
DefaultDirName={pf}\1
DefaultGroupName=1
AllowNoIcons=yes
OutputDir=.
OutputBaseFilename=setup
SolidCompression=true
Compression=lzma/ultra64
InternalCompressLevel=ultra64

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

[Components]
Name: Fav; Description: 1; Types: full; Flags: collapsed
Name: Fav\1; Description: 1; Types: custom; Flags: exclusive
Name: Fav\2; Description: 2; Types: custom; Flags: exclusive

Name: Fav\3; Description: 2; Types: custom; Flags: exclusive collapsed
Name: Fav\3\1; Description: 1; Types: custom
Name: Fav\3\2; Description: 2

[Code ]
 procedure InitializeWizard();
 begin
//-------------------- Скрыть компонент - Начало --------------------\\
  WizardForm.ComponentsList.TreeViewStyle := True;
//-------------------- Скрыть компонент - Конец --------------------\\
 end;


Johny777 05-04-2012 18:52 1894174

alert30,
как и со всем остальным

[Components]
Name: B; Description: описание к B;

[Registry]
Root: HKLM; Subkey: "SOFTWARE\Bethesda Softworks"; ValueType: String; Flags: uninsdeletevalue uninsdeletekeyifempty; Componets: B

alert30 05-04-2012 18:58 1894178

Johny777, это точно работает, просто я хочу, которую выше написал:
а) галочку поставишь в компоненте - установка + пропись реестр
б) не поставишь галочку в компоненте - установка
?

Извените, все заработало.

Johny777 05-04-2012 19:00 1894179

alert30,
файлы не помеченые компонентом ставятся всегда
а галка компонента пусть будет только для реестра (как у меня в примере)
Цитата:

Цитата alert30
Извените, все заработало. »

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

читать дальше »
Код:

procedure off(Sender: TObject);
begin
 /// если чекбокс не отмечен
  If off_checkbox.Checked = false
  then
    begin
    здесь вносим одну запись в реестр
    off_checkbox.Caption := 'Я не отмечен и занесу этот ключ в реестр';
    end
  else /// в противном случае (отмечен)
    begin
      вносим другую запись
      off_checkbox.Caption := 'Спасибо, что отметил. Теперь занесу другой';
    end;
end;


Raf-9600 05-04-2012 19:07 1894191

Цитата:

Цитата Johny777
нафига?
а если у него дочерние как у тебя в примере?
смотри
я выбираю основной - игру. И тут дерево дочерних сворачивается. Т.е. рабиокнопки с выбором озвучек, чекбоксы к ним ещё дочерние »

Дочерние я таким образом скрывать не планирую. У меня инсталлятор на две игры, при том выбрать сразу обе невозможно, и мне кажется, что было бы удобно, чтобы, когда пользователь выбрал одну из игр, все древо компонентов относящихся к другой, сворачивалось.

Цитата:

Цитата Devils Night
Ну наверно так: »

Мне бы с зависимостью от конкретного компонента... И чтобы сворачивалось не все, а только одно, определённое древо.

Devils Night 05-04-2012 19:18 1894195

Raf-9600, К дереву компонентов которое хочешь скрыть добавляешь ; Flags: collapsed.

Код:

[Components]
Name: a; Description: Дерево; Types: full; Flags: collapsed
Name: a\1; Description: Компонент 1
Name: a\2; Description: Компонент 2
Name: a\2; Description: Компонент 3
Name: a\2; Description: Компонент 4


Johny777 05-04-2012 19:26 1894200

Raf-9600, Devils Night,
вот из примера
Example_NewCheckListBox.iss

1: CheckListBox.TreeViewStyle := CheckListBox2.Checked[1];
это демо
те при нажатии на чекбокс появится возможность складывать дерево в купе с флагом collapsed
(кажется...)

Raf-9600 05-04-2012 19:38 1894212

Цитата:

Цитата Devils Night
К дереву компонентов которое хочешь скрыть добавляешь ; Flags: collapsed. »

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

Допустим чтобы древо относящееся к Game1 автоматически сворачивалось только если выбран Game2. А Game2 автоматически сворачивался только если выбран Game1.
Код:

[Components]
Name: "Game1"; Description: Игра 1; Flags: exclusive
Name: "Game1\One"; Description: Пункт 1;
Name: "Game1\Two"; Description: Пункт 2;
Name: "Game2"; Description: Игра 2; Flags: exclusive
Name: "Game2\One"; Description: Пункт 1;
Name: "Game2\Two"; Description: Пункт 2;

Цитата:

Цитата Johny777
те при нажатии на чекбокс появится возможность складывать дерево в купе с флагом collapsed
(кажется...) »

А можно чтобы зависимость была не от чекбокса, а от определённого компонента? И чтобы не просто появлялась возможность свернуть, а чтобы автоматически сворачивалось (только)одно древо компонентов?

Johny777 05-04-2012 20:08 1894234

Raf-9600,
ты знаешь
кажется настройка "TreeView" относится ко всему ListBox-у со всеми вытекающими последствиями
поэтому одна из 2-х игр будет только на одном листбоксе, созданном в коде.
От стандартного выбора типа установки придётся отказаться. Да думается мне и не нужен он для двух игр,
из которых за раз установить можно только одну!
потом попробую что-то придумать ), но совсем не уверен, что в итоге получится то, что нужно

Raf-9600 05-04-2012 20:30 1894254

Johny777, благодарю за желание помочь мне, но если это сложно, то я бы не хотел никого напрягать своей просьбой.

Johny777 06-04-2012 03:55 1894435

Цитата:

Цитата Raf-9600
я бы не хотел никого напрягать своей просьбой. »

всё нормально! Появляется повод что-то сделать и при этом знания капают :)
по твоему вопросу ерунда получилась т.к. не знаю как сворачивать дерево
может кто другой додумает
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DirExistsWarning=no
DisableProgramGroupPage=yes
DisableWelcomePage=yes
DisableDirPage=yes
DisableReadyPage=yes


[  Code]
var
  ISCustomPage1: TWizardPage;
  CheckListBox2: TNewCheckListBox;
  CheckListBox1: TNewCheckListBox;

procedure make1(Sender: TObject);
begin
  if CheckListBox1.Checked[0] = true then
    begin
      CheckListBox2.TreeViewStyle := true;
      CheckListBox2.Checked[0] := false;
    end
  else
    begin
      CheckListBox2.TreeViewStyle := false;
      CheckListBox2.Checked[0] := true;
    end;
end;


procedure plus1(Sender: TObject);
begin
  if CheckListBox2.Checked[0] = true then
    begin
      CheckListBox1.TreeViewStyle := true;
      CheckListBox1.Checked[0] := false;
    end
  else
    begin
      CheckListBox1.TreeViewStyle := false;
      CheckListBox1.Checked[0] := true;
    end;
end;

procedure InitializeWizard();
begin
  ISCustomPage1 := CreateCustomPage(wpWelcome, 'Test', 'Description');
  WizardForm.Color := clWhite;
  WizardForm.InnerPage.Color := clWhite;
  ISCustomPage1.Surface.Color := clWhite;
  WizardForm.NextButton.Hide;

  CheckListBox2 := TNewCheckListBox.Create(WizardForm);
  with CheckListBox2 do
  begin
    Name := 'CheckListBox2';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(0);
    Top := ScaleY(100);
    Width := ScaleX(417);
    Height := ScaleY(100);
    DragMode := dmAutomatic;
    OnClickCheck := @plus1;
    TreeViewStyle := True;
    BorderStyle := bsNone;
   
    AddCheckBoxEx('CheckBox_0', 'c01 00', 0, True, True, True, True, nil, True);
    AddRadioButtonEx('RadioButton_1', 'r21 02', 1, True, True, nil, True);
    AddRadioButtonEx('RadioButton_2', 'r22 03', 1, True, True, nil, True);
    AddRadioButtonEx('RadioButton_3', 'r31 04', 1, True, True, nil, True);
    AddRadioButtonEx('RadioButton_4', 'r32 05', 1, True, True, nil, True);
    AddCheckBoxEx('CheckBox_4.1', 'c17 18', 2, True, True, False, True, nil, True);
  end;


  CheckListBox1 := TNewCheckListBox.Create(WizardForm);
  with CheckListBox1 do
  begin
    Name := 'CheckListBox1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(417);
    Height := ScaleY(100);
    OnClickCheck := @make1;
    BorderStyle := bsNone;
   
    AddCheckBoxEx('CheckBox_0', 'c01 00', 0, True, True, True, True, nil, True);
    AddCheckBoxEx('CheckBox_0', 'c01 00', 1, True, True, True, True, nil, True);
    AddCheckBoxEx('CheckBox_0', 'c01 00', 2, True, True, True, True, nil, True);
    AddCheckBoxEx('CheckBox_0', 'c01 00', 2, True, True, True, True, nil, True);
    AddCheckBoxEx('CheckBox_0', 'c01 00', 2, True, True, True, True, nil, True);
    AddCheckBoxEx('CheckBox_4.1', 'c17 18', 2, True, True, False, True, nil, True);
  end;
end;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;


Raf-9600 06-04-2012 09:06 1894488

Цитата:

Цитата Johny777
по твоему вопросу ерунда получилась т.к. не знаю как сворачивать дерево »

Если честно, то я и предполагал что единственная возможная реализация будет такой, ибо вряд ли разрзрабы ResTools заморачивались относительно автоматического сворачивания компонентов :)

Ну да ладно, у меня другой вопрос: возможно ли менять описание компонентов в зависимости от того, какие выбраны?
Код на описание компонентов использую этот http://forum.oszone.net/post-1893249-1390.html

Пробовал писать примерно так:
Код:

if IsComponentSelected('Game1') = True then
  AddDescription(1, 'Вариант 1');

if IsComponentSelected('Game2') = True then
  AddDescription(1, 'Вариант 2');

Но все бестолку =(

Johny777 06-04-2012 13:16 1894620

Raf-9600,
не совсем понимаю
в примере идёт описание сверху вниз в соответствии с элементами окошка компонентов (они тоже сверху вниз добавляются как в секции записано).

Raf-9600 06-04-2012 13:23 1894622

Johny777, допустим есть такие компоненты:

Код:

[Components]
Name: "Game1"; Description: Игра 1; Flags: exclusive
Name: "Game2"; Description: Игра 2; Flags: exclusive
Name: "Item"; Description: Пункт;

Если выбрать Game1, то комментарий к Item должно быть одним, а если выбрать Game2 то комментарий к Item должен быть другим.

R.i.m.s.k.y. 06-04-2012 13:25 1894624

Raf-9600, ща за 15-20 минут накидаю примерчик
Код:

[Components]
Name: "Game1"; Description: Игра 1; Flags: exclusive
Name: "Game2"; Description: Игра 2; Flags: exclusive
Name: "Item"; Description: Пункт;

[*Code]
var
game1, game2, Item : integer;
game1s, game2s, Items : string;

procedure CheckComponents;
begin
if IsComponentSelected('Game1') then begin
  with WizardForm.ComponentsList do begin
    ItemCaption[item] := items + 'Game1s';
  end; end;//with WizardForm.ComponentsList do begin
if IsComponentSelected('Game2') then begin
  with WizardForm.ComponentsList do begin
    ItemCaption[item] := items + 'Game2s';
  end; end;//with WizardForm.ComponentsList do begin
WizardForm.ComponentsList.Repaint;
end;

procedure ComponentOnClick(Sender: TObject);
begin
CheckComponents;
end;

procedure InitializeWizard()
begin
...
  game1:= WizardForm.ComponentsList.Items.IndexOf('Игра 1');  game1s:= WizardForm.ComponentsList.ItemCaption[game1];
  game2:= WizardForm.ComponentsList.Items.IndexOf('Игра 2');  game1s:= WizardForm.ComponentsList.ItemCaption[game2];
  item:= WizardForm.ComponentsList.Items.IndexOf('Пункт');  items:= WizardForm.ComponentsList.ItemCaption[item];

  WizardForm.ComponentsList.OnClick := @ComponentOnClick; CheckComponents;
...
end;

идеологически верно но могут быть пропущенные end'ы, кавыки, сам расставишь

щаз еще Лександр скажет "надо использовать case"
Да, н-н-надо, но я не знаю как перехватить номер нажатого компонента

Johny777 06-04-2012 13:34 1894628

R.i.m.s.k.y.,
как привязать к элементу CheckListBox-а распаковку того или иного файла из секции Files?
можно пример?
CheckListBoх это тот же ComponentsList и TasksList,

R.i.m.s.k.y. 06-04-2012 13:37 1894631

Johny777, а что такое CheckListBoх? с формами я никак
я серъезно не знаю

Johny777 06-04-2012 13:47 1894635

R.i.m.s.k.y.,
в моём предыдущем сообщении (на предыдущей странице) 2 таких

Raf-9600 06-04-2012 13:48 1894636

Инсталлятор выделяет эту строчку и говорит "Type mismatch"
Код:

ItemCaption[item] := items + 'Game1';
P.S.
На всякий случай уточняю: я имел ввиду не чтобы Description менялось, а чтобы комментарий к компоненту менялся. Ну, такой комментарий, который создаётся этим кодом http://forum.oszone.net/post-1893249-1390.html

R.i.m.s.k.y. 06-04-2012 13:56 1894639

Johny777, не такое не знаю
Raf-9600, поправил выше сообщение, с комментариями тоже ыкстры

Raf-9600 06-04-2012 14:27 1894649

Цитата:

Цитата R.i.m.s.k.y.
поправил выше сообщение »

Не компилируется, продолжает жаловаться на ту же строчку =(

Johny777 06-04-2012 14:42 1894656

Может пожалуйста кто-нибудь добавить сюда
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DirExistsWarning=no
DisableProgramGroupPage=yes
DisableWelcomePage=yes
DisableDirPage=yes
DisableReadyPage=yes

[  Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  ISCustomPage1: TWizardPage;
  ScrollBox1: TScrollBox;
  BitmapImage1: TBitmapImage;

procedure RedesignWizardForm;
begin
  { Creates custom wizard page }
  ISCustomPage1 := CreateCustomPage(wpWelcome, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');

  { ISCustomPage1 }
  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

  { ScrollBox1 }
  ScrollBox1 := TScrollBox.Create(WizardForm);
  with ScrollBox1 do
  begin
    Name := 'ScrollBox1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(0);
    Top := ScaleY(0);
    Width := ScaleX(417);
    Height := ScaleY(233);
  end;

  { BitmapImage1 }
  BitmapImage1 := TBitmapImage.Create(WizardForm);
  with BitmapImage1 do
  begin
    Name := 'BitmapImage1';
    Parent := ScrollBox1;
    Left := ScaleX(6);
    Top := ScaleY(6);
    Width := ScaleX(345);
    Height := ScaleY(9000);
  end;

  ScrollBox1.TabOrder := 0;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;




//прокручиваем вниз

procedure MouseWheelDown(Sender: TObject; Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
Scrollbox1.VertScrollBar.Position:= Scrollbox1.VertScrollBar.Position+4;
end;

//прокручиваем вверх

procedure MouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
Scrollbox1.VertScrollBar.Position:= Scrollbox1.VertScrollBar.Position-4;
end;



[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D003010E702000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D6550616765084E65787450616765070D4953437573746F6D50616765310D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650C50726576696F757350616765070D4953437573746F6D50616765310D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED00000010544E65774E6F7465626F6F6B506167650D4953437573746F6D50616765310743617074696F6E06154953437573746F6D50616765315F43617074696F6E0B4465736372697074696F6E06194953437573746F6D50616765315F4465736372697074696F6E0C50726576696F757350616765070B57656C636F6D6550616765084E65787450616765070B4C6963656E736550616765000A545363726F6C6C426F780A5363726F6C6C426F7831044C656674020003546F70020005576964746803A1010648656967687403E900085461624F726465720200000C544269746D6170496D6167650C4269746D6170496D61676531044C656674020603546F700206055769647468035901064865696768740328230000000000000000


это
Код:

//прокручиваем вниз
procedure TMainForm.ScrollBox1MouseWheelDown(Sender: TObject;
Shift: TShiftState; MousePos: TPoint; var Handled: Boolean);
begin
Scrollbox1.VertScrollBar.Position:= Scrollbox1.VertScrollBar.Position+4;
end;

//прокручиваем вверх
procedure TMainForm.ScrollBox1MouseWheelUp(Sender: TObject; Shift: TShiftState;
MousePos: TPoint; var Handled: Boolean);
begin
Scrollbox1.VertScrollBar.Position:= Scrollbox1.VertScrollBar.Position-4;
end;

источник http://delphicode.org/system/mouse_wheel_scrollbox.htm
я не могу :(
но очень нужно потому что

sergey3695 06-04-2012 19:23 1894812

Цитата:

Цитата Johny777
запускается деинсталлятор »
какой?
можно пример? »


читать дальше »
Код:

#define NeedSize "5000000000"

#define NeedMem 512

#define SecondProgressBar

;#define Components

;#define records

;#define facompress

;#define PrecompInside
;#define SrepInside
;#define MSCInside
;#define precomp "0.42"
;#define unrar
;#define XDelta
;#define PackZIP

[Setup]
AppName=ISDone
AppMutex=MyProgramMutexUniqueName
AppVerName=ISDone
DefaultDirName={pf}\ISDone
DefaultGroupName=ISDone Example
OutputDir=.
OutputBaseFilename=Setup
VersionInfoCopyright=ProFrager
SolidCompression=yes
#ifdef NeedSize
ExtraDiskSpaceRequired={#NeedSize}
#endif

#ifdef Components
[Types]
Name: full; Description: Full installation; Flags: iscustom

[Components]
Name: text; Description: Язык субтитров; Types: full; Flags: fixed
Name: text\rus; Description: Русский; Flags: exclusive; ExtraDiskSpaceRequired: 100000000
Name: text\eng; Description: Английский; Flags: exclusive; ExtraDiskSpaceRequired: 200000000
Name: voice; Description: Язык озвучки; Types: full; Flags: fixed
Name: voice\rus; Description: Русский; Flags: exclusive; ExtraDiskSpaceRequired: 500000000
Name: voice\eng; Description: Английский; Flags: exclusive; ExtraDiskSpaceRequired: 600000000
#endif

[Registry]
Root: HKLM; Subkey: Software\ProFrager; ValueName: path; ValueType: String; ValueData: {app}; Flags: uninsdeletekey; Check: CheckError
Root: HKLM; Subkey: Software\ProFrager; ValueName: name; ValueType: String; ValueData: Data; Flags: uninsdeletekey; Check: CheckError

[Icons]
Name: {group}\Удалить пример ISDone; Filename: {app}\unins000.exe; WorkingDir: {app}; Check: CheckError
Name: {commondesktop}\Удалить пример ISDone; Filename: {app}\unins000.exe; WorkingDir: {app}; Check: CheckError

[Tasks]
Name: VCCheck; Description: Установить Microsoft Visual C++ 2005 Redist
Name: PhysXCheck; Description: Установить Nvidia PhysX

[Run]
Filename: {src}\Redist\vcredist_x86.exe; Parameters: /q; StatusMsg: Устанавливаем Microsoft Visual C++ 2005 Redist...; Flags: skipifdoesntexist; Tasks: VCCheck; Check: CheckError
Filename: {src}\Redist\PhysX.exe; Parameters: /qn; StatusMsg: Устанавливаем Nvidia PhysX...; Flags: skipifdoesntexist; Tasks: PhysXCheck; Check: CheckError

[Files]
Source: Include\English.ini; DestDir: {tmp}; Flags: dontcopy
Source: Include\unarc.dll; DestDir: {tmp}; Flags: dontcopy
Source: ISDone.dll; DestDir: {tmp}; Flags: dontcopy
#ifdef records
Source: records.inf; DestDir: {tmp}; Flags: dontcopy
#endif

#ifdef PrecompInside
Source: Include\CLS-precomp.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packjpg_dll.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packjpg_dll1.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\precomp.exe; DestDir: {tmp}; Flags: dontcopy
Source: Include\zlib1.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef SrepInside
Source: Include\CLS-srep.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef MSCInside
Source: Include\CLS-MSC.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef facompress
Source: Include\facompress.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef precomp
  #if precomp == "0.38"
  Source: Include\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
  #else
    #if precomp == "0.4"
    Source: Include\precomp040.exe; DestDir: {tmp}; Flags: dontcopy
    #else
      #if precomp == "0.41"
      Source: Include\precomp041.exe; DestDir: {tmp}; Flags: dontcopy
      #else
        #if precomp == "0.42"
        Source: Include\precomp042.exe; DestDir: {tmp}; Flags: dontcopy
        #else
        Source: Include\precomp038.exe; DestDir: {tmp}; Flags: dontcopy
        Source: Include\precomp040.exe; DestDir: {tmp}; Flags: dontcopy
        Source: Include\precomp041.exe; DestDir: {tmp}; Flags: dontcopy
        Source: Include\precomp042.exe; DestDir: {tmp}; Flags: dontcopy
        #endif
      #endif
    #endif
  #endif
#endif
#ifdef unrar
Source: Include\Unrar.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef XDelta
Source: Include\XDelta3.dll; DestDir: {tmp}; Flags: dontcopy
#endif
#ifdef PackZIP
Source: Include\7z.dll; DestDir: {tmp}; Flags: dontcopy
Source: Include\packZIP.exe; DestDir: {tmp}; Flags: dontcopy
#endif

[CustomMessages]
russian.ExtractedFile=Извлекается файл:
russian.Extracted=Распаковка архивов...
russian.CancelButton=Отменить распаковку
russian.Error=Ошибка распаковки!
russian.ElapsedTime=Прошло:
russian.RemainingTime=Осталось времени:
russian.EstimatedTime=Всего:
russian.AllElapsedTime=Время установки:

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

[UninstallDelete]
Type: filesandordirs; Name: {app}

[Code_]
const
  PCFonFLY=true;
  notPCFonFLY=false;
var
  LabelPct1,LabelCurrFileName,LabelTime1,LabelTime2,LabelTime3: TLabel;
  ISDoneProgressBar1: TNewProgressBar;
#ifdef SecondProgressBar
  LabelPct2: TLabel;
  ISDoneProgressBar2:TNewProgressBar;
#endif
  MyCancelButton: TButton;
  ISDoneCancel:integer;
  ISDoneError:boolean;
  PCFVer:double;

type
  TCallback = function (OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;

function WrapCallback(callback:TCallback; paramcount:integer):longword;external 'wrapcallback@files:ISDone.dll stdcall delayload';

function ISArcExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath, ExtractedPath: AnsiString; DeleteInFile:boolean; Password, CfgFile, WorkPath: AnsiString; ExtractPCF: boolean ):boolean; external 'ISArcExtract@files:ISDone.dll stdcall delayload';
function IS7ZipExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'IS7zipExtract@files:ISDone.dll stdcall delayload';
function ISRarExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutPath: AnsiString; DeleteInFile:boolean; Password: AnsiString):boolean; external 'ISRarExtract@files:ISDone.dll stdcall delayload';
function ISPrecompExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISPrecompExtract@files:ISDone.dll stdcall delayload';
function ISSRepExtract(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString; DeleteInFile:boolean):boolean; external 'ISSrepExtract@files:ISDone.dll stdcall delayload';
function ISxDeltaExtract(CurComponent:Cardinal; PctOfTotal:double; minRAM,maxRAM:integer; InName, DiffFile, OutFile: AnsiString; DeleteInFile, DeleteDiffFile:boolean):boolean; external 'ISxDeltaExtract@files:ISDone.dll stdcall delayload';
function ISPackZIP(CurComponent:Cardinal; PctOfTotal:double; InName, OutFile: AnsiString;ComprLvl:integer; DeleteInFile:boolean):boolean; external 'ISPackZIP@files:ISDone.dll stdcall delayload';
function ShowChangeDiskWindow(Text, DefaultPath, SearchFile:AnsiString):boolean; external 'ShowChangeDiskWindow@files:ISDone.dll stdcall delayload';

function Exec2 (FileName, Param: PAnsiChar;Show:boolean):boolean; external 'Exec2@files:ISDone.dll stdcall delayload';
function ISFindFiles(CurComponent:Cardinal; FileMask:AnsiString; var ColFiles:integer):integer; external 'ISFindFiles@files:ISDone.dll stdcall delayload';
function ISPickFilename(FindHandle:integer; OutPath:AnsiString; var CurIndex:integer; DeleteInFile:boolean):boolean; external 'ISPickFilename@files:ISDone.dll stdcall delayload';
function ISGetName(TypeStr:integer):PAnsichar; external 'ISGetName@files:ISDone.dll stdcall delayload';
function ISFindFree(FindHandle:integer):boolean; external 'ISFindFree@files:ISDone.dll stdcall delayload';
function ISExec(CurComponent:Cardinal; PctOfTotal,SpecifiedProcessTime:double; ExeName,Parameters,TargetDir,OutputStr:AnsiString;Show:boolean):boolean; external 'ISExec@files:ISDone.dll stdcall delayload';

function SrepInit(TmpPath:PAnsiChar;VirtMem,MaxSave:Cardinal):boolean; external 'SrepInit@files:ISDone.dll stdcall delayload';
function PrecompInit(TmpPath:PAnsiChar;VirtMem:cardinal;PrecompVers:single):boolean; external 'PrecompInit@files:ISDone.dll stdcall delayload';
function FileSearchInit(RecursiveSubDir:boolean):boolean; external 'FileSearchInit@files:ISDone.dll stdcall delayload';
function ISDoneInit(RecordFileName:AnsiString; TimeType,Comp1,Comp2,Comp3:Cardinal; WinHandle, NeededMem:longint; callback:TCallback):boolean; external 'ISDoneInit@files:ISDone.dll stdcall';
function ISDoneStop:boolean; external 'ISDoneStop@files:ISDone.dll stdcall';
function ChangeLanguage(Language:AnsiString):boolean; external 'ChangeLanguage@files:ISDone.dll stdcall delayload';
function SuspendProc:boolean; external 'SuspendProc@files:ISDone.dll stdcall';
function ResumeProc:boolean; external 'ResumeProc@files:ISDone.dll stdcall';

function ProgressCallback(OveralPct,CurrentPct: integer;CurrentFile,TimeStr1,TimeStr2,TimeStr3:PAnsiChar): longword;
begin
  if OveralPct<=1000 then ISDoneProgressBar1.Position := OveralPct;
  LabelPct1.Caption := IntToStr(OveralPct div 10)+'.'+chr(48 + OveralPct mod 10)+'%';
#ifdef SecondProgressBar
  if CurrentPct<=1000 then ISDoneProgressBar2.Position := CurrentPct;
  LabelPct2.Caption := IntToStr(CurrentPct div 10)+'.'+chr(48 + CurrentPct mod 10)+'%';
#endif
  LabelCurrFileName.Caption:=ExpandConstant('{cm:ExtractedFile} ')+MinimizePathName(CurrentFile, LabelCurrFileName.Font, LabelCurrFileName.Width-ScaleX(100));
  LabelTime1.Caption:=ExpandConstant('{cm:ElapsedTime} ')+TimeStr2;
  LabelTime2.Caption:=ExpandConstant('{cm:RemainingTime} ')+TimeStr1;
  LabelTime3.Caption:=ExpandConstant('{cm:AllElapsedTime}')+TimeStr3;
  Result := ISDoneCancel;
end;

procedure CancelButtonOnClick(Sender: TObject);
begin
  SuspendProc;
  if MsgBox(SetupMessage(msgExitSetupMessage), mbConfirmation, MB_YESNO) = IDYES then ISDoneCancel:=1;
  ResumeProc;
end;

procedure HideControls;
begin
  WizardForm.FileNamelabel.Hide;
  ISDoneProgressBar1.Hide;
  LabelPct1.Hide;
  LabelCurrFileName.Hide;
  LabelTime1.Hide;
  LabelTime2.Hide;
  MyCancelButton.Hide;
#ifdef SecondProgressBar
  ISDoneProgressBar2.Hide;
  LabelPct2.Hide;
#endif
end;

procedure CreateControls;
var PBTop:integer;
begin
  PBTop:=ScaleY(50);
  ISDoneProgressBar1 := TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar1 do begin
    Parent  := WizardForm.InstallingPage;
    Height  := WizardForm.ProgressGauge.Height;
    Left    := ScaleX(0);
    Top      := PBTop;
    Width    := ScaleX(365);
    Max      := 1000;
  end;
  LabelPct1 := TLabel.Create(WizardForm);
  with LabelPct1 do begin
    Parent    := WizardForm.InstallingPage;
    AutoSize  := False;
    Left      := ISDoneProgressBar1.Width+ScaleX(5);
    Top      := ISDoneProgressBar1.Top + ScaleY(2);
    Width    := ScaleX(80);
  end;
  LabelCurrFileName := TLabel.Create(WizardForm);
  with LabelCurrFileName do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := ISDoneProgressBar1.Width+ScaleX(30);
    Left    := ScaleX(0);
    Top      := ScaleY(30);
  end;
#ifdef SecondProgressBar
  PBTop:=PBTop+ScaleY(25);
  ISDoneProgressBar2 := TNewProgressBar.Create(WizardForm);
  with ISDoneProgressBar2 do begin
    Parent  := WizardForm.InstallingPage;
    Left    := ScaleX(0);
    Top      := PBTop+ScaleY(8);
    Width    := ISDoneProgressBar1.Width;
    Max      := 1000;
    Height  := WizardForm.ProgressGauge.Height;
  end;
  LabelPct2 := TLabel.Create(WizardForm);
  with LabelPct2 do begin
    Parent    := WizardForm.InstallingPage;
    AutoSize  := False;
    Left      := ISDoneProgressBar2.Width+ScaleX(5);
    Top      := ISDoneProgressBar2.Top + ScaleY(2);
    Width    := ScaleX(80);
  end;
#endif
  LabelTime1 := TLabel.Create(WizardForm);
  with LabelTime1 do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := ISDoneProgressBar1.Width div 2;
    Left    := ScaleX(0);
    Top      := PBTop + ScaleY(35);
  end;
  LabelTime2 := TLabel.Create(WizardForm);
  with LabelTime2 do begin
    Parent  := WizardForm.InstallingPage;
    AutoSize := False;
    Width    := LabelTime1.Width+ScaleX(40);
    Left    := ISDoneProgressBar1.Width div 2;
    Top      := LabelTime1.Top;
  end;
  LabelTime3 := TLabel.Create(WizardForm);
  with LabelTime3 do begin
    Parent  := WizardForm.FinishedPage;
    AutoSize := False;
    Width    := 300;
    Left    := 180;
    Top      := 200;
  end;
  MyCancelButton:=TButton.Create(WizardForm);
  with MyCancelButton do begin
    Parent:=WizardForm;
    Width:=ScaleX(135);
    Caption:=ExpandConstant('{cm:CancelButton}');
    Left:=ScaleX(360);
    Top:=WizardForm.cancelbutton.top;
    OnClick:=@CancelButtonOnClick;
  end;
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  if (CurPageID = wpFinished) and ISDoneError then
  begin
    LabelTime3.Hide;
    WizardForm.Caption:= ExpandConstant('{cm:Error}');
    WizardForm.FinishedLabel.Font.Color:= clRed;
    WizardForm.FinishedLabel.Caption:= SetupMessage(msgSetupAborted) ;
  end;
end;

function CheckError:boolean;
begin
  result:= not ISDoneError;
end;

procedure CurStepChanged(CurStep: TSetupStep);
var Comps1,Comps2,Comps3, TmpValue:cardinal;
    FindHandle1,ColFiles1,CurIndex1,tmp:integer;
    ExecError:boolean;
    InFilePath,OutFilePath,OutFileName:PAnsiChar;
begin
  if CurStep = ssInstall then begin  //Если необходимо, можно поменять на ssPostInstall
    WizardForm.ProgressGauge.Hide;
    WizardForm.CancelButton.Hide;
    CreateControls;
    WizardForm.StatusLabel.Caption:=ExpandConstant('{cm:Extracted}');
    ISDoneCancel:=0;

// Распаковка всех необходимых файлов в папку {tmp}.

ExtractTemporaryFile('unarc.dll');

#ifdef PrecompInside
ExtractTemporaryFile('CLS-precomp.dll');
ExtractTemporaryFile('packjpg_dll.dll');
ExtractTemporaryFile('packjpg_dll1.dll');
ExtractTemporaryFile('precomp.exe');
ExtractTemporaryFile('zlib1.dll');
#endif
#ifdef SrepInside
ExtractTemporaryFile('CLS-srep.dll');
#endif
#ifdef MSCInside
ExtractTemporaryFile('CLS-MSC.dll');
#endif
#ifdef facompress
    ExtractTemporaryFile('facompress.dll'); //ускоряет распаковку .arc архивов.
#endif
#ifdef records
    ExtractTemporaryFile('records.inf');
#endif
#ifdef precomp
  #if precomp == "0.38"
    ExtractTemporaryFile('precomp038.exe');
  #else
    #if precomp == "0.4"
      ExtractTemporaryFile('precomp040.exe');
    #else
      #if precomp == "0.41"
        ExtractTemporaryFile('precomp041.exe');
      #else
        #if precomp == "0.42"
          ExtractTemporaryFile('precomp042.exe');
        #else
          ExtractTemporaryFile('precomp038.exe');
          ExtractTemporaryFile('precomp040.exe');
          ExtractTemporaryFile('precomp041.exe');
          ExtractTemporaryFile('precomp042.exe');
        #endif
      #endif
    #endif
  #endif
#endif
#ifdef unrar
    ExtractTemporaryFile('Unrar.dll');
#endif
#ifdef XDelta
    ExtractTemporaryFile('XDelta3.dll');
#endif
#ifdef PackZIP
    ExtractTemporaryFile('7z.dll');
    ExtractTemporaryFile('PackZIP.exe');
#endif

    ExtractTemporaryFile('English.ini');

// Подготавливаем переменную, содержащую всю информацию о выделенных компонентах для ISDone.dll
// максимум 96 компонентов.
    Comps1:=0; Comps2:=0; Comps3:=0;
#ifdef Components
    TmpValue:=1;
    if IsComponentSelected('text\rus') then Comps1:=Comps1+TmpValue;    //компонент 1
    TmpValue:=TmpValue*2;
    if IsComponentSelected('text\eng') then Comps1:=Comps1+TmpValue;    //компонент 2
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\rus') then Comps1:=Comps1+TmpValue;    //компонент 3
    TmpValue:=TmpValue*2;
    if IsComponentSelected('voice\eng') then Comps1:=Comps1+TmpValue;    //компонент 4
//    .....
// см. справку
#endif

#ifdef precomp
  PCFVer:={#precomp};
#else
  PCFVer:=0;
#endif
    ISDoneError:=true;
    if ISDoneInit(ExpandConstant('{src}\records.inf'), $F777, Comps1,Comps2,Comps3, MainForm.Handle, {#NeedMem}, @ProgressCallback) then begin
      repeat
//        ChangeLanguage('English');
        if not SrepInit('',512,0) then break;
        if not PrecompInit('',128,PCFVer) then break;
        if not FileSearchInit(true) then break;

        if not ISArcExtract ( 0, 0, ExpandConstant('{src}\*.arc'), ExpandConstant('{app}'), '', false, '', '', ExpandConstant('{app}'), notPCFonFLY {PCFonFLY}) then break;

//    далее находятся закомментированые примеры различных функций распаковки (чтобы каждый раз не лазить в справку за примерами)
(*
        if not ISArcExtract    ( 0, 0, ExpandConstant('{src}\arc.arc'), ExpandConstant('{app}\'), '', false, '', ExpandConstant('{tmp}\arc.ini'), ExpandConstant('{app}\'), notPCFonFLY{PCFonFLY}) then break;
        if not IS7ZipExtract  ( 0, 0, ExpandConstant('{src}\CODMW2.7z'), ExpandConstant('{app}\data1'), false, '') then break;
        if not ISRarExtract    ( 0, 0, ExpandConstant('{src}\data_*.rar'), ExpandConstant('{app}'), false, '') then break;
        if not ISSRepExtract  ( 0, 0, ExpandConstant('{app}\data1024_1024.srep'),ExpandConstant('{app}\data1024.arc'), true) then break;
        if not ISPrecompExtract( 0, 0, ExpandConstant('{app}\data.pcf'),    ExpandConstant('{app}\data.7z'), true) then break;
        if not ISxDeltaExtract ( 0, 0, 0, 640, ExpandConstant('{app}\in.pcf'), ExpandConstant('{app}\*.diff'),  ExpandConstant('{app}\out.dat'), false, false) then break;
        if not ISPackZIP      ( 0, 0, ExpandConstant('{app}\1a1\*'), ExpandConstant('{app}\1a1.pak'), 2, false ) then break;
        if not ISExec          ( 0, 0, 0, ExpandConstant('{tmp}\Arc.exe'), ExpandConstant('x -o+ "{src}\001.arc" "{app}\"'), ExpandConstant('{tmp}'), '...',false) then break;
        if not ShowChangeDiskWindow ('Пожалуйста, вставьте второй диск и дождитесь его инициализации.', ExpandConstant('{src}'),'CODMW_2.arc') then break;

//    распаковка группы файлов посредством внешнего приложения

        FindHandle1:=ISFindFiles(0,ExpandConstant('{app}\*.ogg'),ColFiles1);
        ExecError:=false;
        while not ExecError and ISPickFilename(FindHandle1,ExpandConstant('{app}\'),CurIndex1,true) do begin
          InFilePath:=ISGetName(0);
          OutFilePath:=ISGetName(1);
          OutFileName:=ISGetName(2);
          ExecError:=not ISExec(0, 0, 0, ExpandConstant('{tmp}\oggdec.exe'), '"'+InFilePath+'" -w "'+OutFilePath+'"',ExpandConstant('{tmp}'),OutFileName,false);
        end;
        ISFindFree(FindHandle1);
        if ExecError then break;
*)

        ISDoneError:=false;
      until true;
      ISDoneStop;
    end;
    HideControls;
    WizardForm.CancelButton.Visible:=true;
    WizardForm.CancelButton.Enabled:=false;
  end;
  if (CurStep=ssPostInstall) and ISDoneError then begin
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
  end;
end;

procedure InitializeWizard();
begin
  CreateMutex('MyProgramMutexUniqueName');
end;


P.S я б раньше ответил, но был занят. Так что смог только щас.

El Sanchez 06-04-2012 21:27 1894849

Цитата:

Цитата Johny777
Может пожалуйста кто-нибудь добавить сюда »

Johny777, добавь в нужные места:
Код:

const
  WM_MOUSEWHEEL = $20A;

function GetWindowRect(hWnd: HWND; var lpRect: TRect): Boolean; external 'GetWindowRect@user32.dll stdcall';

var
  rt: TRect;

procedure AppOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
  case Msg.message of
    WM_MOUSEWHEEL: begin
      if WizardForm.CurPageID = IsCustomPage1.ID then
      begin
        GetWindowRect(ScrollBox1.Handle, rt);
        if (Msg.pt.x > rt.Left) and (Msg.pt.x < rt.Right) and (Msg.pt.y > rt.Top) and (Msg.pt.y < rt.Bottom) then
          if Msg.wParam > 0 then ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position - 16 else ScrollBox1.VertScrollBar.Position:= ScrollBox1.VertScrollBar.Position + 16;
        Handled := True;
      end;
    end;
  end;
end;
...
Application.OnMessage := @AppOnMessage; //где-нибудь в InitializeWizard или в твоей RedesignWizardForm


Johny777 06-04-2012 22:36 1894880

El Sanchez,
спасибо тебе огромное
мне так сильно этого не хватало!
результат http://sendfile.su/566305 :)

sergey3695,
честно говоря исдан посмотрел справку и пример глянул и всё
опыта нет
если там через библиотеку идёт удаление , то ничем помочь не могу

Raf-9600 07-04-2012 00:36 1894927

Ктонить может убрать возможность кликнуть ПКМ по тексту комментариев компонентов, из этого кода?
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
ComponentsListTVStyle=true

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

[CustomMessages]
russian.ComponentsName1=Моя программа™
russian.ComponentsName2=Помощь
russian.ComponentsName2_1=Документация
russian.ComponentsName2_2=Руководство пользователя
russian.ComponentsInfoPanel1=Описание
russian.ComponentsInfoPanel2=Наведите курсор мыши на компонент, чтобы прочитать его описание.
russian.ComponentsDescription1=Устанавливается обязательно
russian.ComponentsDescription2=Помощь
russian.ComponentsDescription3=Прочитать документацию
russian.ComponentsDescription4=Прочитать руководство пользователя

[Components]
Name: readme; Description: Справка; Types: full custom;
Name: readme\en; Description: "Английская "; Types: full custom; Flags: fixed
Name: readme\ru; Description: Русская; Types: full

;*************************************************************************
Name: plugs; Description: Плагины; Types: full ; Flags: collapsed
Name: plugs\wlx; Description: Внутреннего просмотра; Types: full
Name: plugs\wcx; Description: Архиваторные; Types: full
Name: plugs\wfx; Description: Системные; Types: full
Name: plugs\wfx\CanonCam; Description: CanonCam; Types: full
Name: plugs\wfx\PluginManager; Description: PluginManager; Types: full
Name: plugs\wfx\Registry; Description: Registry; Types: full
Name: plugs\wfx\Services; Description: Services; Types: full
Name: plugs\wfx\StartupGuard; Description: StartupGuard; Types: full
Name: plugs\wdx; Description: Другие; Types: full

[C0de]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  DRTF: TRichEditViewer;

procedure RedesignWizardForm;
begin
  with WizardForm.ComponentsList do
  begin
    Width := ScaleX(201);
  end;

  { DRTF }
  DRTF := TRichEditViewer.Create(WizardForm);
  with DRTF do
  begin
    Name := 'DRTF';
    Parent := WizardForm.SelectComponentsPage;
    Left := ScaleX(208);
    Top := ScaleY(74);
    Width := ScaleX(209);
    Height := ScaleY(131);
    Color := clMenu;
    DragMode := dmAutomatic;
    ReadOnly := True;
    ScrollBars := ssVertical;
    Text := '';
  end;

  DRTF.TabOrder := 4;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

type
  TComponentDesc = record Description: String; Index: Integer; end;

var
  Descs: array of TComponentDesc;
  Indx: Integer;

procedure ShowDescription(Sender: TObject; X, Y, Index: Integer; Area: TItemArea);
var i: Integer;
begin
  Indx:=-1;
  for i:= 0 to GetArrayLength(Descs)-1 do begin
  if (Descs[i].Index=Index) then begin Indx:=i; Break end; end;
  if (Indx >=0)and(Area=iaItem) then DRTF.Text:= Descs[Indx].Description else DRTF.Text:= ExpandConstant('{cm:ComponentsInfoPanel2}');
end;

procedure AddDescription(AIndex: Integer; ADescription: String);
var i, k: Integer;
begin
i:= GetArrayLength(Descs); SetArrayLength(Descs, i+1);
Descs[i].Description:= ADescription; Descs[i].Index:= AIndex-1
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
  WizardForm.ComponentsList.OnItemMouseMove:= @ShowDescription


  AddDescription(1, 'Справка'); //первый параметр - это номер компонента, идет последовательно от начала записи компонентов
  AddDescription(2, 'Эта сказка возникла в устных рассказах, пока не стала историей Великой Войны Кольца, включая множество эскурсов в более древние времена. Она начала создаваться после того, как был написан "Хоббит", и по его первой публикации в 1937 году: но я не торопился с продолжением, потому что хотел прежде собрать и привести в порядок мифологию и легенды древних дней, а для этого потребовалось несколько лет. Я делал это для собственного удовольствия и мало надеялся, что другие люди заинтересуются моей работой, особенно потому что она была преимущественно лингвистической по побуждениям и возникла из необходимости привести в порядок мои отрывочные сведения о языках эльфов.'); //Второй параметр - это собственно описание компонента
  AddDescription(3, 'Русская справка');
  AddDescription(4, 'Плагины');
  AddDescription(5, 'Внутреннего просмотра');
  AddDescription(6, 'Архиваторные');
  AddDescription(7, 'Системные');
  AddDescription(8, 'CanonCam');
  AddDescription(9, 'PluginManager');
  AddDescription(10, 'Registry');
  AddDescription(11, 'Services');
  AddDescription(12, 'StartupGuard');
  AddDescription(13, 'Другие');

end;

[ISFormDesigner]
WizardForm=FF0A005457495A415244464F524D003010D602000054504630F10B5457697A617264466F726D0A57697A617264466F726D0C436C69656E744865696768740368010B436C69656E74576964746803F1010C4578706C696369744C65667402000B4578706C69636974546F7002000D4578706C6963697457696474680301020E4578706C69636974486569676874038E010D506978656C73506572496E636802600A54657874486569676874020D00F10C544E65774E6F7465626F6F6B0D4F757465724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B57656C636F6D65506167650D4578706C69636974576964746803F1010E4578706C696369744865696768740339010000F110544E65774E6F7465626F6F6B5061676509496E6E6572506167650D4578706C69636974576964746803F1010E4578706C6963697448656967687403390100F10C544E65774E6F7465626F6F6B0D496E6E65724E6F7465626F6F6B00F110544E65774E6F7465626F6F6B506167650B4C6963656E7365506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED000000F110544E65774E6F7465626F6F6B506167651453656C656374436F6D706F6E656E7473506167650D4578706C69636974576964746803A1010E4578706C6963697448656967687403ED0000F11


Ivan_009 07-04-2012 01:42 1894947

Как прописать в секции [Run] установку Обновить DirectX (требуется интернет соединение) пробовал стандартный ключ silent почемуто ошибка... :help:

Johny777 07-04-2012 02:06 1894948

Цитата:

Цитата Ivan_009
Как прописать в секции [Run] установку Обновить DirectX »

а если инет слабый и в тихом режиме (которого скорее всего нет) будет всю ночь напролёт качаться?
а если пользователь не хочет ставить панель Bing?
а ели у пользователя инет не безлимитный со всеми вытекающими последствиями?
Лучше не в тихом режиме!
Извини если вопрос не понял
Цитата:

Цитата Raf-9600
может убрать возможность кликнуть ПКМ по тексту комментариев компонентов »

у меня нет всплывающего меню при нажатии правой кнопкой
использую расширенную версию 5.4.2 (ANSI)

Ivan_009 07-04-2012 02:15 1894949

Как прописать эапуск веб установщика DirectX :lol:

Johny777 07-04-2012 02:23 1894950

Ну Ваня
вот два варианта
тебе второй подробнее расписать?
[Run]
Filename: {src}\dxwebsetup.exe; StatusMsg: установка директа; Flags: skipifdoesntexist waituntilterminated;

или

[code]
var
res: integer;
если чекбокс отмечен, то
begin
Exec(ExpandConstant('{src}\dxwebsetup.exe'), '', ExpandConstant('{src}'), SW_SHOW, ewWaitUntilTerminated, Res);
WizardForm.StatusLabel.Caption := 'установка директа';
end;

El Sanchez 07-04-2012 12:20 1895055

Цитата:

Цитата El Sanchez
Johny777, добавь в нужные места: »

El Sanchez, небольшой апдейт: перенес GetWindowRect в процедуру AppOnMessage, а то при перемещении формы нужно заново вычислять координаты прямоугольника скроллбокса, и добавил определение страницы, на которой скроллинг должен действовать, а то скроллилось и на другой странице.

Raf-9600 07-04-2012 12:29 1895063

Цитата:

Цитата Johny777
у меня нет всплывающего меню при нажатии правой кнопкой »

Странно, у меня вчера было... Сорри за ложную тревогу

Raf-9600 07-04-2012 14:58 1895150

Подскажите ктонить, можно ли сделать так, чтобы в приведённом ниже коде, при клике на какой-либо компонент, инсталлятор не зависал? При том нужно чтобы весь функционал остался.

читать дальше »
Код:

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

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

[Components]
Name: "Diablo"; Description: Diablo; Flags: exclusive disablenouninstallwarning;
Name: "Diablo\Local"; Description: Локализация; Flags: exclusive disablenouninstallwarning
Name: "Diablo\Local\Russian"; Description: Русская; Flags: exclusive collapsed disablenouninstallwarning; ExtraDiskSpaceRequired: 518540567
Name: "Diablo\Local\Russian\Stream"; Description: Stream; Flags: exclusive disablenouninstallwarning; Types: full
Name: "Diablo\Local\Russian\Fargus"; Description: Фаргус; Flags: exclusive collapsed disablenouninstallwarning;
Name: "Diablo\Local\Englisch"; Description: Английская; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\Local\Deusch"; Description: Немецкая; Flags: exclusive collapsed disablenouninstallwarning

Name: "Diablo\patch"; Description: Версия; Flags: collapsed disablenouninstallwarning
Name: "Diablo\patch\100"; Description: 1.00; Flags: exclusive collapsed disablenouninstallwarning; Types: full
Name: "Diablo\patch\107"; Description: 1.07; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\patch\108"; Description: 1.08; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\patch\109"; Description: 1.09; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\patch\109b"; Description: 1.09b; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\NoCD"; Description: No-CD; Flags: disablenouninstallwarning; Types: full
Name: "Diablo\UPD"; Description: Активировать UPD; Flags: disablenouninstallwarning; Types: full

Name: "Hellfire"; Description: Hellfire; Flags: exclusive disablenouninstallwarning;
Name: "Hellfire\Local"; Description: Локализация; Flags: exclusive disablenouninstallwarning
Name: "Hellfire\Local\Russian"; Description: Русская; Flags: exclusive collapsed disablenouninstallwarning; ExtraDiskSpaceRequired: 518540567
Name: "Hellfire\Local\Russian\Stream"; Description: Stream; Flags: exclusive collapsed disablenouninstallwarning;
Name: "Hellfire\Local\Russian\Fargus"; Description: Фаргус; Flags: exclusive disablenouninstallwarning;
Name: "Hellfire\Local\Englisch"; Description: Английская; Flags: exclusive collapsed disablenouninstallwarning
Name: "Hellfire\patch"; Description: Версия; Flags: collapsed disablenouninstallwarning
Name: "Hellfire\patch\100"; Description: 1.00; Flags: exclusive disablenouninstallwarning
Name: "Hellfire\patch\101"; Description: 1.01; Flags: exclusive collapsed disablenouninstallwarning
Name: "Hellfire\patch\102"; Description: 1.02; Flags: exclusive collapsed disablenouninstallwarning
Name: "Hellfire\NoCD"; Description: No-CD; Flags: disablenouninstallwarning

Name: "Hellfire\Hide"; Description: Скрытые возможности; Flags: collapsed disablenouninstallwarning
Name: "Hellfire\Hide\multitest"; Description: Мультиплеер; Flags: disablenouninstallwarning collapsed;
Name: "Hellfire\Hide\multitest\udp"; Description: Активировать UDP; Flags: disablenouninstallwarning
Name: "Hellfire\Hide\NestArt"; Description: Статичная палитра Улья; Flags: disablenouninstallwarning dontinheritcheck;
Name: "Hellfire\Hide\bardtest"; Description: Класс - Бард; Flags: disablenouninstallwarning;
Name: "Hellfire\Hide\Barbariantest"; Description: Класс - Варвар; Flags: disablenouninstallwarning;
Name: "Hellfire\Hide\theoquest"; Description: Квест от Цилии; Flags: disablenouninstallwarning;
Name: "Hellfire\Hide\FarmersOrchard"; Description: Квест от фермера Лестера; Flags: exclusive disablenouninstallwarning
Name: "Hellfire\Hide\cowquest"; Description: Квест от Полного Психа; Flags: exclusive disablenouninstallwarning


[C0de]
procedure ComponentsListOnClickCheck(Sender: TObject);
begin                                                               
  if wizardform.ComponentsList.Checked[3] then //Diablo\Local\Russian\Stream
    wizardform.ComponentsList.Checked[13]:=True; //Diablo\NoCD


begin                                           
  if wizardform.ComponentsList.Checked[4] then //Hellfire\Local\Russian\Fargus
    wizardform.ComponentsList.Checked[25]:=True; //Hellfire\NoCD
end;

begin                                             
  if wizardform.ComponentsList.Checked[2] then  //Diablo\Local\Russian
    wizardform.ComponentsList.Checked[8]:=True; //Diablo\patch\100
end;


begin
  if wizardform.ComponentsList.Checked[6] then  //Diablo\Local\Deusch
    wizardform.ComponentsList.Checked[12]:=True; //Diablo\patch\109b
end;

begin
  if wizardform.ComponentsList.Checked[0] then  //Diablo
    wizardform.ComponentsList.Checked[1]:=True; //Diablo\Local
    wizardform.ComponentsList.Checked[7]:=True; //Diablo\patch
end;

begin
  if wizardform.ComponentsList.Checked[15] then  //Hellfire
    wizardform.ComponentsList.Checked[16]:=True; //Hellfire\Local
    wizardform.ComponentsList.Checked[21]:=True; //Hellfire\patch
end;

end;

procedure InitializeWizard1();
begin
wizardform.ComponentsList.OnClickCheck:=@ComponentsListOnClickCheck
end;

var
OldEvent_ComponentsListClickCheck: TNotifyEvent;
procedure ComponentsListClickCheck(Sender: TObject);

//Hellfire
begin
If IsComponentSelected('Diablo\Local\Englisch') then begin
WizardForm.ComponentsList.ItemEnabled[9]:=True;  //patch\107
WizardForm.ComponentsList.ItemEnabled[10]:=True;  //patch\108
WizardForm.ComponentsList.ItemEnabled[11]:=True;  //patch\109
end else begin
WizardForm.ComponentsList.ItemEnabled[9]:=False;
WizardForm.ComponentsList.ItemEnabled[10]:=False;
WizardForm.ComponentsList.ItemEnabled[11]:=False;
OldEvent_ComponentsListClickCheck(Sender);
end;

begin
If IsComponentSelected('Hellfire\Local\Englisch') then begin
WizardForm.ComponentsList.ItemEnabled[23]:=True;  //patch\101
WizardForm.ComponentsList.ItemEnabled[24]:=True;  //patch\102
end else begin
WizardForm.ComponentsList.ItemEnabled[23]:=False;  //patch\101
WizardForm.ComponentsList.ItemEnabled[24]:=False;  //patch\102
OldEvent_ComponentsListClickCheck(Sender);
end;
end;

begin
If IsComponentSelected('Hellfire\patch\100') then
WizardForm.ComponentsList.ItemEnabled[31]:=False  //Barbariantest
else
WizardForm.ComponentsList.ItemEnabled[31]:=True;
OldEvent_ComponentsListClickCheck(Sender);
end;


begin
If IsComponentSelected('Diablo\Local\Deusch') or IsComponentSelected('Diablo\Local\Englisch') then
WizardForm.ComponentsList.ItemEnabled[12]:=True  //Diablo\patch\109b
else
WizardForm.ComponentsList.ItemEnabled[12]:=False;
OldEvent_ComponentsListClickCheck(Sender);
end;

begin
If IsComponentSelected('Diablo\Local\Deusch') then
WizardForm.ComponentsList.ItemEnabled[8]:=False  //Diablo\patch\100
else
WizardForm.ComponentsList.ItemEnabled[8]:=True;
OldEvent_ComponentsListClickCheck(Sender);
end;

begin
If IsComponentSelected('Diablo\patch\109') or IsComponentSelected('Diablo\patch\109b') then
WizardForm.ComponentsList.ItemEnabled[14]:=True  //Diablo\UPD
else
WizardForm.ComponentsList.ItemEnabled[14]:=False;
OldEvent_ComponentsListClickCheck(Sender);
end;

//------
begin
If IsComponentSelected('Diablo\Local\Deusch') then
WizardForm.ComponentsList.ItemEnabled[8]:=False  //Diablo\patch\100
else
WizardForm.ComponentsList.ItemEnabled[8]:=True;
OldEvent_ComponentsListClickCheck(Sender);
end;

end;



procedure InitializeWizard2();
begin
with WizardForm.ComponentsList do
begin
OldEvent_ComponentsListClickCheck := OnClickCheck;
OnClickCheck := @ComponentsListClickCheck;
ItemEnabled[9]:=False;  //patch\107
ItemEnabled[10]:=False;  //patch\108
ItemEnabled[11]:=False;  //patch\109
ItemEnabled[12]:=False;  //patch\109b
ItemEnabled[14]:=False;  //Diablo\UPD
end;
end;

procedure InitializeWizard;
begin
InitializeWizard1();
InitializeWizard2();
end;


Johny777 07-04-2012 15:57 1895174

Raf-9600,
кажется виснет из-за неполной или неправильной логики
вот записал пока в удобочитаемой форме (тормоза на месте)
читать дальше »
Код:

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

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

[Components]
Name: "Diablo"; Description: Diablo; Flags: exclusive disablenouninstallwarning;
Name: "Diablo\Local"; Description: Локализация; Flags: exclusive disablenouninstallwarning
Name: "Diablo\Local\Russian"; Description: Русская; Flags: exclusive collapsed disablenouninstallwarning; ExtraDiskSpaceRequired: 518540567
Name: "Diablo\Local\Russian\Stream"; Description: Stream; Flags: exclusive disablenouninstallwarning; Types: full
Name: "Diablo\Local\Russian\Fargus"; Description: Фаргус; Flags: exclusive collapsed disablenouninstallwarning;
Name: "Diablo\Local\Englisch"; Description: Английская; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\Local\Deusch"; Description: Немецкая; Flags: exclusive collapsed disablenouninstallwarning

Name: "Diablo\patch"; Description: Версия; Flags: collapsed disablenouninstallwarning
Name: "Diablo\patch\100"; Description: 1.00; Flags: exclusive collapsed disablenouninstallwarning; Types: full
Name: "Diablo\patch\107"; Description: 1.07; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\patch\108"; Description: 1.08; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\patch\109"; Description: 1.09; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\patch\109b"; Description: 1.09b; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\NoCD"; Description: No-CD; Flags: disablenouninstallwarning; Types: full
Name: "Diablo\UPD"; Description: Активировать UPD; Flags: disablenouninstallwarning; Types: full

Name: "Hellfire"; Description: Hellfire; Flags: exclusive disablenouninstallwarning ;
Name: "Hellfire\Local"; Description: Локализация; Flags: exclusive disablenouninstallwarning
Name: "Hellfire\Local\Russian"; Description: Русская; Flags: exclusive collapsed disablenouninstallwarning; ExtraDiskSpaceRequired: 518540567
Name: "Hellfire\Local\Russian\Stream"; Description: Stream; Flags: exclusive collapsed disablenouninstallwarning;
Name: "Hellfire\Local\Russian\Fargus"; Description: Фаргус; Flags: exclusive disablenouninstallwarning;
Name: "Hellfire\Local\Englisch"; Description: Английская; Flags: exclusive collapsed disablenouninstallwarning
Name: "Hellfire\patch"; Description: Версия; Flags: collapsed disablenouninstallwarning
Name: "Hellfire\patch\100"; Description: 1.00; Flags: exclusive disablenouninstallwarning
Name: "Hellfire\patch\101"; Description: 1.01; Flags: exclusive collapsed disablenouninstallwarning
Name: "Hellfire\patch\102"; Description: 1.02; Flags: exclusive collapsed disablenouninstallwarning
Name: "Hellfire\NoCD"; Description: No-CD; Flags: disablenouninstallwarning

Name: "Hellfire\Hide"; Description: Скрытые возможности; Flags: collapsed disablenouninstallwarning
Name: "Hellfire\Hide\multitest"; Description: Мультиплеер; Flags: disablenouninstallwarning collapsed;
Name: "Hellfire\Hide\multitest\udp"; Description: Активировать UDP; Flags: disablenouninstallwarning
Name: "Hellfire\Hide\NestArt"; Description: Статичная палитра Улья; Flags: disablenouninstallwarning dontinheritcheck;
Name: "Hellfire\Hide\bardtest"; Description: Класс - Бард; Flags: disablenouninstallwarning;
Name: "Hellfire\Hide\Barbariantest"; Description: Класс - Варвар; Flags: disablenouninstallwarning;
Name: "Hellfire\Hide\theoquest"; Description: Квест от Цилии; Flags: disablenouninstallwarning;
Name: "Hellfire\Hide\FarmersOrchard"; Description: Квест от фермера Лестера; Flags: exclusive disablenouninstallwarning
Name: "Hellfire\Hide\cowquest"; Description: Квест от Полного Психа; Flags: exclusive disablenouninstallwarning


[  Code]
var
  OldEvent_ComponentsListClickCheck: TNotifyEvent;
 
procedure ComponentsListClickCheck(Sender: TObject);
begin

//  if wizardform.ComponentsList.Checked[3] then //Diablo\Local\Russian\Stream
//    wizardform.ComponentsList.Checked[13]:=True; //Diablo\NoCD
//  if wizardform.ComponentsList.Checked[4] then //Hellfire\Local\Russian\Fargus
//    wizardform.ComponentsList.Checked[25]:=True; //Hellfire\NoCD
//  if wizardform.ComponentsList.Checked[2] then  //Diablo\Local\Russian
//    wizardform.ComponentsList.Checked[8]:=True; //Diablo\patch\100
//  if wizardform.ComponentsList.Checked[6] then  //Diablo\Local\Deusch
//    wizardform.ComponentsList.Checked[12]:=True; //Diablo\patch\109b
//  if wizardform.ComponentsList.Checked[0] then  //Diablo
//    wizardform.ComponentsList.Checked[1]:=True; //Diablo\Local
//    wizardform.ComponentsList.Checked[7]:=True; //Diablo\patch
//  if wizardform.ComponentsList.Checked[15] then  //Hellfire
//    wizardform.ComponentsList.Checked[16]:=True; //Hellfire\Local
//    wizardform.ComponentsList.Checked[21]:=True; //Hellfire\patch



  If IsComponentSelected('Diablo\Local\Englisch') then
    begin
      WizardForm.ComponentsList.ItemEnabled[9]:=True;  //patch\107
      WizardForm.ComponentsList.ItemEnabled[10]:=True;  //patch\108
      WizardForm.ComponentsList.ItemEnabled[11]:=True;  //patch\109
      OldEvent_ComponentsListClickCheck(Sender);
    end
  else
    begin
      WizardForm.ComponentsList.ItemEnabled[9]:=False;
      WizardForm.ComponentsList.ItemEnabled[10]:=False;
      WizardForm.ComponentsList.ItemEnabled[11]:=False;
      OldEvent_ComponentsListClickCheck(Sender);
    end;

  If IsComponentSelected('Hellfire\Local\Englisch') then
    begin
      WizardForm.ComponentsList.ItemEnabled[23]:=True;  //patch\101
      WizardForm.ComponentsList.ItemEnabled[24]:=True;  //patch\102
      OldEvent_ComponentsListClickCheck(Sender);
    end
  else
    begin
      WizardForm.ComponentsList.ItemEnabled[23]:=False;  //patch\101
      WizardForm.ComponentsList.ItemEnabled[24]:=False;  //patch\102
      OldEvent_ComponentsListClickCheck(Sender);
    end;

  If IsComponentSelected('Hellfire\patch\100') then
    begin
      WizardForm.ComponentsList.ItemEnabled[31]:=False    //Barbariantest
      OldEvent_ComponentsListClickCheck(Sender);
    end
  else
    begin
      WizardForm.ComponentsList.ItemEnabled[31]:=True;
      OldEvent_ComponentsListClickCheck(Sender);
    end;
   
  If IsComponentSelected('Diablo\Local\Deusch') or IsComponentSelected('Diablo\Local\Englisch') then
    begin
      WizardForm.ComponentsList.ItemEnabled[12]:=True  //Diablo\patch\109b
      OldEvent_ComponentsListClickCheck(Sender);
    end
  else
    begin
      WizardForm.ComponentsList.ItemEnabled[12]:=False;
      OldEvent_ComponentsListClickCheck(Sender);
    end;
   
  If IsComponentSelected('Diablo\Local\Deusch') then
    begin
      WizardForm.ComponentsList.ItemEnabled[8]:=False  //Diablo\patch\100
      OldEvent_ComponentsListClickCheck(Sender);
    end
  else
    begin
      WizardForm.ComponentsList.ItemEnabled[8]:=True;
      OldEvent_ComponentsListClickCheck(Sender);
    end;

  If IsComponentSelected('Diablo\patch\109') or IsComponentSelected('Diablo\patch\109b') then
    begin
      WizardForm.ComponentsList.ItemEnabled[14]:=True  //Diablo\UPD
      OldEvent_ComponentsListClickCheck(Sender);
    end
  else
    begin
      WizardForm.ComponentsList.ItemEnabled[14]:=False;
      OldEvent_ComponentsListClickCheck(Sender);
    end;

  If IsComponentSelected('Diablo\Local\Deusch') then
    begin
      WizardForm.ComponentsList.ItemEnabled[8]:=False  //Diablo\patch\100
      OldEvent_ComponentsListClickCheck(Sender);
    end
  else
    begin
      WizardForm.ComponentsList.ItemEnabled[8]:=True;
      OldEvent_ComponentsListClickCheck(Sender);
    end;
end;



procedure InitializeWizard;
begin
with WizardForm.ComponentsList do
  begin
    OldEvent_ComponentsListClickCheck := OnClickCheck;
    OnClickCheck := @ComponentsListClickCheck;
    ItemEnabled[9]:=False;  //patch\107
    ItemEnabled[10]:=False;  //patch\108
    ItemEnabled[11]:=False;  //patch\109
    ItemEnabled[12]:=False;  //patch\109b
    ItemEnabled[14]:=False;  //Diablo\UPD
    TreeViewStyle := True;
  end;
end;



нашёл конфликт!


дочерний элемент радиокнопки не может быть фиксирован
речь идёт о этом компоненте
Name: "Diablo\UPD"; Description: Активировать UPD; Flags: disablenouninstallwarning; Types: full

и куске процедуры
If IsComponentSelected('Diablo\patch\109') then
begin
WizardForm.ComponentsList.ItemEnabled[14]:=True //Diablo\UPD
OldEvent_ComponentsListClickCheck(Sender);
end
else
begin
WizardForm.ComponentsList.ItemEnabled[14]:=False;
OldEvent_ComponentsListClickCheck(Sender);
end;
те если выбрать патч, то только активировать

достаточно просто чтобы он был отмечен.
а если пользователь снимет галку, то Diablo\patch\109 не отмечен.
очень сложно с этими номерами понять логику.
Пересмотри
а лучше начни писать заново, проверяя после каждого действия всё ли работает

Raf-9600 07-04-2012 17:33 1895218

Цитата:

Цитата Johny777
речь идёт о этом компоненте
Name: "Diablo\UPD"; Description: Активировать UPD; Flags: disablenouninstallwarning; Types: full »

Нет, с этим вроди все в норме. От зависаний я избавился удалив:

Код:

begin
If IsComponentSelected('Hellfire\patch\100') then
WizardForm.ComponentsList.ItemEnabled[31]:=False  //Barbariantest
else
WizardForm.ComponentsList.ItemEnabled[31]:=True;
OldEvent_ComponentsListClickCheck(Sender);
end;

Но что тут нелогичного?..

Johny777 07-04-2012 17:36 1895220

Raf-9600,
Item Enabled : = False
объект включен НЕТ, те заблокирован

у тебя все дочернин объекты относятся к двум переключателям (двум играм)
а дочерний объект переключателя не может быть заблокированнным
пример
в 1 игре один элемент (та же активация например) заблокирован
я переключаюсь на игру 2, но все дочернин элементы первой должны лишиться своих флажков, а с одним не получается. Он заблокирован.
попробуй так скомпилировать
читать дальше »
Код:

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

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

Raf-9600,

Name: "Diablo"; Description: Diablo; Flags: exclusive disablenouninstallwarning;
Name: "Diablo\Local"; Description: Локализация; Flags: exclusive disablenouninstallwarning
Name: "Diablo\Local\Russian"; Description: Русская; Flags: exclusive collapsed disablenouninstallwarning; ExtraDiskSpaceRequired: 518540567
Name: "Diablo\Local\Russian\Stream"; Description: Stream; Flags: exclusive disablenouninstallwarning; Types: full
Name: "Diablo\Local\Russian\Fargus"; Description: Фаргус; Flags: exclusive collapsed disablenouninstallwarning;
Name: "Diablo\Local\Englisch"; Description: Английская; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\Local\Deusch"; Description: Немецкая; Flags: exclusive collapsed disablenouninstallwarning


Name: "Diablo\patch"; Description: Версия; Flags: collapsed disablenouninstallwarning

Name: "Diablo\patch\100"; Description: 1.00; Flags: exclusive collapsed disablenouninstallwarning; Types: full
Name: "Diablo\patch\107"; Description: 1.07; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\patch\108"; Description: 1.08; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\patch\109"; Description: 1.09; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\patch\109b"; Description: 1.09b; Flags: exclusive collapsed disablenouninstallwarning
Name: "Diablo\NoCD"; Description: No-CD; Flags: disablenouninstallwarning; Types: full
///фиксирован
Name: "Diablo\UPD"; Description: Активировать UPD; Flags: disablenouninstallwarning fixed; Types: full



Name: "Hellfire"; Description: Hellfire; Flags: exclusive disablenouninstallwarning ;
Name: "Hellfire\Local"; Description: Локализация; Flags: disablenouninstallwarning
Name: "Hellfire\Local\Russian"; Description: Русская; Flags: exclusive collapsed disablenouninstallwarning; ExtraDiskSpaceRequired: 518540567
Name: "Hellfire\Local\Russian\Stream"; Description: Stream; Flags: exclusive collapsed disablenouninstallwarning;
Name: "Hellfire\Local\Russian\Fargus"; Description: Фаргус; Flags: exclusive disablenouninstallwarning;
Name: "Hellfire\Local\Englisch"; Description: Английская; Flags: exclusive collapsed disablenouninstallwarning
Name: "Hellfire\patch"; Description: Версия; Flags: collapsed disablenouninstallwarning
Name: "Hellfire\patch\100"; Description: 1.00; Flags: exclusive disablenouninstallwarning
Name: "Hellfire\patch\101"; Description: 1.01; Flags: exclusive collapsed disablenouninstallwarning
Name: "Hellfire\patch\102"; Description: 1.02; Flags: exclusive collapsed disablenouninstallwarning
Name: "Hellfire\NoCD"; Description: No-CD; Flags: disablenouninstallwarning


Name: "Hellfire\Hide"; Description: Скрытые возможности; Flags: collapsed disablenouninstallwarning
Name: "Hellfire\Hide\multitest"; Description: Мультиплеер; Flags: disablenouninstallwarning collapsed;
Name: "Hellfire\Hide\multitest\udp"; Description: Активировать UDP; Flags: disablenouninstallwarning
Name: "Hellfire\Hide\NestArt"; Description: Статичная палитра Улья; Flags: disablenouninstallwarning dontinheritcheck;
Name: "Hellfire\Hide\bardtest"; Description: Класс - Бард; Flags: disablenouninstallwarning;
Name: "Hellfire\Hide\Barbariantest"; Description: Класс - Варвар; Flags: disablenouninstallwarning;
Name: "Hellfire\Hide\theoquest"; Description: Квест от Цилии; Flags: disablenouninstallwarning;
Name: "Hellfire\Hide\FarmersOrchard"; Description: Квест от фермера Лестера; Flags: exclusive disablenouninstallwarning
Name: "Hellfire\Hide\cowquest"; Description: Квест от Полного Психа; Flags: exclusive disablenouninstallwarning



а теперь запусти и вылетит ошибка подтверждающая всё вышесказанное

читать дальше »
Код:

---------------------------
Ошибка
---------------------------
Radio item cannot have disabled child items.
---------------------------
ОК 
---------------------------



просто нужно при выборе A, выбиралось и B и если потом убрать галку с B, от галка(точка) уберётся и с A, НО не блокируй! (смысл? если они и так друг от друга зависят)
а у тебя в коде через раз блокировка и потому всё виснет,

и мой тебе совет
сделай окошко выбора компонентов больше по вертикали. Еслим внизу поставить галку, а вверху (где не видно) галка снимется (которая важнее той что снизу, но пользватель не видит, что её уже нет), то получится нехорошо

Raf-9600 07-04-2012 17:47 1895224

Цитата:

Цитата Johny777
а теперь запусти и вылетит ошибка подтверждающая всё вышесказанное »

Хмм... Хорошо. Выбери немецкую локализацию Diablo, поставь флажок напротив "Активировать UDP", а потом кликни на Hellfire. В результате "Активировать UDP" заблокируется, но инсталлятор не зависнет.
А вот если, к примеру, сделать все то же самое, но выбрать английскую локализацию, то инсталлятор зависнет... Либо мистика, либо я чего-то не догоняю :)

Цитата:

Цитата Johny777
и мой тебе совет
сделай окошко выбора компонентов больше по вертикали. Еслим внизу поставить галку, а вверху (где не видно) галка снимется (которая важнее той что снизу, но пользватель не видит, что её уже нет), то получится нехорошо »

Такого у меня нет. Я рассчитывал, что пользователь выбирает компоненты сверху в низ, и соответственно, выбрав нижний компонент, с тем, что выше него, уже ничего не произойдет.

Johny777 07-04-2012 17:55 1895228

Raf-9600,
выпей водяры и
начни сначала
но без строк WizardForm.ComponentsList.ItemEnabled[31]:=False или True
а заместо них
wizardform.ComponentsList.Checked[1]:=True; или False
никакой мистики
это просто вынос мозга

Raf-9600 07-04-2012 17:56 1895229

Цитата:

Цитата Johny777
НО не блокируй! (смысл? если они и так друг от друга зависят) »

Не все так просто. К примеру, немецкая локализация может работать только на версии 1.09b. Так почему бы выбрав её, не заблокировать другие версии игры, чтобы пользователь не путался?

Johny777 07-04-2012 18:05 1895233

Цитата:

Цитата Johny777
при выборе A, выбиралось и B и если потом убрать галку с B, от галка(точка) уберётся и с A »

Код:

если выбран компонен "немецкая локализация" то
  If IsComponentSelected('немецкая локализация') then
начинаем
    begin
      WizardForm.ComponentsList.Checked[номер]:=True  1.09b патч отмечен (если он относится к радиокнопке, то 2 другие не отмечены). Если это чекбокс то снизу в этом же куске приписываешь, что они не отмечены, а чекбокс этога патча отмечен
      OldEvent_ComponentsListClickCheck(Sender);
    end  конец
в противном случае
  else
    begin
      WizardForm.ComponentsList.Checked[номер]:=false патч не отмечен
    end;
end;

пользователь при всём желании не сможет обойти это условие
те установить патч с другой локализацией кроме немецкой не получится.
такое же услвии для патча только по отношению к немецкой озвучке
Но если ты его ещё и заблокируешь, то всё зависнет
в блокировке просто нет смысла!

Raf-9600 07-04-2012 18:07 1895234

Цитата:

Цитата Johny777
wizardform.ComponentsList.Checked[1]:=True; или False »

Выглядит не так симпатично как с ItemEnabled, но как резервный вариант решения ситуации вполне катит.

Цитата:

Цитата Johny777
Но если ты его ещё и заблокируешь, то всё зависнет
в блокировке просто нет смысла! »

Блокировка визуально красиво выглядит (^_^)
Хоть ты и прав, но я ещё поколдую над ItemEnabled.

Johny777 07-04-2012 18:13 1895237

Цитата:

Цитата Raf-9600
я ещё поколдую над ItemEnabled. »

радиатор с кучей рёбрышек на мозг не забудь поставить! :laugh:
и ты используешь флаг collapsed
не забудь тогда приписать в InitializeWizard; строку
WizardForm.ComponentsList.TreeViewStyle := True;

Raf-9600 07-04-2012 18:26 1895241

Цитата:

Цитата Johny777
и ты используешь флаг collapsed
не забудь тогда приписать в InitializeWizard; строку
WizardForm.ComponentsList.TreeViewStyle := True; »

Я прописываю ComponentsListTVStyle=true в секции [Setup]

Raf-9600 07-04-2012 19:52 1895278

Я добился своего. Везде где был прописан ItemEnabled там он и остался. К ним я лишь добавил правила снятия галочек с Hellfire\Hide\Barbariantest и Diablo\UPD

Raf-9600 07-04-2012 22:56 1895375

Ктонить может перенести задачу из батника в секцию [Run] инсталлятора? Т.е. нужно чтобы действие выполнялись без bat файла, напрямую через cmd.exe

Код:

@Echo Off
For /F "tokens=*" %%i In (123.txt) Do <nul set /p $WRT="%%i. Good Bye" >123.txt
pause&goto :Eof


Ivan_009 08-04-2012 00:40 1895410

Возможно ли растянуть изображение только на странице установки :search:

Johny777 08-04-2012 02:49 1895443

Ivan_009,
через процедуру CurPageChanged можно делать эксклюзивные настройки или действия для каждой из страниц в отдельности
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpInstalling then
    begin
      Image.Left := ScaleX(0);
      Image.Top := ScaleY(0);
      Image.Width := WizardForm.Width;
      Image.Height := ScaleY(?);
      ///Image.Stretch := True; /// не совсем понял как именно ты хочешь растянуть. Пропорции картинки могут нарушиться
    end;
end;

айди страниц
читать дальше »

wpWelcome = 1;
wpLicense = 2;
wpPassword = 3;
wpInfoBefore = 4;
wpUserInfo = 5;
wpSelectDir = 6;
wpSelectComponents = 7;
wpSelectProgramGroup = 8;
wpSelectTasks = 9;
wpReady = 10;
wpPreparing = 11;
wpInstalling = 12;
wpInfoAfter = 13;
wpFinished = 14;
MyCustomPageName.ID // своя страница

valyok666 08-04-2012 14:56 1895669

Ivan_009, Вы справку можете почитать????или по каждой мелочи будете писать???

alert30 08-04-2012 17:15 1895779

Цитата:

Цитата valyok666
или по каждой мелочи будете писать??? »

Все равно будет игнорирован, одно и то же для "чайников" не читает книжки про строительстве чего-то.

valyok666 09-04-2012 01:24 1895963

Ivan_009, Подумай

Temyraz@fb 09-04-2012 15:44 1896334

всем привет. у меня вот какой вопрос как через inno setup изменить значение bat ?

Код:

begin
if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
begin
        Result := True;
        PathToPsql := DataDirPage.Edits[0].Text;
SaveStringToFile(ExpandConstant('{app}\text.txt'), DataDirPage.Edits[0].Text, True)
end
else
begin
        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
        Result := False;
end;
end;

вот это сохраняет значение в файле, но мне нужно чтоб он в bat изменил значение переменой например переменной: SET PGBIN

Johny777 09-04-2012 16:11 1896354

но почему сначала не переименовать бат в текстовый документ. Потом внести значения и снова переименовать в бат?
через
Цитата:

Цитата Temyraz@fb
SaveStringToFile »

читать дальше »
Код:

begin
        if FileExists(ExpandConstant('{src}\My.bat')) then
        RenameFile(ExpandConstant('{src}\My.bat'), ExpandConstant('{src}\My.txt'))

        вносим значения

        RenameFile(ExpandConstant('{src}\My.txt'), ExpandConstant('{src}\My.bat'))
end;


или вот пример Genri создания батника для удаления сетапа после установки
читать дальше »
Код:

procedure SelfDelete();
var
  str: string;
  BatName: string;
  ResultCode: Integer;
begin
  BatName:= ExpandConstant('{src}\del_bat.cmd');
  str:= str+ '@echo off' + #10#13 +
        str+ ':LOOP' + #10#13 +
        str+ 'del ' + '"' + ExpandConstant('{srcexe}') + '"' + #10#13 +
        str+ 'if exist ' + '"' + ExpandConstant('{srcexe}') + '"' + ' goto LOOP' + #10#13 +
        str+ 'del ' + '"' + BatName + '"';
  SaveStringToFile(BatName, str, False);
  Exec(BatName, '', '', SW_HIDE, ewNoWait, ResultCode);
end;

procedure DeinitializeSetup();
begin
  SelfDelete();
end;


опять же через SaveStringToFile

Temyraz@fb 09-04-2012 16:16 1896366

вот начала батника

CLS
ECHO OFF
SET PGBIN="значение"


и как сказать чтоб он в этой поле изменил значение?

R.i.m.s.k.y. 09-04-2012 16:30 1896377

Temyraz@fb, замена: stringChangeEx(строка в которой нужно подменить, чтоменяем, начтоменяем, True)
Код:

 
procedure RePlaceTextinFile(FilePath:string; find:string; replace:string);
var
  S: TArrayOfString;
  i : Integer;
begin
  if not FileExists(FilePath) then begin MsgBox('Файл не найден ' + FilePath, mbError, mb_Ok); Exit;end; // если файла нет, выходим
  LoadStringsFromFile(FilePath, S); // загружаем файл
  for i:= 0 to GetArrayLength(S)-1 do begin
    if (Pos(AnsiUpperCase(find), AnsiUpperCase(S[i])) > 0) then begin
      StringChangeEx(S[i], find, replace, True);
    end;
  end;
  SaveStringsToFile(FilePath, S, False); // сохраняем файл
end;
......
RePlaceTextinFile(ExpandConstant('{app}\www.bat'), 'SET PGBIN=', 'SET PGBIN="значение"');
......

переименование файла - RenameFile (староеимя, новоеимя)

sergey3695 09-04-2012 16:45 1896391

Цитата:

Цитата Johny777
если там через библиотеку идёт удаление , то ничем помочь не могу »

Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', False);
Какая библиотека????

nik1967 09-04-2012 18:41 1896479

sergey3695, ISDone.dll вообще то.
читать дальше »
function Exec2

function Exec2 (FileName, Param: PAnsiChar; Show:boolean):boolean;
запускает приложение, указанное в параметре FileName с параметрами, заданными через пробел в Param и ожидает его завершения. Если приложение успешно запустилось, выполнило все необходимые действия и завершилось, то выходной параметр функции Exec2 устанавливается в true, иначе - false. Это единственная функция, которая не требует перед использованием инициализировать библиотеку (ISDoneInit). Текущий каталог перед запуском устанавливается как папка, в которой находится целевое приложение.
Show – true в этом параметре указывает, что запускаемое приложение будет видимо, false - запускает его в скрытом режиме;


Примеры:
Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
запускает файл анинсталла с параметром '/VERYSILENT' в скрытом режиме.

valyok666 09-04-2012 18:59 1896486

nik1967, справку надо читать всегда)без неё как без рук :happy:

Temyraz@fb 10-04-2012 11:46 1896935

у меня вот какая проблема. как правильно написать:
Код:

RePlaceTextinFile(ExpandConstant('{app}\www.bat'), 'SET PGBIN=', 'SET PGBIN="значение"');
вместо "значения" чтоб присваивалась значение переменой: {code:SrcDir} и плюс добавлялся путь \base
не могу разобраться в синтаксисе

R.i.m.s.k.y. 10-04-2012 11:50 1896938

Temyraz@fb, если SrcDir - строковая функция, то так
RePlaceTextinFile(ExpandConstant('{app}\www.bat'), 'SET PGBIN=', 'SET PGBIN='+ SrcDir + '\base');

Temyraz@fb 10-04-2012 12:11 1896947

нет, эта директория.
используется она так же как и
Код:

[Files]
Source: {src}\files\*; DestDir: {code:SrcDir}\files\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: make_copy


R.i.m.s.k.y. 10-04-2012 12:20 1896956

Temyraz@fb, мда, справку инно по Constants ты не читал
RePlaceTextinFile(ExpandConstant('{app}\www.bat'), 'SET PGBIN=', 'SET PGBIN=' + ExpandConstant('{src}') + '\base');

sergey3695 10-04-2012 14:40 1897017

nik1967, я это знаю. ты до этого читал что я писал? ладно забейте.

Johny777 10-04-2012 14:43 1897018

Цитата:

Цитата sergey3695
ладно забейте. »

только и остаётся к сожалению, тк чтобы добавить функцию какую ты хотел нужно связаться с автором библиотеки. Именно это я тебе советую. Его не трудно найти
или используй родной деинсталл, если это возможно
[UninstallDelete]
Type: filesandordirs; Name: {app}

R.i.m.s.k.y. 10-04-2012 16:42 1897071

Temyraz@fb, все можно если осторожно
вон выше в моем примере RepalceTextInFile идет считываение текстовика построчно, добавив одну строчку по образцу SET PGBIN можно выдернуть что тебе нужно
и таки в чем твой вопрос?

Temyraz@fb 10-04-2012 16:49 1897074

смотрите что я хочу, чтоб из файла например text.txt в котором есть только одна строчка бралась это значение и заменялась значении
Exec (ExpandConstant ( '{tmp}\check.bat' ), "ТУТ" + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );

R.i.m.s.k.y. 10-04-2012 16:54 1897076

Temyraz@fb, не пора ужо самому учится?
Код:

function TUT(filepath:string):string;
var
  S: TArrayOfString;
  i : Integer;
begin
  if not FileExists(FilePath) then begin MsgBox('Файл не найден ' + FilePath, mbError, mb_Ok); Exit;end; // если файла нет, выходим
  LoadStringsFromFile(FilePath, S); // загружаем файл
  result := S[0];
end;

Exec (ExpandConstant ( '{tmp}\check.bat' ), TUT + AddQuotes(PathToPsql) , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );

И если хочешь добавить кавыки - используй AddQuotes

Ivan_009 10-04-2012 19:23 1897175

Почему при отмене установки в стандартном скрипте инсталл тупо закрывается и не показывает финишную страницу пример:

alert30 10-04-2012 19:56 1897202

Ivan_009, дело не в скрипте, а в настройках самого скрипта секции [Setup], понарысь, может погалочил чего-то.

YURSHAT 11-04-2012 07:49 1897415

Цитата:

Цитата alert30
понарысь, может погалочил чего-то »

Это на каком языке?;)

Temyraz@fb 11-04-2012 10:47 1897491

Цитата:

Цитата R.i.m.s.k.y.
Temyraz@fb, не пора ужо самому учится?
Код:
function TUT(filepath:string):string;
var
S: TArrayOfString;
i : Integer;
begin
if not FileExists(FilePath) then begin MsgBox('Файл не найден ' + FilePath, mbError, mb_Ok); Exit;end; // если файла нет, выходим
LoadStringsFromFile(FilePath, S); // загружаем файл
result := S[0];
end;
Exec (ExpandConstant ( '{tmp}\check.bat' ), TUT + AddQuotes(PathToPsql) , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
И если хочешь добавить кавыки - используй AddQuotes »

сделал как ты сказал только пишет Invalid number of parameters
пишу так:
Код:

Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + AddQuotes(TUT), ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );

R.i.m.s.k.y. 11-04-2012 11:02 1897498

Temyraz@fb, в вызов TUT надо подставить имя_путь_файла откуда дергать строчку, не?
Код:

Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + AddQuotes(TUT(ExpandConstant ( '{src}\www.txt' ))), ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );

Nestle_Nesquik 11-04-2012 14:19 1897645

Всем привет! Какой будет скрипт, если добавить музыку при открытии установки игры или программы и картинка на весь экран?(ну когда открываешь установку, вместе с ней картинка на весь экран) Буду очень благодарен!
Вот скрипт:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[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={{9EF45819-0D12-4C3B-B2FA-FDA670E27623}
AppName=Fusion
AppVersion=3.51
;AppVerName=Fusion 3.51
DefaultDirName={pf}\Fusion
DefaultGroupName=Fusion 3.51
OutputBaseFilename=Установка приложения
Compression=lzma
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Users\(имя пользователя)\Desktop\Smart_Install_Maker\Fusion 3.51.exe"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\Fusion"; Filename: "{app}\Fusion 3.51.exe"
Name: "{commondesktop}\Fusion"; Filename: "{app}\Fusion 3.51.exe"; Tasks: desktopicon

[Run]
Filename: "{app}\Fusion 3.51.exe"; Description: "{cm:LaunchProgram,Fusion}"; Flags: nowait postinstall skipifsilent

R.i.m.s.k.y. 11-04-2012 14:22 1897651

Цитата:

Цитата Nestle_Nesquik
Всем привет! »

Симметрично привет!
Цитата:

Цитата Nestle_Nesquik
Какой будет скрипт, если добавить музыку при открытии установки игры или программы и картинка на весь экран? »

большой, длинный, непонятный
Как в шапке

alert30 11-04-2012 14:47 1897680

Цитата:

Цитата YURSHAT
Это на каком языке? »

На тарбаранском языке. :)
Сократил текст, чтоб понятно было; не пишу же так: ...поищи в настройках скрипта, может какие-то галочки вставил.

R.i.m.s.k.y. 11-04-2012 14:54 1897681

alert30, хы, ты бы еще написал "грепать по сорцам" :)

Johny777 11-04-2012 15:39 1897707

немного изменил один из примеров ботвы (теперь без ботвы)
при нажатии на кнопку "отмена" создаётся своя форма с кнопками "Да" и "Нет"
может кому-то (мне однозначно) пригодится

читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
PrivilegesRequired=none
OutputDir=userdocs:Inno Setup Examples Output

[  code]
var
  NoButton, YesButton: TButton;
  MyExit: TSetupForm;

procedure MyExitMessage();
begin
  MyExit := CreateCustomForm();
  with MyExit do
    begin
      BorderIcons := [];
      Position := poScreenCenter;
      ClientWidth := ScaleX(230);
      ClientHeight := ScaleY(100);
      Caption := ExpandConstant(SetupMessage(msgExitSetupTitle));
      Color := $48c1ca;
    end;

  NoButton := TButton.Create(MyExit);
  with NoButton do
    begin
      Parent := MyExit;
      Left := ScaleX(50);
      Caption := 'Нет';
      Top := ScaleY(60);
      Width := ScaleX(60);
      Height := ScaleY(25);
      ModalResult:= mrNo;
    end;

  YesButton := TButton.Create(MyExit);
    with YesButton do
    begin
      Caption := 'Да';
      Parent := MyExit;
      Left := ScaleX(120);
      Top := ScaleY(60);
      Width := ScaleX(60);
      Height := ScaleY(25);
      ModalResult := mrYes;
    end;
end;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;

  MyExitMessage();
  if MyExit.ShowModal() = mrNo then
    Cancel := False;
end;



зачем?
читать дальше »

R.i.m.s.k.y., :)
оформление в инно - пустая трата времени, головняка много, а толку мало





sergey3695 11-04-2012 16:24 1897746

Цитата:

Цитата Johny777
только и остаётся к сожалению, тк чтобы добавить функцию какую ты хотел нужно связаться с автором библиотеки. Именно это я тебе советую. Его не трудно найти
или используй родной деинсталл, если это возможно
[UninstallDelete]
Type: filesandordirs; Name: {app} »

почитай из справки:
Эта Директива используется, чтобы предотвратить пользователей от установки новой версии приложения, пока приложение работает, и, чтобы помешать пользователю удаление запущенного приложения. Это указывает имена одного или более именованных мьютексы (несколько семафоров разделяются запятыми), которые Установке и удалению будет проверять при загрузке. Если таковые имеются, Установка/Удаление появится сообщение: "[Установки или удаления] показали, что [Заменяет] выполняется в настоящее время. Пожалуйста, закройте все экземпляры его сейчас, затем нажмите кнопку OK, чтобы продолжить, или Отменить, чтобы прервать работу." Значение может содержать константы.
Я знаю автора isdone, и тут библиотека не причем. Почитай можь поймешь.

Johny777 11-04-2012 16:53 1897766

Цитата:

Цитата sergey3695
почитай из справки: »

давай подумаем
isdone я не использую и потому ограничен в помощи больше обычного.
Сам не использую его или другие скрипты/библиотеки нацеленные на создание возможности распаковки архивов Инно сатапом, созданных внешними ужималками а не родным встроенным 7-ZIP.
У меня всё работает!
ты же используешь исдан. А это библиотека со скриптом, через который ты к ней обращаешься. Уберём лишнее. Получаем в конечном итоге библиотеку и конфликт который тебе хочется решить
Вывод: Директива AppMutex несовместима с библиотекой или со скриптом-настройкой к библиотеке. Если второе, то совет я тебе дал. Не помогло? Значит обратись к автору библиотеки.
И справку я читал хоть и не всю (не isdone).
Ты лучше перечитай справку к isdone
И последнее . Этот форум не для обсуждения isdone. Для него есть особая ветка на руборде (не в обиду тебе).
PS:
у медали две стороны. Если ты ставишь себе превыше всего более сильное сжатие при помощи isdone, которое не всегда имеет место или не стоит того, то рискуешь потерять что-то другое.

sergey3695 11-04-2012 17:12 1897776

Johny777, я тебе написал не про isdone
[Setup]: AppMutex
Description:
This directive is used to prevent the user from installing new versions of an application while the application is still running, and to prevent the user from uninstalling a running application. It specifies the names of one or more named mutexes (multiple mutexes are separated by commas), which Setup and Uninstall will check for at startup. If any exist, Setup/Uninstall will display the message: "[Setup or Uninstall] has detected that [AppName] is currently running. Please close all instances of it now, then click OK to continue, or Cancel to exit." The value may include constants.

Из справки inno про AppMutex.
Нехотел я объяснять, не люблю много печатать, но придёться. Из справки понятно что один и тот же AppMutex проверяется как и при запуске инсталлятора так и при запуске деинсталлятора.

Johny777 11-04-2012 17:18 1897777

Цитата:

Цитата sergey3695
Из справки inno про AppMutex. »

зачем ты мне уже второй раз одно и то же из справки цитируешь
и чем смысл разъяснений справки отличается от моих же слов?
Цитата:

Цитата Johny777
не даёт пользователю запустить тот же инсталл несколько раз пока он работает »

вот можешь посмотреть работу дерективы в деле на примере более ранней версии моего скрипта
http://sendfile.su/566305

sergey3695 11-04-2012 17:23 1897780

вот скрин
Что тут непонятно?

Johny777 11-04-2012 18:07 1897804

sergey3695,

Промт или гугловский переводчик?
читать дальше »
Цитата:

Цитата sergey3695
Эта Директива используется, чтобы предотвратить пользователей от установки новой версии приложения, пока приложение работает, и, чтобы помешать пользователю удаление запущенного приложения. Это указывает имена одного или более именованных мьютексы (несколько семафоров разделяются запятыми), которые Установке и удалению будет проверять при загрузке. Если таковые имеются, Установка/Удаление появится сообщение: "[Установки или удаления] показали, что [Заменяет] выполняется в настоящее время. Пожалуйста, закройте все экземпляры его сейчас, затем нажмите кнопку OK, чтобы продолжить, или Отменить, чтобы прервать работу." Значение может содержать константы.
Я знаю автора isdone, и тут библиотека не причем. Почитай можь поймешь. »



вот русская справка.
http://sendfile.su/570136

Ivan_009 11-04-2012 18:36 1897816

Покажите пример наложения картинки на весь экран только не через isgsg.dll.. :drug:

Johny777 11-04-2012 18:58 1897822

Ivan_009,

1. фоновый рисунок в зависимости от разрешения экрана (разрешения не все. Сделай по аналогии какие надо)
читать дальше »
Код:


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

[Files]
Source: 640.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 800.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1024.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1152.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1280.bmp; DestDir: {tmp}; Flags: dontcopy
Source: 1600.bmp; DestDir: {tmp}; Flags: dontcopy

[  Code]
function GetDC(HWND: DWord): DWord;
external 'GetDC@user32.dll stdcall';

function GetDeviceCaps(DC: DWord; Index: Integer): Integer;
external 'GetDeviceCaps@gdi32.dll stdcall';

function ReleaseDC(HWND: DWord;DC: DWord): Integer;
external 'ReleaseDC@user32.dll stdcall';

function ShowWindow(hWnd: DWord; nCmdShow: Integer): boolean;
external 'ShowWindow@user32.dll stdcall';

function SetWindowLong(hWnd: DWord; nIndex: Integer; dwNewLong: Longint): Longint;
external 'SetWindowLongA@user32.dll stdcall';

procedure InitializeWizard();
var
bgImage : TBitmapImage;
bgImageName: String;
width: integer;
dc: DWord;

begin
bgImage:=TBitmapImage.Create(MainForm)
bgImage.Align:=alClient
bgImage.Stretch:=True
bgImage.Parent:=MainForm

dc:=GetDC(MainForm.Handle)
width:=GetDeviceCaps(dc,8)
ReleaseDC(MainForm.Handle,dc)

if width <=640 then
bgImageName:='640.bmp'

else if width<=800 then
bgImageName:='800.bmp'

else if width<=1024 then
bgImageName:='1024.bmp'

else if width<=1152 then
bgImageName:='1152.bmp'

else if width<=1280 then
bgImageName:='1280.bmp'

else
bgImageName:='1600.bmp'

ExtractTemporaryFile(bgImageName)
bgImage.bitmap.LoadFromFile(expandConstant('{tmp}\'+bgImageName))

SetWindowLong(MainForm.Handle,-16,$80000000)
ShowWindow(Mainform.Handle,SW_SHOWMAXIMIZED)
end;



2. пример Виктора Доброва из папки ...Inno Setup 5\Scripts\Dobrov\BackgroundImage.iss
читать дальше »
Код:

[Setup]
AppName=Background Image
AppVerName=Background Image
CreateAppDir=false

[Files]
Source: BackgroundImage.bmp; DestDir: embedded; Flags: dontcopy noencryption

[ Code]
function ShowWindow(hWnd, nCmdShow: LongWord): LongWord; external 'ShowWindow@user32.dll stdcall';

Procedure BackgroundOnActivate(Sender: TObject); Begin if WizardForm.Visible then WizardForm.Show End;

Procedure InitializeWizard;
var BackgroundForm: TForm; BackgroundImage: TBitmapImage;
        Begin
BackgroundForm:= TForm.Create(nil)
        BackgroundForm.BorderStyle:= bsNone
        BackgroundForm.OnActivate:= @BackgroundOnActivate;
        ShowWindow(BackgroundForm.Handle, sw_ShowMaximized)          // фоновое окно на полный экран
BackgroundImage:= TBitmapImage.Create(BackgroundForm)
        BackgroundImage.Align:= alClient
        BackgroundImage.Stretch:= True
ExtractTemporaryFile('BackgroundImage.bmp')
        BackgroundImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\BackgroundImage.bmp'))
        BackgroundImage.Parent:= BackgroundForm
end;


Ivan_009 11-04-2012 19:13 1897827

У кого есть isSlideShow v1.03 поделитесь пожалуйста нигде не могу найти..........

ARS_23 11-04-2012 20:37 1897857

Цитата:

Цитата Ivan_009
У кого есть isSlideShow v1.03 поделитесь пожалуйста нигде не могу найти »

открою тебе секрет: ты ее не найдешь и делиться с тобой вряд ли станут

valyok666 11-04-2012 22:04 1897898

Ivan_009, иди читай справку!мне надоедают люди которые много чего хотят а делать своими руками не хотят!! :diablo:
:diablo: :diablo:

El Sanchez 11-04-2012 22:08 1897899

Цитата:

Цитата Johny777
ты же используешь исдан. А это библиотека со скриптом, через который ты к ней обращаешься. Уберём лишнее. Получаем в конечном итоге библиотеку и конфликт который тебе хочется решить
Вывод: Директива AppMutex несовместима с библиотекой или со скриптом-настройкой к библиотеке. Если второе, то совет я тебе дал. Не помогло? Значит обратись к автору библиотеки. »

Johny777, не мучай человека, он абсолютно НЕ про IsDone говорит. :). Ему нужно при неудачной установке вызвать деинсталлятор, но с директивой AppMutex ничего не выйдет (скрин он представил), т.к. мьютекс еще не освобожден вызываемым приложением (сетапом).
sergey3695, нужно освободить мьютекс перед вызовом деинсталлятора, но для этого нужно знать его описатель, который Inno-шный CreateMutex не возвращает. Ничего страшного, экспортируем сами нужную функцию и заменим ею Inno-шную. У себя в скрипте напишите:
Код:

[Setup]
AppMutex=MyProgramMutexUniqueName

[code]
var
    hMutex: THandle;

function WINAPI_CreateMutex(lpMutexAttributes: Longint; bInitialOwner: BOOL; lpName: String): THandle; external 'CreateMutexA@kernel32.dll stdcall';
function ReleaseMutex(hMutex: THandle): BOOL; external 'ReleaseMutex@kernel32.dll stdcall';
function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall';

procedure InitializeWizard();
begin
  hMutex := WINAPI_CreateMutex(0, False, '{#SetupSetting("AppMutex")}');
end;
...
if (CurStep=ssPostInstall) and ISDoneError then begin
    ReleaseMutex(hMutex);
    CloseHandle(hMutex);
    Exec2(ExpandConstant('{uninstallexe}'), '/VERYSILENT', false);
end;


gezha78 11-04-2012 22:11 1897901

Цитата:

Цитата Ivan_009
У кого есть isSlideShow v1.03 »

Скачайте какой нибудь репак с торента где есть слайдшоу. запустите но ничиго не делайте. идите в папку C:\Documents and Settings\<User>\Local Settings\Temp и там ищите isSlideShow. Кстати дллка может находица в подпапках. Я таким образом много новинок скинул.

А так мвам никто не даст.

valyok666 11-04-2012 22:22 1897906

gezha78, легче Пуск->Выполнить->%temp%

Devils Night 11-04-2012 22:25 1897908

gezha78, valyok666, Эх, спалили всю контору, нельзя вас обоих брать в партизаны :diablo:.

valyok666 11-04-2012 22:28 1897911

Devils Night, Готовлюсь к :butcher: :shot:

Johny777 11-04-2012 23:25 1897942

sergey3695,
Серый
извини за мой тупизм.
Всё, что я тебе писал - ересь (кроме русской справки)
El Sanchez,
Спасибо! Развёл. Из-за моего неправильного рассуждения человек чуть не лишился желаемого.

Nestle_Nesquik 12-04-2012 09:48 1898104

Мне очень нужен уже готовый скрипт с музыкой и картинкой на весь экран, пожалуйста, добавьте эти скрипты в мой скрипт и выделите их красным цветом. Огромное спасибо!
P.S. Флуда мне не надо, мне нужен скрипт!

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[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={{9EF45819-0D12-4C3B-B2FA-FDA670E27623}
AppName=Fusion
AppVersion=3.51
;AppVerName=Fusion 3.51
DefaultDirName={pf}\Fusion
DefaultGroupName=Fusion 3.51
OutputBaseFilename=Установка приложения
Compression=lzma
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Users\(имя пользователя)\Desktop\Smart_Install_Maker\Fusion 3.51.exe"; DestDir: "{app}"; Flags: ignoreversion
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\Fusion"; Filename: "{app}\Fusion 3.51.exe"
Name: "{commondesktop}\Fusion"; Filename: "{app}\Fusion 3.51.exe"; Tasks: desktopicon

[Run]
Filename: "{app}\Fusion 3.51.exe"; Description: "{cm:LaunchProgram,Fusion}"; Flags: nowait postinstall skipifsilent

R.i.m.s.k.y. 12-04-2012 09:55 1898114

Nestle_Nesquik, здесь никто никому ничего не должен
Если тебе что-то нужно - делаешь сам
Для начинающих - все в шапке, все примеры картинок, музыки, надо всего лишь скачать + 3-4 чашки кофе
За тебя никто ничего делать не будет

Temyraz@fb 12-04-2012 10:36 1898140

друзья, у меня вот какая проблема. я понимаю возможно я не туда пишу это, но все же google мне не помог в поиске ответа, поэтому спрашиваю вас. через inno setup запуская батник с параметрами. в параметре передаются пароль и путь. если путь полностью на английском, то проблем нет, а если встречаются русские буквы то батник выдает ошибку. вот сам батник
Код:
Код:

CLS
ECHO OFF
For /F "tokens=*" %%k In (text.txt) Do For /F "tokens=*" %%j In ('Echo %%k') Do set PGBIN=%%j
SET PGPASSWORD=%1
SET DUMPPATH=%2
%~d0
CD %~dp0
SET DATETIME=%DATE:~6,4%-%DATE:~3,2%-%DATE:~0,2% %TIME:~0,2%-%TIME:~3,2%-%TIME:~6,2%
cd %PGBIN% .\pg_dump -i -h localhost -p 5432 -U postgres -c -Fc -f "%DUMPPATH%\sc.backup" "sc"
IF NOT %ERRORLEVEL%==0 GOTO Error
GOTO Successfull
:Error
DEL %DUMPPATH%
CHCP 1251
 MSG * "Ошибка при создании базы данных"
 GOTO End
 :End

вот эта значение SET DUMPPATH=%2 может иметь русский текст.
что посоветуете?
может как то можно в inno setupe это настроит? или в батнике в самом?
вот команда в inno
Код:

[Run]
 Filename: {src}\backupDB.bat; Parameters: "{code:GetPsqlPath} {code:SrcDir}"; Flags: shellexec runhidden waituntilterminated; Check: make_copy


Johny777 12-04-2012 11:06 1898160

Temyraz@fb,
боюсь бред говорю, но мне кажется тепе стоит попробовать скомпилировать скрипт на UNICODE версии. Попробуй!

Temyraz@fb 12-04-2012 11:14 1898168

а подробней можно?

YURSHAT 12-04-2012 11:24 1898173

Temyraz@fb, http://www.jrsoftware.org/download.p...ck-unicode.exe

R.i.m.s.k.y. 12-04-2012 11:34 1898179

Temyraz@fb, попробуй, но YURSHAT это не поможет, кодировка батника с русскими буквами должна быть СР866, ну и путь обязательно в кавыках.
А вот как в инно записать в батник в кодировке СР866 - я Х3

Temyraz@fb 12-04-2012 11:35 1898181

все равно не догнал вашей мысли(((

R.i.m.s.k.y. 12-04-2012 11:41 1898188

Temyraz@fb, гугель платный стал?
кодировка СР866 СР1251

El Sanchez 12-04-2012 18:16 1898430

Цитата:

Цитата Temyraz@fb
вот сам батник »

Temyraz@fb, не отработает, даже если в нужной кодировке сохранить, т.к. все неправильно написано. Да и сам батник не нужен, нужна лишь одна строчка с pg_dump в секции [Run].
Цитата:

Цитата Temyraz@fb
pg_dump -i -h localhost -p 5432 -U postgres -c -Fc -f "%DUMPPATH%\sc.backup" "sc" »

Красным выделенное - это что за параметр?

Temyraz@fb 13-04-2012 08:28 1898670

название базы

да я уже разобрался, я добавить в батник chcp 1251 и значение переменой DUMPPATH через inno setup изменил у bat файла. и система заработала

Temyraz@fb 13-04-2012 11:32 1898757

слушайте, а вообще возможно ли такое: при запуске bat
Код:

IF NOT %ERRORLEVEL%==0 GOTO Error
GOTO Successfull
:Error
DEL %DUMPPATH%
CHCP 1251
MSG * "Ошибка при создании базы данных"
GOTO End
:End

после вывода сообщения возвращалась в inno setup на определенную страницу?
просто получается что если пользователь указал место, куда батник должен сохранить базу, где не хватает памяти или нет права на запись...
p.s. размер базы можно вычислить только по psql запросом, а как через него записать в файле этот размер я не знаю, google тоже молчит в этом плане

Ivan_009 13-04-2012 18:32 1899000

Не подскажете в чем может быть проблема на XP определяет у меня Win7 32bit ... ps: Модуль HWREQ v.1.11 :o

Johny777 13-04-2012 19:31 1899021

Ivan_009,

попробуй через библиотеку сталкера
_______________________________________________________________
или через Ultimate Test в шапке

valyok666 13-04-2012 19:32 1899023

Ivan_009, Сам разбирайся!!! :read: :read:

YURSHAT 13-04-2012 21:51 1899114

Цитата:

Цитата Johny777
попробуй через библиотеку сталкера »

Этому примеру сто лет и он кривой. Зачем спрашивается определять процессор через реестр если можно вызвать это из библиотеки? Отсутствует проверка ОС, так как этот пример писался под первую версию библы, в третьей которая в архиве уже есть функция проверки Оси. Нет удаления пробелов в названии процессора....

Johny777 14-04-2012 00:52 1899220

YURSHAT,
ну тогда Ultimate Test. Я в них не разбираюсь, тк не использую. Просто выложил что было.

R.i.m.s.k.y. 14-04-2012 06:49 1899280

YURSHAT, а эта либа у разогнанных сандиков частоту правильно определяет?

YURSHAT 14-04-2012 08:29 1899300

R.i.m.s.k.y., ну она определяет все через реестр, так же как и Ultimate Test. Но ее плюс, что не нужно копатся в реестре, тем самым портянка будет в разы короче :) Да и проще ведь вызвать функцию из библы нежели извращатся с реестром. К тому же через нее можно определять ЖД, то есть их колличество, размер, доступное место...
Цитата:

Цитата R.i.m.s.k.y.
а эта либа у разогнанных сандиков частоту правильно определяет? »

Ну можешь в шапке скачать скрипт Undercover, запустить и посмотреть :) Я в скрипте именно эту библу использовал..


Цитата:

Цитата Johny777
ну тогда Ultimate Test »

Ну не обязательно :) Опять же повторюсь, в Undercover'e можно глянуть, как правильно эту библу юзать. Отличие в использовании библы и того же Ultimate Test, в сокращении объема работы и уменьшение размера скрипта...

R.i.m.s.k.y. 14-04-2012 08:49 1899309

YURSHAT, из известных мне прог только цпу-зет умеет определять частоту сандиков, а она выплевывать полученную частоту из себя не умеет
цимес в том что штеуд чегой-то там так завертовал что определить реальную частоту не увех получается даже в биосе, а в винде надо ставить дарйвер

Johny777 14-04-2012 15:42 1899535

Цитата:

Цитата YURSHAT
К тому же через нее можно определять ЖД »

видел
Цитата:

Цитата Лександер
Скрипт для вывода данных о винтах - слегка правленный вариант от YURSHAT(требует get_hw_caps.dll): »

помимо того что короче чем лучше этого (...\Inno Setup 5\Scripts\Dobrov\DisksInfoBox.iss)?
читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
EnableDirDoesntExistWarning=true

[CustomMessages]
Ru.SysDirSelect=Выбранный путь включает в себя системную папку!%nВы уверены, что необходимо продолжать установку?

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

[Icons]
Name: {group}\Notepad; Filename: notepad.exe

[  Code]
var n: Integer; FreeMB, TotalMB: Cardinal; VolumeName, FileSystemName: String; VolumeSerialNo, MaxComponentLength, FileSystemFlags: Longint; ListBox: TListBox; StartMenuTreeView: TStartMenuFolderTreeView;

const oneMB= 1024*1024;
function GetLogicalDrives: DWord; external 'GetLogicalDrives@kernel32.dll stdcall';
function GetDriveType(nDrive: String): Longint; external 'GetDriveTypeA@kernel32.dll stdcall';
function GetVolumeInformation(PathName,VolumeName: PChar; VolumeNameSize,VolumeSerialNumber,MaxComponentLength,FileSystemFlags: Longint; FileSystemName: PChar; FileSystemNameSize: Longint): Longint; external 'GetVolumeInformationA@kernel32.dll stdcall';
function MessageBox(hWnd: Integer; lpText, lpCaption: String; uType: Cardinal): Integer; external 'MessageBoxA@user32.dll stdcall';

Function ByteOrTB(Bytes: Extended; noMB: Boolean): String; { Перевод числа в значение бт/Кб/Мб/Гб/Тб (до 3х знаков после запятой)}
Begin
        if not noMB then Result:= FloatToStr(Int(Bytes)) +' Мб' else
                if Bytes < 1024 then Result:= FloatToStr(Int(Bytes)) +' Бт' else
                        if Bytes/1024 < 1024 then Result:= FloatToStr(round((Bytes/1024)*10)/10) +' Кб' else
                                If Bytes/oneMB < 1024 then Result:= FloatToStr(round(Bytes/oneMB*100)/100) +' Мб' else
                                        If Bytes/oneMB/1000 < 1024 then Result:= FloatToStr(round(Bytes/oneMB/1024*1000)/1000) +' Гб' else
                                                Result:= FloatToStr(round(Bytes/oneMB/oneMB*1000)/1000) +' Тб'
        StringChange(Result, ',', '.')
End;

Function DelSP(String: String): String; { Удаление начальных, конечных и повторных пробелов }
        Begin        while (Pos('  ', String) > 0) do Delete(String, Pos('  ', String), 1); Result:= Trim(String); End;

Function CutString(String: String; MaxLength: Longint): String; { Обрезать строку до заданного кол-ва символов}
        Begin
                if Length(String) > MaxLength then Result:= Copy(String, 1, 6) +'...'+ Copy(String, Length(String) - MaxLength +9, MaxLength)
                else Result:= String;
        End;

Procedure GetDiskInfo(Disk: String);
        Begin
                FileSystemName:= StringOfChar(' ', 32); VolumeName:= StringOfChar(' ', 256);
                        GetVolumeInformation(Disk, VolumeName, 255, VolumeSerialNo, MaxComponentLength, FileSystemFlags, FileSystemName, 31);
                FileSystemName:= DelSp(FileSystemName); VolumeName:= DelSp(VolumeName); if VolumeName='' then VolumeName:='без метки';
        End;

Procedure ListBoxRefresh;        var FreeB, TotalB: Cardinal; Path, String: string; Begin
        ListBox.Items.Clear
for n:= 1 to 31 do        // диск 'А' пропустить
        if (GetLogicalDrives and (1 shl n)) > 0 then
                if (GetDriveType(Chr(ord('A') + n) +':\') = 2) or (GetDriveType(Chr(ord('A') + n) +':\') = 3) then
                        if GetSpaceOnDisk(Chr(ord('A') + n) +':\', True, FreeMB, TotalMB) then ListBox.Items.Add(Chr(ord('A') + n) +':');
for n:= 0 to ListBox.Items.Count -1 do begin
        Path:= Copy(ListBox.Items[n],1,2) +'\'                { если в накопителе нет диска, пропустить обновление }
        if GetSpaceOnDisk(Path, False, FreeB, TotalB) and GetSpaceOnDisk(Path, True, FreeMB, TotalMB) then begin GetDiskInfo(Path);
                if FreeB >= $7FFFFFFF then String:= PadL(ByteOrTB(FreeMB*oneMB, true),10) else String:= PadL(ByteOrTB(FreeB, true),10);
                if TotalB >= $7FFFFFFF then begin TotalB:= TotalMB; FreeB:= FreeMB; String:= PadL(ByteOrTB(TotalMB*oneMB, true),11) +' всего| '+ String end else String:= PadL(ByteOrTB(TotalB, true),11) +' всего| '+ String;
        ListBox.Items[n]:= Copy(Path,1,2) + String + PadL(FloatToStr(round(FreeB/TotalB*100)),3)+ '% своб|'+ PadL(FileSystemName,5)+ '| '+ CutString(VolumeName,9); end; end;
End;

Procedure ObjectOnClick(Sender: TObject); Begin
Case TObject(Sender) of
        ListBox:        for n:= 0 to ListBox.Items.Count-1 do if ListBox.Selected[n] then WizardForm.DirEdit.Text:= Copy(ListBox.Items[n],1,1) +Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text))
        StartMenuTreeView:        if StartMenuTreeView.Directory <> '' then WizardForm.GroupEdit.Text:= StartMenuTreeView.Directory else WizardForm.GroupEdit.Text:= '{#SetupSetting("DefaultGroupName")}'
        WizardForm.NoIconsCheck:        begin WizardForm.GroupEdit.Enabled:= not(WizardForm.GroupEdit.Enabled); StartMenuTreeView.Enabled:= WizardForm.GroupEdit.Enabled; WizardForm.GroupBrowseButton.Enabled:= WizardForm.GroupEdit.Enabled end;
end; End;

Function NextButtonClick(CurPageID: Integer): Boolean; Begin
        Result:= True
        if (CurPageID = wpSelectDir) and (Pos(Uppercase(ExpandConstant('{win}')), Uppercase(ExpandConstant('{app}'))) > 0) then Result:= MessageBox(StrToInt(ExpandConstant('{wizardhwnd}')), ExpandConstant('{cm:SysDirSelect}'), 'Установка в системную папку', MB_YESNO or $30) = idYes;
End;

Procedure CurPageChanged(CurPageID: Integer);
Begin
        if CurPageID = wpSelectDir then ListBoxRefresh
End;

Procedure InitializeWizard;
Begin
        ListBox:= TListBox.Create(WizardForm)
                ListBox.SetBounds(WizardForm.DirEdit.Left, WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 8, WizardForm.DirBrowseButton.Left + WizardForm.DirBrowseButton.Width - WizardForm.DirEdit.Left, WizardForm.DiskSpaceLabel.Top - (WizardForm.DirEdit.Top + WizardForm.DirEdit.Height + 12))
                ListBox.Font.Size:= 9
                ListBox.Font.Style:= [fsBold]
                ListBox.Font.Name:= 'Courier New';
                ListBox.OnClick:= @ObjectOnClick;
                ListBox.Parent:= WizardForm.SelectDirPage;
        WizardForm.NoIconsCheck.SetBounds(WizardForm.DiskSpaceLabel.Left + 96, WizardForm.DiskSpaceLabel.Top + 1, WizardForm.NoIconsCheck.Width, WizardForm.NoIconsCheck.Height)
                WizardForm.NoIconsCheck.OnClick:= @ObjectOnClick
                WizardForm.NoIconsCheck.Parent:= WizardForm.SelectProgramGroupPage
                WizardForm.NoIconsCheck.Show
        StartMenuTreeView:= TStartMenuFolderTreeView.Create(WizardForm)
                StartMenuTreeView.SetPaths(ExpandConstant('{userprograms}'), ExpandConstant('{commonprograms}'), ExpandConstant('{userstartup}'), ExpandConstant('{commonstartup}'));
                StartMenuTreeView.SetBounds(ListBox.Left, ListBox.Top, ListBox.Width, ListBox.Height)
                StartMenuTreeView.Parent:= WizardForm.SelectProgramGroupPage
                StartMenuTreeView.Cursor:= crHand
                StartMenuTreeView.OnChange:=@ObjectOnClick
End;


LinkOFF 14-04-2012 20:26 1899715

R.i.m.s.k.y.,
так Everest еще определяет

R.i.m.s.k.y. 14-04-2012 21:19 1899744

LinkOFF, вот и как его с инно скрестить?

Johny777 14-04-2012 22:27 1899808

Цитата:

Цитата Ivan_009
справкой можно попе подтирати »

ну всё Ваня :)
Готовся.
Вопросы человека начитавшего справку легко распознать и если такой возникнет отвечать не буду.
Будешь у меня справочку читать как миленький!

valyok666 14-04-2012 22:52 1899840

Ivan_009, Ты по-русски сначало писать научись!Если ещё читать не умеешь это твои проблемы!Смотри чтобы от тебя,как и от VASYAKRN отвернутся и твои сообщения будут пустым местом для всех!Или проще тебя заблокируют на форуме :read: :closed-to

Цитата:

Цитата Ivan_009
Johny77 да ладно я не те бе а как можно сис тр по иначе реи зов ну ты пон я над если ты не бот.... »

Мне противно когда так ковыркают язык стыд и позор :angry:

Johny777 14-04-2012 23:07 1899845

Ivan_009,
Ванюша
Цель, чтоб ты научился, а не готовое хапнул
Да. Мои знания скудны, но я с удовольствием их передам, но не лентяю :yes:

R.i.m.s.k.y. 14-04-2012 23:14 1899848

Цитата:

Цитата Johny777
Мои знания скудны, но я с удовольствием их передам, но не лентяю »

как и все здешние камрадцы подписанные на эту ветку

Gnom_aka_Lexander 14-04-2012 23:15 1899849

Цитата:

Цитата Johny777
чем лучше этого »

Его гораздо проще заставить под юникодом работать

Gnom_aka_Lexander 14-04-2012 23:57 1899875

Ivan_009, Алкогольное опьянение не может быть извиняющим фактором, а является отягчающим обстоятельством - не можешь держать себя в руках - не пей. не можешь не пить - сходи к наркологу, он поможет.

valyok666 15-04-2012 01:44 1899910

Ivan_009, isUtils не пробЫвал?

Johny777 15-04-2012 02:07 1899916

Ivan_009,
как говорилось
Цитата:

Цитата Johny777
Я в них не разбираюсь, тк не использую »

последуй совету
Цитата:

Цитата YURSHAT
в Undercover'e можно глянуть, как правильно эту библу юзать. Отличие в использовании библы и того же Ultimate Test, в сокращении объема работы и уменьшение размера скрипта... »

http://forum.ru-board.com/topic.cgi?...57&start=780#9

LinkOFF 15-04-2012 02:26 1899919

R.i.m.s.k.y., я же не знал что нужно с inno его скрещивать

Подскажите как в секции [Files] добавить папки с файлами, а то добовляются одни файлы а папки нет

Johny777 15-04-2012 02:50 1899924

LinkOFF,
Справка (http://sendfile.su/570136 ) ----> "Секция скриптов" ----> "Секция [Files]"

LinkOFF 15-04-2012 03:03 1899926

Johny777, Че-то я там не нашел.Там только для файлов написано, а мне для папок нужно

valyok666 15-04-2012 03:16 1899927

LinkOFF, поподробнее объясни что надо тебе

LinkOFF 15-04-2012 03:25 1899928

Мне нужно чтоб вместе с файлами добавлялись и папки(секция Files).Например у меня есть папка и в ней находятся папки и файлы, но добавляются только файлы(D:\папка\файлы.*) а папки (D:\папка\папка) не добавляются.Как-то вот так

Johny777 15-04-2012 03:42 1899929

LinkOFF,
Source: Files\*; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs sortfilesbyextension
флаги там же почитай обязательно (все, чтобы иметь представление)

LinkOFF 15-04-2012 03:52 1899930

Johny777, вот прям только что нашел в секции "Подборка полезных примеров"

R.i.m.s.k.y. 15-04-2012 07:26 1899948

LinkOFF, есть секция [Dirs]
Код:

[Dirs]
Name: "{app}\data"
Name: "{app}\bin"


alert30 15-04-2012 08:59 1899966

Цитата:

Цитата R.i.m.s.k.y.
LinkOFF, есть секция [Dirs] »

R.i.m.s.k.y., спасибо. Кнопочка "Полезное сообщение" исчез.

R.i.m.s.k.y. 15-04-2012 09:08 1899967

alert30, а) обнови страницу б) вычисти кеш браузера в) выдерни шнур выдави стекло

ivsatel 15-04-2012 11:58 1900015

Подскажите пожалуйста как решить такую задачу. Мне нужно вот, что:

1) перед установкой убить процесс
2) внести изменения в реестр
3) запустить процесс

Процесс ctfmon.exe через taskkill /T /IM ctfmon.exe не убивается почему то, а строки реестра находящиеся в секции [Registry] получается (Исходя из последовательности прочтения секций во время инсталляции. ) вносятся до того как процесс ctfmon.exe будет убит по средствам секции [Run] (хотя не убивается).

R.i.m.s.k.y. 15-04-2012 13:27 1900062

Цитата:

Цитата ivsatel
процесс ctfmon.exe будет убит по средствам секции [Run] »

фурсенка негодуэ одобряэ!!11


предлагаешь здесь присутствующим пасхальные гадания на скрипт? ню-ню

Johny777 15-04-2012 13:42 1900073

ivsatel,
1 способ
читать дальше »
Код:

function InitializeSetup(): Boolean;
var  ErrorCode: Integer;
begin
    Exec('taskkill', '/f /im process.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode); 
    Result := True;
end;

тот же способ через RUN
Код:

[Run]
Filename: taskkill; Parameters: /f /t /im steam.exe; Flags: runhidden


и
2 способ через библиотеку ISTask.dll
читать дальше »
Код:

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

[Files]
Source: "ISTask.dll"; DestDir: "{app}"

[  Code]

function KillTaskA(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall delayload uninstallonly';

function RunTaskA(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall delayload uninstallonly';



function InitializeUninstall(): Boolean;
begin
If RunTaskA('hl2.exe', false) then
begin
if MsgBox('Программа установки русификатора обнаружила, что программа'#13'для которой установится русификатор запушена в данный момент. '#13#13' Закрыть программу?'#13#13 +
'"Да" - закроет и не сохранит измененные настройки в программе.' #13#13 +
'"Нет" - продолжит установку без закрытия. (Настоятельно рекомендуется нажать Да)', mbError, mb_YesNo) = idYes then
begin
KillTaskA('hl2.exe');
Result := True;
end else
Exit;
end;
Result := True;
begin
If RunTaskA('hl2.exe', false) then
begin
KillTaskA('hl2.exe');
Result := True;
end else
Exit;
end;
end;


R.i.m.s.k.y. 15-04-2012 13:48 1900079

Johny777, 1 способ не работает, выше же написано
2 способ вызывает WMI если мне склероз не изменяет, и на сборочных виндах или допиленных ускорителями WMI крашится

Поэтому и нужен скрипт чтобы увидеть конкретно чего не идет

Johny777 15-04-2012 13:51 1900082

R.i.m.s.k.y.,
Странно. Его и использую через RUN. Способ рабочий. Ну ладно.

R.i.m.s.k.y. 15-04-2012 13:53 1900086

Johny777, не удивлюсь если ctfmon.ехе написан через русскую Е или О

Johny777 15-04-2012 14:00 1900088

R.i.m.s.k.y.,
после завершения процесса Steam.exe в трее висит иконка, хотя процесс уже завершён. Это фигня конечно, но кого-то может смутить

R.i.m.s.k.y. 15-04-2012 14:02 1900090

Johny777, это баг венды еще с вин95 :)
курсор наведи и она исчезнет

ivsatel 15-04-2012 16:23 1900143

Johny777, Спасибо. Через функцию получилось.

ivsatel 16-04-2012 19:54 1900929

Еще вопрос. Как связать функцию (в коде) и секцию Tasks ? То есть, что-бы функция отрабатывала только если выбрано определенное задание из Tasks.

R.i.m.s.k.y. 16-04-2012 20:06 1900935

ivsatel,
Код:

[Tasks]
Name: avs; Description: AviSynth 2.5.8 MT; GroupDescription: Дополнительные компоненты

[*Code]
....
if (IsTaskSelected('avs')) then ...


ivsatel 16-04-2012 20:36 1900953

Делаю видимо не правильно)

Код:

if (IsTaskSelected('hidctf')) then

function DeInitializeSetup(): Boolean;
var  ErrorCode: Integer;
begin
    Exec((ExpandConstant('{tmp}\LP.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode));
    Result := True;
end;


R.i.m.s.k.y. 16-04-2012 21:01 1900964

ivsatel, конечно неправильно
Код:

function DeInitializeSetup(): Boolean;
var  ErrorCode: Integer;
begin
if (IsTaskSelected('hidctf')) then begin
    Exec((ExpandConstant('{tmp}\LP.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode));
    Result := True;
end;
end;


ivsatel 16-04-2012 21:21 1900972

Выделяет строчку:
Код:

Exec((ExpandConstant('{tmp}\LP.exe', '', SW_Hide, ewWaitUntilTerminated, ErrorCode));
со словами:
Invalid number of parameters.
Почему?

R.i.m.s.k.y. 16-04-2012 21:23 1900976

ivsatel, потому что неправильное число параметров - пропущена рабочая папка
и скобка не там закрыта
Exec(ExpandConstant('{tmp}\LP.exe'), '', ExpandConstant('{tmp}'), SW_Hide, ewWaitUntilTerminated, ErrorCode);

если тебе не ясно что функция делает - почитай в справке про нее
в шапке есть русская справка
а скобки наобум лепить и потом спрашивать "почемуу?" - это не выход

Johny777 18-04-2012 15:24 1901890

Может у кого есть пример текстурирования кнопок через .bmp как в инсталле Ведьмака 2?
или это тоже что и в Example_MouseEvent_ImgBtn.iss в папке Examples?


вот пример кнопок из инсталла, если поможет


vitl 18-04-2012 17:28 1901981

Добрый день.
Просьба подсказать, почему не копируются скрытые файлы из папки 'upd\Utils\' (какого атрибута не хватает)?
Код:

Source: {src}\upd\Utils\*; DestDir: {app}\Utils\; BeforeInstall: ChangeCaption('\Utils\'); Flags: ignoreversion recursesubdirs createallsubdirs external

R.i.m.s.k.y. 18-04-2012 17:36 1901986

vitl, это фишка Инно
нужно прямо указывать файлы, тогда подхватит
если указывать по маске - скрытые и системный файлы не берет
Нет, это удобно для всяких svn, ибо они раскидыавют по подпапками свои системный файлы, которые в компиляцию войти не должны

Johny777 18-04-2012 19:27 1902044

Цитата:

Цитата Johny777
пример текстурирования кнопок »

разобрался
мне хватит примера из шапки
вот образец-текстура кому надо (на глаз сделал для теста)

YURSHAT 18-04-2012 20:08 1902066

Johny777, есть болле продвинутый вариант текстуринга кнопочек, а именно с четырьма состояниями то есть присутствует событие и при наведении мышки на кнопку. Пример от товарища Shegorat.
Пример
Код:

[Setup]
;Используется текстура размером 320х23, где размер одной кнопки 80х23
AppName=Test
AppVerName=Test
DefaultDirName={pf}\Test
OutputDir=userdocs:Test.

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

[Files]
;Изображение размером 320х23
Source: button2.bmp; DestDir: {tmp}; Flags: dontcopy
[Code ]
const
ButtonWidth = 80;
ButtonHeight = 23;

var
WizardLabel: TLabel;
ButtonPanel: array of TPanel;
ButtonImage: array of TBitmapImage;
ButtonLabel: array of TLabel;
UsedButtons: array of TButton;
ButtonsCount: Integer;

procedure ButtonLabelClick(Sender: TObject);
var Button: TButton; n, i: Integer;
begin
i:= TLabel(Sender).Tag; ButtonImage[i].Left:= 0
for n:=0 to (ButtonsCount-1) do begin
if i = n then Button:= UsedButtons[n];
end;
Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n, I: Integer;
begin
I:=TLabel(Sender).Tag;
//Сначала восстанавливаем картинку у всех кнопок, так надо иначе могут быть глюки
for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end;
//Теперь собственно ставим нужную картинку
if (ButtonLabel[i].Enabled)and(ButtonImage[i].Left <> -ButtonWidth*2) then begin ButtonImage[i].Left:= -ButtonWidth; end;
end;

procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n: Integer;
begin
//Т.к Sender'ом выступает WizardLabel то не получится испльзовать индекс кнопки
for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end;
end;

procedure LoadButtonImage(AButton: TButton);
var n: Integer;
begin
n:=ButtonsCount; SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1); SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1); UsedButtons[n]:= AButton;

ButtonPanel[n]:=TPanel.Create(WizardForm)
ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height)
ButtonPanel[n].Tag:= n
ButtonPanel[n].Enabled:= AButton.Enabled
ButtonPanel[n].Parent:=AButton.Parent

ButtonImage[n]:=TBitmapImage.Create(WizardForm)
ButtonImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(320), ScaleY(23))
ButtonImage[n].Enabled:=False
ButtonImage[n].Bitmap.LoadFromFile(ExpandConstant('{tmp}\Button2.bmp'))
ButtonImage[n].Parent:=ButtonPanel[n]

with TLabel.Create(WizardForm) do begin
Tag:=n
Parent:=ButtonPanel[n]
Width:=AButton.Width
Height:=AButton.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseMove:=@ButtonLabelMove
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end

ButtonLabel[n]:=TLabel.Create(WizardForm)
ButtonLabel[n].Autosize:=True
ButtonLabel[n].Alignment:=taCenter
ButtonLabel[n].Tag:=n
ButtonLabel[n].Enabled:= AButton.Enabled
ButtonLabel[n].Transparent:=True
ButtonLabel[n].Font.Color:=clWhite
ButtonLabel[n].Caption:=AButton.Caption
ButtonLabel[n].OnClick:=@ButtonLabelClick
ButtonLabel[n].OnDblClick:=@ButtonLabelClick
ButtonLabel[n].OnMouseMove:=@ButtonLabelMove
ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown
ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp
ButtonLabel[n].Parent:=ButtonPanel[n]

ButtonsCount:= ButtonsCount+1
end;

procedure UpdateButtons();
var n: Integer;
begin
for n:=0 to ButtonsCount-1 do begin
ButtonLabel[n].Caption:=UsedButtons[n].Caption
ButtonPanel[n].Visible:=UsedButtons[n].Visible
if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0;
ButtonLabel[n].Enabled:= UsedButtons[n].Enabled;
ButtonPanel[n].Enabled:= UsedButtons[n].Enabled;
//Ставим Left и Top лейбла соразмерно размеру лейбла
ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку активной
WizardForm.NextButton.Enabled:= True;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
//Делаем кнопку неактивной
WizardForm.NextButton.Enabled:= False;
//Обновляем текстурированную кнопку (обновляем активность и текстуру)
UpdateButtons()
end;

procedure InitializeWizard();
begin
WizardLabel:= TLabel.Create(WizardForm)
WizardLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(WizardForm.Width), ScaleY(WizardForm.Height))
WizardLabel.Transparent:= True;
WizardLabel.AutoSize:=false;
WizardLabel.OnMouseMove:=@WizardLabelMove
WizardLabel.Parent:= WizardForm;

WizardForm.BackButton.Width:= ButtonWidth
WizardForm.BackButton.Height:= ButtonHeight

WizardForm.NextButton.Width:= ButtonWidth
WizardForm.NextButton.Height:= ButtonHeight

WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:= ButtonHeight

WizardForm.DirBrowseButton.Left:=ScaleX(337)
WizardForm.DirBrowseButton.Width:= ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight

WizardForm.GroupBrowseButton.Left:=ScaleX(337)
WizardForm.GroupBrowseButton.Width:= ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick

WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button2.bmp')
LoadButtonImage(WizardForm.BackButton)
LoadButtonImage(WizardForm.NextButton)
LoadButtonImage(WizardForm.CancelButton)
LoadButtonImage(WizardForm.DirBrowseButton)
LoadButtonImage(WizardForm.GroupBrowseButton)
end;

procedure CurPageChanged(CurPageID: Integer);
begin
UpdateButtons()
end;


Johny777 19-04-2012 00:50 1902226

EvilAlex,
на этой странице скрипт и текстура-пример для текстурирования кнопок
попробуй сам добавить для начала
а в твоём скрипте картинка и так есть...
и зачем столько раз RedesignWizardForm в процедуре;
это своего рада дубликатор отвечающий за вставку всего из процедуры RedesignWizardForm в InitializeWizard()
а у тебя она одна
Ты используешь расширенную версию. Там же легко вставлять картинки.


YURSHAT,
спасибо тебе большое
это ещё лучше

кнопки так расположены
;обычное состояние - при наведении - при нажатии - заблокировано
пример текстуры для 4-х состояний кому надо

Temyraz@fb 19-04-2012 11:07 1902375

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

p.s. и еще не сильно сложно как производить поиск записи в реестре?

Johny777 19-04-2012 12:43 1902419

Цитата:

Цитата Temyraz@fb
при запуске система должна считать в реестре запись »

пример поиска записи (и файлов) для 32 и 64 битной системы на этапе инициализации (InitializeSetup).
читать дальше »
Код:

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg

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

[_Code]
function InitializeSetup: Boolean;
begin
    Result:=true;
if not iswin64 the begin
 if not ((RegKeyExists(HKLM, 'SOFTWARE\MyProg'))
    and (FileExists('C:\Program Files\MyProg\1.exe'))
    and (FileExists('C:\Program Files\MyProg\2.dll'))
    and (FileExists('C:\Program Files\MyProg\3.ocx')))
then
begin
    MsgBox('Не найдены необходимые компоненты.', mbInformation, MB_OK);
    Result:=false; 
  end;
end; //not iswin64
if iswin64 the begin
  if not ((RegKeyExists(HKLM64, 'SOFTWARE\SYSWOW64\MyProg'))
    and (FileExists('C:\Program Files\MyProg\1.exe'))
    and (FileExists('C:\Program Files\MyProg\2.dll'))
    and (FileExists('C:\Program Files\MyProg\3.ocx')))
then
begin
    MsgBox('Не найдены необходимые компоненты.', mbInformation, MB_OK);
    Result:=false;
  end;
end; //iswin64
end;


Цитата:

Цитата Temyraz@fb
я хочу их объединить »

как?
авторан?

Temyraz@fb 19-04-2012 13:01 1902426

у меня есть два интерполятора(в .iss) только один выполняет установку с нуля, а второй обновляет. я хочу чтоб при наличии в реестре записи установка шла по шагам обновления, а если нет то по шагам установки.
поиск в реестре сделал такой:
Код:

[_Code]
function InitializeSetup(): Boolean;
var errCode, n: Integer; RegExe, isKey: String; Keys: TArrayOfString;
begin
RegExe:= AddBackslash(GetSystemDir) + 'reg.exe'
  if FileExists(RegExe) then begin MsgBox('SC' #13#10 'sc не установлено?', mbConfirmation, MB_YESNO); Exit end;
        isKey:= 'HKLM\Software\IVT\SC\{#MyAppVer}.{#MyAppPatch}'
  if Result = False then
    MsgBox('InitializeSetup:' #13#13 'Ok, bye bye.', mbInformation, MB_OK);
end;


Johny777 19-04-2012 13:52 1902463

Temyraz@fb,
так попробуй (собрал из примеров)
Код:

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg

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

[  Code]
function InitializeSetup: Boolean;
begin
  if RegKeyExists(HKEY_CURRENT_USER, 'Software\Jordan Russell\Inno Setup') or    /// ключ 1 или ключ 2 есть, то
    RegKeyExists(HKEY_CURRENT_USER, 'Software\Jordan Russell\Inno Setup 2')
  then
    begin
      if MsgBox('Болт в процессе отпиливания !' + #10#13 +
                'Хочешь попытаться навинтить?', mbError, MB_YESNO) = idYes
        then
        /// Ответ "Да". Устанавливаем обновление. Здесь действие
      else
    end
    else
    begin
      if MsgBox('Ты действительно хочешь навинтить?', mbError, MB_YESNO) = idYes
        then
        /// устанавливаем всё целиком
      else
    end;
end;

я не совсем догоняю кто должен решать какой из установщиков запустить

Temyraz@fb 19-04-2012 14:34 1902507

вот смотри:
Код:

[  Code]
function InitializeSetup: Boolean;
begin
  if RegKeyExists(HKEY_CURRENT_USER, 'Software\Jordan Russell\Inno Setup') or    /// ключ 1 или ключ 2 есть, то
    RegKeyExists(HKEY_CURRENT_USER, 'Software\Jordan Russell\Inno Setup 2')
  then
    begin
      if MsgBox('Болт в процессе отпиливания !' + #10#13 +
                'Хочешь попытаться навинтить?', mbError, MB_YESNO) = idYes
        then
        ///запускается обновление(процесс обновления содержит свой набор [Files] [Run] [Components] и свою последовательность [_Code] )
      else
    end
    else
    begin
      if MsgBox('Ты действительно хочешь навинтить?', mbError, MB_YESNO) = idYes
        then
        //////запускается установки(процесс установки содержит свой набор [Files] [Run] [Components] и свою последовательность [_Code] )
      else
    end;
end;

страницы install очень различаются между собой. поэтому в этом и проблема у меня

извините если скажу сейчас полный бред.
а можно ли так сделать: написать отдельный iss в котором будет установка по одному типу, а в другом его вызвать?
т.е. сделать условия, если выполняется такое условие то запустить по 1.iss а если нет то по 2.iss

Devils Night 19-04-2012 14:49 1902525

Имеется в скрипте вот что:
читать дальше »
Код:

[Components]
Name: A; Description: Program; Types: full; Flags: exclusive
Name: A/A; Description: Program a; Types: custom
Name: A/B; Description: Program b; Types: custom

[Files]
Source:Program_a\*; DestDir: {app}\Program_a\; Flags: recursesubdirs createallsubdirs; Components: A/A
Source:Program_b\*; DestDir: {app}\Program_b\; Flags: recursesubdirs createallsubdirs; Components: A/B

[Registry]
Root: HKLM; SubKey: SOFTWARE\Program_a; ValueType: dword; Components: A/A
Root: HKLM; SubKey: SOFTWARE\Program_b; ValueType: dword; Components: A/B


Как сделать так чтобы инсталлятор при определении ключа HKEY_LOCAL_MACHINE\SOFTWARE\Program_X одного из компонентов не устанавливал компонент, т.е если в реестре присутствует например HKEY_LOCAL_MACHINE\SOFTWARE\Program_а, то собственно и компонент Program a не устанавливался?

Johny777 19-04-2012 15:03 1902540

Цитата:

Цитата Temyraz@fb
если выполняется такое условие то запустить по 1.iss а если нет то по 2.iss »

1. сделать авторан который в зависимости от ключа реестра запускает один из инсталлов
этот же код выше может играть такую роль. Даже страницы не нужны
2. показывать определённые настройки в зависимости от... (пример ниже) кнопок
читать дальше »

Код:

[Setup]
AppName=My Program
AppVerName=My Program
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputBaseFilename=setup
OutputDir=.

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

[Icons]
Name: {group}\{cm:UninstallProgram,My Program}; Filename: {uninstallexe}

[CustomMessages]
HeaderLabelPage=Выберите тип установки
MyRadioCaption_1=Обычная установка
MyRadioCaption_2=Портативная установка

[  code]
var
  MyNewPage: TWizardPage;
  MyRadioBtn_1, MyRadioBtn_2: TRadioButton;

procedure GetMyNewPage();
begin
  MyNewPage := CreateCustomPage(wpWelcome,
    ExpandConstant('{cm:HeaderLabelPage}'), '');

  MyRadioBtn_1 := TRadioButton.Create(WizardForm);
  with MyRadioBtn_1 do
  begin
    Top := ScaleY(50);
    Width := ScaleX(150);
    Height := ScaleY(13);
    Caption := ExpandConstant('{cm:MyRadioCaption_1}');
    Checked := True;
    Parent := MyNewPage.Surface;
  end;

  MyRadioBtn_2 := TRadioButton.Create(WizardForm);
  with MyRadioBtn_2 do
  begin
    Top := ScaleY(120);
    Width := ScaleX(150);
    Height := ScaleY(13);
    Caption := ExpandConstant('{cm:MyRadioCaption_2}');
    Parent := MyNewPage.Surface;
  end;
end;

procedure InitializeWizard();
begin
  GetMyNewPage();
end;


3. есть пример запуска инсталла с параметрами командной строки
например для компонетов
setup.exe/COMPONENTS="help,plugins" , где help,plugins это компоненты, но минус в том, что пользователь потом может изменить выбор

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,

Devils Night,
вот пример для одного компонента; Check: Skip
читать дальше »
Код:

; -- Components.iss --
; Demonstrates a components-based installation.

; SEE THE DOCUMENTATION FOR DETAILS ON CREATING .ISS SCRIPT FILES!

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
OutputDir=userdocs:Inno Setup Examples Output

[Types]
Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom

[Components]
Name: "program"; Description: "Program Files"; Check: Skip
Name: "help"; Description: "Help File"

[ Code]
function Skip:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If RegKeyExists(HKEY_CURRENT_USER, 'Software\Jordan Russell\Inno Setup') then
  Result:=False
end;
end;


Devils Night 19-04-2012 15:52 1902582

Цитата:

Цитата Johny777
вот пример для одного компонента; Check: Skip »

:up
А если два компонента, то нужно так сделать?:
читать дальше »
Код:

[ Code]
function Skip:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Programs') then
  Result:=False
end;
end;


function Skip2:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Programs2') then
  Result:=False
end;
end;


Я ничего не перепутал?

Johny777 19-04-2012 15:59 1902590

Devils Night,
всё правильно

[Components]
Name: "program"; Description: "Program Files"; Check: Skip
Name: "help"; Description: "Help File"; Check: Skip2

Ivan_009 19-04-2012 22:30 1902820

Как перенести эту кнопку в это место и скрыть ее на первой и последней странице зараннее благодарю за помощь...

Johny777 20-04-2012 01:40 1902894

Ivan_009,
а самому попробовать не судьба?
систему координат в школе проходил?
иксы и игрики всякие?

координаты чего-то можно записать 2-мя способами
1. SetBounds(ScaleX(300), ScaleY(100), ScaleX(140), ScaleY(22));
.........................слева...........сверху.........ширина..........высота....
2.
Left := ScaleX(0);
Top := ScaleY(24056);
Width := ScaleX(185);
Height := ScaleY(73);

только всегда через ScaleX и ScaleY !

Ivan_009 20-04-2012 02:13 1902898

Johny777 я уже пробовал менять координаты дело в том, что кнопки не видно как прописать в скрипте, чтобы ее было видно на всех страницах кроме первой и последней...

No4noylis 20-04-2012 09:43 1903001

Ivan_009, Эту кнопочку помимо координат нужно перенести с Parent := WizardForm; на Parent := WizardForm.InnerPage;

Gnom_aka_Lexander 20-04-2012 09:50 1903005

Ivan_009, Ванечка, дык понятно, что там не будет кнопки. Ну сам подумай, откуда ей там взяться, если она лежит на WizardForm, поверх которого еще два окна и кнопка в этом месте будет четко под ними находиться. Но не ссы, мы ботаны, такие задачки - как семечки щелкаем.
Модуль BASS_Module.iss открываешь, крутишь в самый низ, находишь этот блок и добавляешь строчки, которых у тебя нет. Возможны синтаксические ошибки, но я верю, что не все так плохо с тобой, справишься.
читать дальше »
Код:

function BringWindowToTop(Handle: HWND): Boolean;
  external 'BringWindowToTop@User32.dll stdcall delayload';

procedure BASS_CreateOnOffButton(Parent: TWinControl; Image: String; Left, Top, Width, Height, ShadowWidth: Integer);
begin
  BASS_OnOffBtn:= BtnCreate(Parent.Handle, ScaleX(Left), ScaleY(Top), ScaleX(Width), ScaleY(Height), ExpandConstant(Image), ShadowWidth, True);
  BtnSetEvent(BASS_OnOffBtn, 1, WrapBtnCallback(@BASS_OnOffClick, 1));
  BringWindowToTop(BASS_OnOffBtn);
end;

Справка по использованной функции: Ссылка.

Temyraz@fb 20-04-2012 09:55 1903006

честно не могу понять как это сделать
хочу сделать так
читать дальше »
Код:

[_Code]
 function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  if  not RegKeyExists(HKEY_CURRENT_USER, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_CURRENT_USER, 'Software\IVTBelGU\Synergy Center')
  then
    begin
      if MsgBox('текст' + #10#13 +
                'тест', mbError, MB_YESNO) = idYes
        then
       
      запустит вариант 1


      else
      begin
     
          MsgBox(ExpandConstant('goodbay' #13#10 'bay'), mbInformation, mb_Ok);
          Result :=  false;
                                exit;

          //MsgBox('тест' #13#10 'текст Synergy Center', mbInformation, mb_Ok);
      end;
    end
    else
    begin
                 
              запустит по варианту 2
 
   
    end;
end;
end;


вариант 1
читать дальше »
Код:

[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={{903E5749-D9EC-45A3-A5E1-B0621695F680}
AppName={cm:UpdateApplicationName}
AppVerName={#MyAppName} {#MyAppVer}.{#MyAppPatch}
VersionInfoVersion={#MyAppVer}.{#MyAppPatch}.{#MyAppBuild}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir={#MyOutputDir}
UpdateUninstallLogAppName=no
UsePreviousAppDir=yes
CreateUninstallRegKey=no
;DisableDirPage=yes

OutputBaseFilename=Synergy Center Update {#MyAppVer}.{#MyAppPatch}
Compression=lzma
SolidCompression=yes
WizardImageFile=wizard\WizModernImage-IS.bmp
WizardSmallImageFile=wizard\WizModernSmallImage-IS.bmp

[Registry]
Root: HKLM; Subkey: Software\Corssys\Synergy Center; ValueType: string; ValueName: Version; ValueData: {#MyAppVer}.{#MyAppPatch}; Flags: uninsdeletekey

[Languages]
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl

[Dirs]
Name: {app}\db_update; Flags: uninsneveruninstall; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Languages:

[InstallDelete]
Name: {app}\apache-tomcat\bin\service.bat; Type: filesandordirs; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\work\*; Type: filesandordirs; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\su\*; Type: filesandordirs; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\i18n\*; Type: filesandordirs; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\lib\*; Type: filesandordirs; BeforeInstall: StopTomcat


[Files]
Source: {app}\apache-tomcat\webapps\ROOT\*; DestDir: {app}\backups\Webcontent-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}; Flags: ignoreversion recursesubdirs createallsubdirs external uninsneveruninstall; Components: backup_app
Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: StopTomcat
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: apache-tomcat\bin\service.bat; DestDir: {app}\apache-tomcat\bin\; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: configs\WEB-INF\settings.properties; Flags: dontcopy
;Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: db_update\*; DestDir: {app}\db_update; Flags: ignoreversion recursesubdirs createallsubdirs; Languages:
;Source: D:\work\_Stable\setup\db\update\{#MyAppVer}\*.sql; DestDir: {app}\db_update\sql_scripts; Flags: ignoreversion
Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\db_update\sql_scripts; Flags: ignoreversion recursesubdirs createallsubdirs
Source: dontcopy\check.bat; Flags: dontcopy


[Run]
;Filename: {app}\postgresql\bin\pg_dump.exe; Parameters: "-h localhost -p 5432 -U postgres -F c -b -v -f ""{app}\backups\db-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}.backup"" sc"; Flags: waituntilterminated; StatusMsg: Бэкап текущей БД; Components: backup_db
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " remove"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden
Filename: {app}\db_update\make_db_backup.bat; WorkingDir: {app}\; Flags: shellexec  waituntilterminated; StatusMsg: StatusMsg: {cm:BackupingCurrentDB}; Components: backup_db
;Filename: NET; Parameters: "STOP ""Apache Tomcat"""; Flags: runhidden; StatusMsg: {cm:StoppingTomcat}
Filename: {app}\db_update\run_db_update.bat; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; StatusMsg: {cm:UpdatingDatabase}
;Filename: java; Parameters: " -jar --patches_path=""./sql_scripts/"" --log=""./sql_scripts/sql_scripts_log.log"" --sc_properites_path=""{app}/apache-tomcat/webapps/ROOT/WEB-INF/settings.properties"" "; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; StatusMsg: {cm:UpdatingDatabase}
;Filename: rmdir; Parameters: "/S /Q ""{app}\apache-tomcat\work\Catalina\"""; Flags: shellexec runhidden; StatusMsg: {cm:StartingTomcat}
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; StatusMsg: {cm:StartingTomcat}


[Components]
Name: backup_db; Description: {cm:MakeDBBackupComponent}; Flags: checkablealone; Types: custom full; Languages: ; ExtraDiskSpaceRequired: 5000000
Name: backup_app; Description: {cm:MakeApplicationBackupComponent}; Flags: checkablealone; Types: custom full; ExtraDiskSpaceRequired: 50000000
[  Code]

var
  PasswordPage: TInputQueryWizardPage;
  DataDirPage: TInputDirWizardPage;

  UserVarPass: String;
  PathToPsql: String;

procedure InitializeWizard();
begin

  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
  DataDirPage.Add('');
  DataDirPage.Values[0] := GetPreviousData('DataDir', 'C:\Program Files\PostgreSQL\9.0\bin');

  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('{cm:PasswordInputCaption}') ,ExpandConstant('{cm:PasswordInputDescription}'), ExpandConstant('{cm:PasswordInputSubCapton}') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;
begin
  Result := True;
 If CurPageID = wpSelectDir then
  begin
        If (FileSearch('settings.properties', ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF')='') then
        begin
                MsgBox(ExpandConstant('{cm:ErrorSCNotFound}'), mbCriticalError, mb_Ok);
                Result:=False;
        end
 end;

  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;

  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;

procedure StopTomcat();
var
  ErrorCode: Integer;
begin
  if not Exec('NET',' STOP "Apache Tomcat"', '' ,SW_HIDE, ewWaitUntilTerminated, ErrorCode) then
  begin
    MsgBox('Fail to stop tomcat', mbInformation, mb_Ok);
  end;
end;



Function InitializeSetup: Boolean;
  var ResultCode: Integer;
  var fileStrings: TArrayOfString;
  var pathToOutput: String;
  var outputFile: String;
Begin
        If (ExpandConstant('{reg:HKLM\Software\JavaSoft\Java Runtime Environment,CurrentVersion}') = '1.6') then
                Result:= True
        else MsgBox(ExpandConstant('{cm:SetupJRE}'), mbInformation, mb_Ok);
end;


function CheckDBUpdateIsOk(): Boolean;
var filecontent: String;
var pathToLog: String;
begin
  Result:= false;
  pathToLog:=ExpandConstant('{app}')+'\db_update\db_update_log.log';
  LoadStringFromFile(pathToLog, filecontent);
  if (Pos('Update succesfully',filecontent)>0) then
  begin
        Result:= true;
  end

end;

procedure CurPageChanged(CurPageID: Integer);
  var ResultCode: Integer;
Begin
If (CurPageID=wpInfoAfter)or(CurPageID=wpFinished ) then
        begin
        if (not CheckDBUpdateIsOk) then begin
                        MsgBox(ExpandConstant('{cm:ErrorUpdatingDB}')+' ('+ExpandConstant('{app}')+'\backups)', mbCriticalError, mb_Ok);
                        Abort;
                end
        end
end;


procedure ReplacePathInConfigs();
var filecontent: String;
var pathToConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathToConfig:=ExpandConstant('{app}');
  StringChange(pathToConfig,'\','/');
  StringChange(filecontent,'{INSTALL_PATH}',pathToConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  for i:=0 to GetArrayLength(fileStrings)-1 do
  begin
                if ((Pos(':'+Port+' ',fileStrings[i])>0) and (Pos('LISTENING',fileStrings[i]) >0)) then
                        begin
                                Result := true;
                                exit;
                        end;
  end;
  Result := false;
end;


procedure AddDefaultToConfig();
var filecontent_default: String;
var configStrings,defaultStrings: TArrayOfString;
var pathToConfig,pathToDefaultConfig,appPath: String;
var langForConfig,currentKey: String;
var currentPos,i,j: Integer;
var containKey: Boolean;
begin
  // извлекаем конфиг по умолчанию
  ExtractTemporaryFile('settings.properties');
  pathToConfig:=ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF\settings.properties';
  pathToDefaultConfig:=ExpandConstant('{tmp}\settings.properties');
  appPath:=ExpandConstant('{app}');
  langForConfig:=ExpandConstant('{language}');
  // заменяем пути в конфиге по умолчанию
  LoadStringFromFile(pathToDefaultConfig, filecontent_default);
  StringChange(appPath,'\','/');
  StringChange(filecontent_default,'{INSTALL_PATH}',appPath);
  StringChange(filecontent_default,'{LANGUAGE}',langForConfig);
  SaveStringToFile(pathToDefaultConfig, filecontent_default, false);
  // загружаем как строки конфиг по умолчанию
  LoadStringsFromFile(pathToDefaultConfig, defaultStrings);
  // загружаем как строки конфиг sc
  LoadStringsFromFile(pathToConfig, configStrings);

  for i:=0 to GetArrayLength(defaultStrings)-1 do
  begin
                currentPos:=Pos('=',defaultStrings[i]);
                if ((currentPos>0)) then
                        begin
                                currentKey:=Trim(Copy(defaultStrings[i], 0, currentPos-1));
                                containKey:=false;
                                  for j:=0 to GetArrayLength(configStrings)-1 do
                                        begin
                                                if ((Pos(currentKey,configStrings[j])>0)) then
                                                begin
                                                        containKey:=true;
                                                end;
                                        end;
                                if (containKey=false) then
                                        begin
                                                //добавляю в конфиг
                                                SetArrayLength(configStrings, GetArrayLength(configStrings)+1);
                                                configStrings[GetArrayLength(configStrings)-1]:=defaultStrings[i];
                                        end
                        end;
  end;
  SaveStringsToFile(pathToConfig, configStrings, false);
end;


var
  TodaysName : String;

function GetToday : String;
begin
  Result := GetDateTimeString ('yyyy.mm.dd hh.nn.ss', '-', #0);
end;

function GetTodaysName (Param: String): String;
begin
  if ('' = TodaysName) then
  begin
    TodaysName := GetToday ();
  end;
  Result := TodaysName;
end;


вариант 2
читать дальше »
Код:

[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={{903E5749-D9EC-45A3-A5E1-B0621695F680}
AppName={#MyAppName}
AppVerName={#MyAppName} {#MyAppVer}
VersionInfoVersion={#MyAppVer}.{#MyAppPatch}.{#MyAppBuild}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir={#MyOutputDir}
OutputBaseFilename=SynergyCenter{#MyAppVer}Setup
Compression=lzma
SolidCompression=yes
LicenseFile=dontcopy\license_ru.rtf
WizardImageFile=wizard\WizModernImage-IS.bmp
WizardSmallImageFile=wizard\WizModernSmallImage-IS.bmp

[Languages]
;Name: en; MessagesFile: i18n\Default.isl,i18n\sc_english.isl; LicenseFile: dontcopy\license_en.rtf
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl; LicenseFile: dontcopy\license_ru.rtf
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl; LicenseFile: dontcopy\license_ua.rtf

[Registry]
Root: HKLM; Subkey: Software\Corssys\Synergy Center; ValueType: string; ValueName: Version; ValueData: {#MyAppVer}.{#MyAppPatch}; Flags: uninsdeletekey

[Dirs]
Name: {app}\apache-tomcat; Flags: uninsneveruninstall; Languages:
Name: {app}\files; Flags: uninsneveruninstall; Languages:
Name: {app}\nginx; Flags: uninsneveruninstall; Languages:
Name: {app}\dbinit; Flags: uninsneveruninstall; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Languages:

[Files]
Source: apache-tomcat\*; DestDir: {app}\apache-tomcat; Flags: ignoreversion recursesubdirs createallsubdirs
Source: apache-tomcat\msvcr71.dll; DestDir: {sys}\; Flags: onlyifdoesntexist
Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Flags: ignoreversion recursesubdirs createallsubdirs
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Flags: ignoreversion recursesubdirs createallsubdirs
Source: configs\WEB-INF\settings.properties; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\nginx_to_autorun.reg; DestDir: {app}\nginx\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\add_reg.bat; DestDir: {app}\nginx\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\*; DestDir: {app}\nginx; Flags: ignoreversion recursesubdirs createallsubdirs
Source: dbinit\*; DestDir: {app}\dbinit; Flags: ignoreversion recursesubdirs; AfterInstall: ReplacePathInConfigsPass
Source: UserMenu\*; DestDir: {app}; Flags: ignoreversion recursesubdirs; Languages: ; AfterInstall: ReplacePathInConfigs
Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\dbinit; Flags: ignoreversion
Source: dontcopy\netstat1.bat; Flags: dontcopy
Source: dontcopy\check.bat; Flags: dontcopy

[Icons]
Name: {group}\{#MyAppName}; Filename: {#InstalledLocalURL}
;Name: {group}\Start Tomcat; Filename: {app}\TomcatServiceStart.exe; WorkingDir: {app}\; Comment: {cm:RunTomcat}; Flags: runminimized; Components:
;Name: {group}\Stop Tomcat; Filename: {app}\TomcatServiceStop.exe; WorkingDir: {app}\; Comment: {cm:StopTomcat}; Flags: runminimized
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\admin_manual.pdf; Languages: ru
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\user_manual.pdf; Languages: ru
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_admin.pdf; Languages: ua
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_user.pdf; Languages: ua
Name: {group}\{cm:Rukovodstvo_administratora}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\Rukovodstvo_administratora.pdf
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}

[Run]
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden; StatusMsg: Installing Apache Tomcat as Service
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; Components: PostgreSQL; StatusMsg: {cm:StartingTomcat}
Filename: {app}\dbinit\createAndInitDb.bat; Parameters: """{code:GetPsqlPath}""  {language}"; WorkingDir: {app}\dbinit\; Flags: shellexec runhidden waituntilterminated; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}
Filename: {app}\nginx\add_reg.bat; Flags: shellexec runhidden
Filename: {app}\start_nginx.bat; Flags: shellexec runhidden
Filename: {app}\dbinit\installAdditionalCards.bat; Parameters: """{code:GetPsqlPath}"" {language}"; WorkingDir: {app}\dbinit\; Flags: shellexec runhidden waituntilterminated; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}; Tasks: IntstallDefaultShemes
Filename: {app}\Synergy Center.url; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent shellexec; Components: PostgreSQL

[UninstallRun]
Filename: NET; Parameters: "STOP ""Apache Tomcat"""; Flags: runhidden
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " remove"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden; Components:
Filename: {app}\stop_nginx.bat; WorkingDir: {app}\; Components:

[Components]
Name: Tomcat; Description: {cm:ApacheTomcatComponent}; Flags: fixed; Types: custom compact full
Name: PostgreSQL; Description: {cm:PostgresComponent}; Types: custom full; Flags: checkablealone; ExtraDiskSpaceRequired: 16080384; Languages:

[Tasks]
Name: IntstallDefaultShemes; Description: {cm:IntstallDefaultShemes}; Flags: checkablealone; Components: Postgresql; Languages:

[UninstallDelete]
Name: {app}\dbinit; Type: dirifempty

[  Code]

var
  PasswordPage: TInputQueryWizardPage;
  DataDirPage: TInputDirWizardPage;

  UserVarPass: String;
  PathToPsql: String;
// STAGE 2
procedure InitializeWizard();
begin

  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
  DataDirPage.Add('');
  DataDirPage.Values[0] := GetPreviousData('DataDir', 'C:\Program Files\PostgreSQL\9.0\bin');

  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('{cm:PasswordInputCaption}') ,ExpandConstant('{cm:PasswordInputDescription}'), ExpandConstant('{cm:PasswordInputSubCapton}') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;
begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;

  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;


function GetBuildNumber(param: String): String;
    var
          BuildVersion: String;
    begin
          LoadStringFromFile(ExpandConstant('buildNumber.txt'), BuildVersion);
          Result := BuildVersion;
    end;

function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  for i:=0 to GetArrayLength(fileStrings)-1 do
  begin
                if ((Pos(':'+Port+' ',fileStrings[i])>0) and (Pos('LISTENING',fileStrings[i]) >0)) then
                        begin
                                Result := true;
                                exit;
                        end;
  end;
  Result := false;
end;

// >>> STAGE 1 <<<
Function InitializeSetup: Boolean;
  var ResultCode: Integer;
  var fileStrings: TArrayOfString;
  var pathToOutput: String;
  var outputFile: String;
Begin
        If (ExpandConstant('{reg:HKLM\Software\JavaSoft\Java Runtime Environment,CurrentVersion}') = '1.6') then
                Result:= True
        else MsgBox(ExpandConstant('{cm:SetupJRE}'), mbInformation, mb_Ok);
        outputFile:=ExpandConstant('{tmp}\netstatoutput.log');
        pathToOutput:=ExpandConstant('{tmp}\');
        ExtractTemporaryFile('netstat1.bat');
        if Exec(ExpandConstant('{tmp}\netstat1.bat'),  'netstatoutput.log', pathToOutput, SW_HIDE, ewWaitUntilTerminated, ResultCode) then
        begin
                //MsgBox(outputFile, mbInformation, mb_Ok);
                // handle success if necessary; ResultCode contains the exit code
                LoadStringsFromFile(outputFile, fileStrings);
                DeleteFile(outputFile);
                DeleteFile(ExpandConstant('{tmp}\netstat1.bat'));
                If (CheckPortUsing('80',fileStrings) and (Result=true)) then
                begin
                  Result := MsgBox(ExpandConstant('{cm:Port80InUse}'), mbConfirmation, MB_YESNO) = idYes;
                end
  end
  else MsgBox('Error ', mbInformation, mb_Ok);

End;

function GetPsqlPath(Param: String): String;
begin
        Result := PathToPsql + '\psql.exe';
end;

procedure ReplacePathInConfigs();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','/');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

procedure ReplacePathInConfigsReg();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','\\');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

procedure ReplacePathInConfigsPass();
var filecontent: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  StringChange(filecontent,'{PG_PASS}',UserVarPass);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;



как мне склеит это все?

Ivan_009 20-04-2012 11:07 1903045

Лександер спасибо большое... :up

Johny777 20-04-2012 12:52 1903096

Temyraz@fb,
вот попробовал
тестируй, тк скорее всего сильно накосячил особенно в Function InitializeSetup
читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
EnableDirDoesntExistWarning=true


[  Code]
var
  CheckBoxA: TNewCheckBox;
  CheckBoxB: TNewCheckBox;
  /// это общее /// начало
  PasswordPage: TInputQueryWizardPage;
  DataDirPage: TInputDirWizardPage;

  UserVarPass: String;
  PathToPsql: String;
 
 
procedure ReplacePathInConfigsReg();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','\\');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  for i:=0 to GetArrayLength(fileStrings)-1 do
  begin
                if ((Pos(':'+Port+' ',fileStrings[i])>0) and (Pos('LISTENING',fileStrings[i]) >0)) then
                        begin
                                Result := true;
                                exit;
                        end;
  end;
  Result := false;
end;

  /// конец
 
 
/// кусок из варианта 2 /// начало
function GetBuildNumber(param: String): String;
    var
          BuildVersion: String;
    begin
          LoadStringFromFile(ExpandConstant('buildNumber.txt'), BuildVersion);
          Result := BuildVersion;
    end;




function GetPsqlPath(Param: String): String;
begin
        Result := PathToPsql + '\psql.exe';
end;

procedure ReplacePathInConfigs();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','/');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;



procedure ReplacePathInConfigsPass();
var filecontent: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  StringChange(filecontent,'{PG_PASS}',UserVarPass);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;
/// конец


/// это кусок варианта 1 /// начало
procedure StopTomcat();
var
  ErrorCode: Integer;
begin
  if not Exec('NET',' STOP "Apache Tomcat"', '' ,SW_HIDE, ewWaitUntilTerminated, ErrorCode) then
  begin
    MsgBox('Fail to stop tomcat', mbInformation, mb_Ok);
  end;
end;





function CheckDBUpdateIsOk(): Boolean;
var filecontent: String;
var pathToLog: String;
begin
  Result:= false;
  pathToLog:=ExpandConstant('{app}')+'\db_update\db_update_log.log';
  LoadStringFromFile(pathToLog, filecontent);
  if (Pos('Update succesfully',filecontent)>0) then
  begin
        Result:= true;
  end

end;








procedure AddDefaultToConfig();
var filecontent_default: String;
var configStrings,defaultStrings: TArrayOfString;
var pathToConfig,pathToDefaultConfig,appPath: String;
var langForConfig,currentKey: String;
var currentPos,i,j: Integer;
var containKey: Boolean;
begin
  // извлекаем конфиг по умолчанию
  ExtractTemporaryFile('settings.properties');
  pathToConfig:=ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF\settings.properties';
  pathToDefaultConfig:=ExpandConstant('{tmp}\settings.properties');
  appPath:=ExpandConstant('{app}');
  langForConfig:=ExpandConstant('{language}');
  // заменяем пути в конфиге по умолчанию
  LoadStringFromFile(pathToDefaultConfig, filecontent_default);
  StringChange(appPath,'\','/');
  StringChange(filecontent_default,'{INSTALL_PATH}',appPath);
  StringChange(filecontent_default,'{LANGUAGE}',langForConfig);
  SaveStringToFile(pathToDefaultConfig, filecontent_default, false);
  // загружаем как строки конфиг по умолчанию
  LoadStringsFromFile(pathToDefaultConfig, defaultStrings);
  // загружаем как строки конфиг sc
  LoadStringsFromFile(pathToConfig, configStrings);

  for i:=0 to GetArrayLength(defaultStrings)-1 do
  begin
                currentPos:=Pos('=',defaultStrings[i]);
                if ((currentPos>0)) then
                        begin
                                currentKey:=Trim(Copy(defaultStrings[i], 0, currentPos-1));
                                containKey:=false;
                                  for j:=0 to GetArrayLength(configStrings)-1 do
                                        begin
                                                if ((Pos(currentKey,configStrings[j])>0)) then
                                                begin
                                                        containKey:=true;
                                                end;
                                        end;
                                if (containKey=false) then
                                        begin
                                                //добавляю в конфиг
                                                SetArrayLength(configStrings, GetArrayLength(configStrings)+1);
                                                configStrings[GetArrayLength(configStrings)-1]:=defaultStrings[i];
                                        end
                        end;
  end;
  SaveStringsToFile(pathToConfig, configStrings, false);
end;


var
  TodaysName : String;

function GetToday : String;
begin
  Result := GetDateTimeString ('yyyy.mm.dd hh.nn.ss', '-', #0);
end;

function GetTodaysName (Param: String): String;
begin
  if ('' = TodaysName) then
  begin
    TodaysName := GetToday ();
  end;
  Result := TodaysName;
end;



procedure CurPageChanged(CurPageID: Integer);
  var ResultCode: Integer;
Begin
If (CurPageID=wpInfoAfter)or(CurPageID=wpFinished ) then
        begin
        if (not CheckDBUpdateIsOk) then begin
                        MsgBox(ExpandConstant('{cm:ErrorUpdatingDB}')+' ('+ExpandConstant('{app}')+'\backups)', mbCriticalError, mb_Ok);
                        Abort;
                end
        end
end;
/// конец
 
 
function Run_A: Boolean; begin Result:=CheckBoxA.Checked; end;
function Run_B: Boolean; begin Result:=CheckBoxB.Checked; end;


Function InitializeSetup: Boolean;
  var ResultCode: Integer;
  var fileStrings: TArrayOfString;
  var pathToOutput: String;
  var outputFile: String;
 
Begin
/// это общее?  /// начало
        If (ExpandConstant('{reg:HKLM\Software\JavaSoft\Java Runtime Environment,CurrentVersion}') = '1.6') then
                Result:= True
        else MsgBox(ExpandConstant('{cm:SetupJRE}'), mbInformation, mb_Ok);
/// конец
       
        outputFile:=ExpandConstant('{tmp}\netstatoutput.log');
        pathToOutput:=ExpandConstant('{tmp}\');
        ExtractTemporaryFile('netstat1.bat');
        if Exec(ExpandConstant('{tmp}\netstat1.bat'),  'netstatoutput.log', pathToOutput, SW_HIDE, ewWaitUntilTerminated, ResultCode) then
        begin
                //MsgBox(outputFile, mbInformation, mb_Ok);
                // handle success if necessary; ResultCode contains the exit code
                LoadStringsFromFile(outputFile, fileStrings);
                DeleteFile(outputFile);
                DeleteFile(ExpandConstant('{tmp}\netstat1.bat'));
                If (CheckPortUsing('80',fileStrings) and (Result=true)) then
                begin
                  Result := MsgBox(ExpandConstant('{cm:Port80InUse}'), mbConfirmation, MB_YESNO) = idYes;
                end
  end
  else MsgBox('Error ', mbInformation, mb_Ok);
End;


procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
 
  /// это общее /// начало
  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
  DataDirPage.Add('');
  DataDirPage.Values[0] := GetPreviousData('DataDir', 'C:\Program Files\PostgreSQL\9.0\bin');

  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('{cm:PasswordInputCaption}') ,ExpandConstant('{cm:PasswordInputDescription}'), ExpandConstant('{cm:PasswordInputSubCapton}') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);
  /// конец
 
  { CheckBoxA }
  CheckBoxA := TNewCheckBox.Create(WizardForm);
  with CheckBoxA do
  begin
    Name := 'CheckBoxA';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(176);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'вариант 1';
  end;
  { CheckBoxB }
  CheckBoxB := TNewCheckBox.Create(WizardForm);
  with CheckBoxB do
  begin
    Name := 'CheckBoxB';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(208);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'вариант 2';
  end;
//// проверка
  if  not RegKeyExists(HKEY_CURRENT_USER, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_CURRENT_USER, 'Software\IVTBelGU\Synergy Center')
  then
    begin
      ///запустит вариант 1
      CheckBoxA.Enabled:=true;
      CheckBoxA.Checked:=true;
       
      CheckBoxB.Enabled:=false;
      CheckBoxB.Checked:=false;
    end
  else
    begin
      CheckBoxA.Enabled:=false;
      CheckBoxA.Checked:=false;

      CheckBoxB.Enabled:=true;
      CheckBoxB.Checked:=true;
    end;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;
       
begin
if CheckBoxA.Checked = true then
begin


begin
  Result := True;
 If CurPageID = wpSelectDir then
  begin
        If (FileSearch('settings.properties', ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF')='') then
        begin
                MsgBox(ExpandConstant('{cm:ErrorSCNotFound}'), mbCriticalError, mb_Ok);
                Result:=False;
        end
 end;

  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;

  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;


end;
/////////////////////////////////////////////////////////////////////
 
if CheckBoxB.Checked = false then
  begin
 
begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;

  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;

  end;
end;



Тестируй всё, а то потом не смешно будет

Temyraz@fb 20-04-2012 13:25 1903120

проверил. при втором варианте не проходить дальше окна чекбокса.

и еще нельзя ли скрыть от глаз пользователю страницу чекбокса?

Johny777 20-04-2012 13:32 1903126

Temyraz@fb,
да скрыть то можно, только там чекбоксы
попробуй допиши просто в конце InitializeWizard; перед последним end;
CheckBoxA.visible:=false;
CheckBoxB.visible:=false;

Цитата:

Цитата Temyraz@fb
втором варианте не проходить дальше окна чекбокса. »

значит криво работает NextButtonClick

потому что я накочячил как обычно
во первых во второй половине if CheckBoxB.Checked = false then
нужно сменить на true

вот это повторяется
читать дальше »
Код:

begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;


а значит его можно вынести до проверки какой чекбокс отмечен
вот замени всю function NextButtonClick и попробуй
читать дальше »
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;
       
       
begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;

/////////// начало проверки
begin
if CheckBoxA.Checked = true then
begin


begin
  Result := True;
 If CurPageID = wpSelectDir then
  begin
        If (FileSearch('settings.properties', ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF')='') then
        begin
                MsgBox(ExpandConstant('{cm:ErrorSCNotFound}'), mbCriticalError, mb_Ok);
                Result:=False;
        end
 end;


  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;


end;
/////////////////////////////////////////////////////////////////////
 
if CheckBoxB.Checked = true then
  begin
 

  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;

end;

end;


Temyraz@fb 20-04-2012 13:34 1903128

посмотри пожалуйста я еще добавил кое в исходных файлах.

Temyraz@fb 20-04-2012 13:50 1903141

теперь нормально со вторым вариантом.
только добавив как ты сказал
Цитата:

попробуй допиши просто в конце InitializeWizard; перед последним end;
CheckBoxA.visible:=false;
CheckBoxB.visible:=false;
исчезли чек боксы. а страница пустая. может туда можно добавить лицензионное соглашение?
Код:

[Languages]
;Name: en; MessagesFile: i18n\Default.isl,i18n\sc_english.isl; LicenseFile: dontcopy\license_en.rtf
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl; LicenseFile: dontcopy\license_ru.rtf
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl; LicenseFile: dontcopy\license_ua.rtf


Johny777 20-04-2012 14:08 1903151

Temyraz@fb,
склеить компоненты в одном инсталле можно 2-мя способами
1. это в зависимости от записи реестра (посмотри пример который я давал Devils Night, пару страниц назад )
2. делать две страницы с листбоксами и пропускать одну из них. Только я почти не умею пользоваться листбоксами
3. блокировать элементы компонентслиста в зависимости от выбора одного из основных чекбоксов на странице приветсятвия (не советую)
Цитата:

Цитата Temyraz@fb
исчезли чек боксы »

главное чтобы даже невидимыми они работали, что они и должны делать :)
Цитата:

Цитата Temyraz@fb
может туда можно добавить лицензионное соглашение? »

как хочешь
заменил радиокнопки на один чекбокс
этим примером немного переделанным
читать дальше »
Код:

[Setup]
AppName=My License
AppVerName=My License v 1.3
CreateAppDir=False
OutputDir=.
licenseFile=compiler:license.txt
 
 
[Languages]
Name: rus; MessagesFile: "compiler:Languages\Russian.isl";
 
[ Code]
 
var
  CheckLicense: TCheckBox;
 
 
procedure LicenseOnClick(Sender: TObject);
begin
  if (CheckLicense.Checked) = True then
  begin
    WizardForm.LicenseAcceptedRadio.Checked := True;
  end else
  begin
    WizardForm.LicenseNotAcceptedRadio.Checked := True;
  end;
end;
 
 
procedure InitializeWizard();
begin
  WizardForm.LicenseNotAcceptedRadio.Hide;
  WizardForm.LicenseAcceptedRadio.Hide;
  WizardForm.LicenseMemo.Height := ScaleY(175);
 
  CheckLicense := TCheckBox.Create(WizardForm);
  CheckLicense.Left := ScaleX(0);
  CheckLicense.Top := ScaleY(216);
  CheckLicense.Caption := WizardForm.LicenseAcceptedRadio.Caption;
  CheckLicense.Width := ScaleX(417);
  CheckLicense.OnClick := @LicenseOnClick;
  CheckLicense.Parent := WizardForm.LicensePage;
end;



результат

читать дальше »

Код:


[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
EnableDirDoesntExistWarning=true


[  Code]




var
  CheckBoxA: TNewCheckBox;
  CheckBoxB: TNewCheckBox;
  /// это общее /// начало
  PasswordPage: TInputQueryWizardPage;
  DataDirPage: TInputDirWizardPage;

  UserVarPass: String;
  PathToPsql: String;
    CheckLicense: TNewCheckBox;
 
 
 
procedure ReplacePathInConfigsReg();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','\\');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  for i:=0 to GetArrayLength(fileStrings)-1 do
  begin
                if ((Pos(':'+Port+' ',fileStrings[i])>0) and (Pos('LISTENING',fileStrings[i]) >0)) then
                        begin
                                Result := true;
                                exit;
                        end;
  end;
  Result := false;
end;

  /// конец

/// лицензия // начало
procedure LicenseOnClick(Sender: TObject);
begin
  if (CheckLicense.Checked) = True then
  begin
    WizardForm.LicenseAcceptedRadio.Checked := True;
  end else
  begin
    WizardForm.LicenseNotAcceptedRadio.Checked := True;
  end;
end;
/// конец

/// пропускаем страницы /// начало
function  ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpLicense: Result := True;
  end;
end;
/// конец
 
 
/// кусок из варианта 2 /// начало
function GetBuildNumber(param: String): String;
    var
          BuildVersion: String;
    begin
          LoadStringFromFile(ExpandConstant('buildNumber.txt'), BuildVersion);
          Result := BuildVersion;
    end;




function GetPsqlPath(Param: String): String;
begin
        Result := PathToPsql + '\psql.exe';
end;

procedure ReplacePathInConfigs();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','/');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;



procedure ReplacePathInConfigsPass();
var filecontent: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  StringChange(filecontent,'{PG_PASS}',UserVarPass);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;
/// конец


/// это кусок варианта 1 /// начало
procedure StopTomcat();
var
  ErrorCode: Integer;
begin
  if not Exec('NET',' STOP "Apache Tomcat"', '' ,SW_HIDE, ewWaitUntilTerminated, ErrorCode) then
  begin
    MsgBox('Fail to stop tomcat', mbInformation, mb_Ok);
  end;
end;





function CheckDBUpdateIsOk(): Boolean;
var filecontent: String;
var pathToLog: String;
begin
  Result:= false;
  pathToLog:=ExpandConstant('{app}')+'\db_update\db_update_log.log';
  LoadStringFromFile(pathToLog, filecontent);
  if (Pos('Update succesfully',filecontent)>0) then
  begin
        Result:= true;
  end

end;








procedure AddDefaultToConfig();
var filecontent_default: String;
var configStrings,defaultStrings: TArrayOfString;
var pathToConfig,pathToDefaultConfig,appPath: String;
var langForConfig,currentKey: String;
var currentPos,i,j: Integer;
var containKey: Boolean;
begin
  // извлекаем конфиг по умолчанию
  ExtractTemporaryFile('settings.properties');
  pathToConfig:=ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF\settings.properties';
  pathToDefaultConfig:=ExpandConstant('{tmp}\settings.properties');
  appPath:=ExpandConstant('{app}');
  langForConfig:=ExpandConstant('{language}');
  // заменяем пути в конфиге по умолчанию
  LoadStringFromFile(pathToDefaultConfig, filecontent_default);
  StringChange(appPath,'\','/');
  StringChange(filecontent_default,'{INSTALL_PATH}',appPath);
  StringChange(filecontent_default,'{LANGUAGE}',langForConfig);
  SaveStringToFile(pathToDefaultConfig, filecontent_default, false);
  // загружаем как строки конфиг по умолчанию
  LoadStringsFromFile(pathToDefaultConfig, defaultStrings);
  // загружаем как строки конфиг sc
  LoadStringsFromFile(pathToConfig, configStrings);

  for i:=0 to GetArrayLength(defaultStrings)-1 do
  begin
                currentPos:=Pos('=',defaultStrings[i]);
                if ((currentPos>0)) then
                        begin
                                currentKey:=Trim(Copy(defaultStrings[i], 0, currentPos-1));
                                containKey:=false;
                                  for j:=0 to GetArrayLength(configStrings)-1 do
                                        begin
                                                if ((Pos(currentKey,configStrings[j])>0)) then
                                                begin
                                                        containKey:=true;
                                                end;
                                        end;
                                if (containKey=false) then
                                        begin
                                                //добавляю в конфиг
                                                SetArrayLength(configStrings, GetArrayLength(configStrings)+1);
                                                configStrings[GetArrayLength(configStrings)-1]:=defaultStrings[i];
                                        end
                        end;
  end;
  SaveStringsToFile(pathToConfig, configStrings, false);
end;


var
  TodaysName : String;

function GetToday : String;
begin
  Result := GetDateTimeString ('yyyy.mm.dd hh.nn.ss', '-', #0);
end;

function GetTodaysName (Param: String): String;
begin
  if ('' = TodaysName) then
  begin
    TodaysName := GetToday ();
  end;
  Result := TodaysName;
end;



procedure CurPageChanged(CurPageID: Integer);
  var ResultCode: Integer;
Begin
If (CurPageID=wpInfoAfter)or(CurPageID=wpFinished ) then
        begin
        if (not CheckDBUpdateIsOk) then begin
                        MsgBox(ExpandConstant('{cm:ErrorUpdatingDB}')+' ('+ExpandConstant('{app}')+'\backups)', mbCriticalError, mb_Ok);
                        Abort;
                end
        end
end;
/// конец
 
 
function Run_A: Boolean; begin Result:=CheckBoxA.Checked; end;
function Run_B: Boolean; begin Result:=CheckBoxB.Checked; end;


Function InitializeSetup: Boolean;
  var ResultCode: Integer;
  var fileStrings: TArrayOfString;
  var pathToOutput: String;
  var outputFile: String;
 
Begin
/// это общее?  /// начало
        If (ExpandConstant('{reg:HKLM\Software\JavaSoft\Java Runtime Environment,CurrentVersion}') = '1.6') then
                Result:= True
        else MsgBox(ExpandConstant('{cm:SetupJRE}'), mbInformation, mb_Ok);
/// конец
       
        outputFile:=ExpandConstant('{tmp}\netstatoutput.log');
        pathToOutput:=ExpandConstant('{tmp}\');
        ExtractTemporaryFile('netstat1.bat');
        if Exec(ExpandConstant('{tmp}\netstat1.bat'),  'netstatoutput.log', pathToOutput, SW_HIDE, ewWaitUntilTerminated, ResultCode) then
        begin
                //MsgBox(outputFile, mbInformation, mb_Ok);
                // handle success if necessary; ResultCode contains the exit code
                LoadStringsFromFile(outputFile, fileStrings);
                DeleteFile(outputFile);
                DeleteFile(ExpandConstant('{tmp}\netstat1.bat'));
                If (CheckPortUsing('80',fileStrings) and (Result=true)) then
                begin
                  Result := MsgBox(ExpandConstant('{cm:Port80InUse}'), mbConfirmation, MB_YESNO) = idYes;
                end
  end
  else MsgBox('Error ', mbInformation, mb_Ok);
End;


procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.LicenseNotAcceptedRadio.Hide;
  WizardForm.LicenseAcceptedRadio.Hide;
  { CheckLicense }
  CheckLicense := TNewCheckBox.Create(WizardForm);
  with CheckLicense do
  begin
    Name := 'CheckLicense';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(176);
    Top := ScaleY(288);
    Width := ScaleX(97);
    Height := ScaleY(17);
    OnClick := @LicenseOnClick;
    CheckLicense.Caption := WizardForm.LicenseAcceptedRadio.Caption;
  end;
 
  with WizardForm.LicenseMemo do
  begin
    Left := ScaleX(164);
    Top := ScaleY(0);
    Width := ScaleX(333);
    Height := ScaleY(284);
    Parent := WizardForm.WelcomePage;
  end;
 
  /// это общее /// начало
  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
  DataDirPage.Add('');
  DataDirPage.Values[0] := GetPreviousData('DataDir', 'C:\Program Files\PostgreSQL\9.0\bin');

  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('{cm:PasswordInputCaption}') ,ExpandConstant('{cm:PasswordInputDescription}'), ExpandConstant('{cm:PasswordInputSubCapton}') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);
  /// конец
 
  { CheckBoxA }
  CheckBoxA := TNewCheckBox.Create(WizardForm);
  with CheckBoxA do
  begin
    Name := 'CheckBoxA';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(176);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'вариант 1';
  end;
  { CheckBoxB }
  CheckBoxB := TNewCheckBox.Create(WizardForm);
  with CheckBoxB do
  begin
    Name := 'CheckBoxB';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(208);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'вариант 2';
  end;
//// проверка
  if  not RegKeyExists(HKEY_CURRENT_USER, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_CURRENT_USER, 'Software\IVTBelGU\Synergy Center')
  then
    begin
      ///запустит вариант 1
      CheckBoxA.Enabled:=true;
      CheckBoxA.Checked:=true;
       
      CheckBoxB.Enabled:=false;
      CheckBoxB.Checked:=false;
    end
  else
    begin
      CheckBoxA.Enabled:=false;
      CheckBoxA.Checked:=false;

      CheckBoxB.Enabled:=true;
      CheckBoxB.Checked:=true;
    end;
CheckBoxA.visible:=false;
CheckBoxB.visible:=false;
end;


function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;
       
       
begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;

/////////// начало проверки
begin
if CheckBoxA.Checked = true then
begin


begin
  Result := True;
 If CurPageID = wpSelectDir then
  begin
        If (FileSearch('settings.properties', ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF')='') then
        begin
                MsgBox(ExpandConstant('{cm:ErrorSCNotFound}'), mbCriticalError, mb_Ok);
                Result:=False;
        end
 end;


  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;


end;
/////////////////////////////////////////////////////////////////////
 
if CheckBoxB.Checked = true then
  begin
 

  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;

end;

end;


wolkow70 20-04-2012 14:16 1903157

Расшифруйте пожалуйста точное значение флагов в таком случае:

Flags: uninsneveruninstall regserver onlyifdoesntexist

Johny777 20-04-2012 14:26 1903164

wolkow70,
из справки http://sendfile.su/570136

читать дальше »

uninsneveruninstall
Никогда не удалять данный файл. Его можно использовать при установке файла, предназначенного для общего использования, как, например, MFC DLL, потому что в этом случае деинсталлятор не должен его удалять до тех пор, пока его используют другие приложения.
regserver
Регистрация OLE-сервера (он же ActiveX control). Если этот флаг установлен, инсталлятор найдет и выполнит DllRegisterServer для DLL/OCX. Деинсталлятор вызовет DllUnregisterServer. При использовании в комбинации с флагом sharedfile DLL/OCX будет только дерегистрирована, когда связывающий счетчик достигнет нуля.

On a 64-bit mode install, the file is assumed to be a 64-bit image and will be registered inside a 64-bit process. You can override this by specifying the 32bit flag.

Дополнительные сведения приведены в конце страницы.
onlyifdoesntexist
Устанавливает файл только в случае, если такого файла в системе пользователя нет.


Flags: "не удалять при деинсталяции" "хз" "если существует, то не устанавливать=пропускать"

Temyraz@fb 20-04-2012 14:30 1903166

а как сделать чтоб пока check не стоит кнопка далее была не доступна?
Код:

{ CheckLicense }
  CheckLicense := TNewCheckBox.Create(WizardForm);
  with CheckLicense do
  begin
    Name := 'CheckLicense';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(176);
    Top := ScaleY(288);
    Width := ScaleX(200);
    Height := ScaleY(17);
    OnClick := @LicenseOnClick;
    CheckLicense.Caption := WizardForm.LicenseAcceptedRadio.Caption;
  end;


Johny777 20-04-2012 14:38 1903173

Цитата:

Цитата Temyraz@fb
а как сделать чтоб пока check не стоит кнопка далее была не доступна? »

добавь у себя
читать дальше »
Код:

procedure LicenseOnClick(Sender: TObject);
begin
  if (CheckLicense.Checked) = True then
  begin
    WizardForm.LicenseAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := True;
  end else
  begin
    WizardForm.LicenseNotAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := False;
  end;
end;



а так как с лицензией соглашаемся на странице приветствия (первой)
то допиши в конце InitializeWizard рядом с невидимыми) чекбоксами

WizardForm.NextButton.Enabled := False;
CheckLicense.Checked := false;

Temyraz@fb 20-04-2012 14:43 1903180

сделал как ты сказал, ничего не изменилось.

ошибся, изменилось. только когда запускаешь его, чек не стоит, кнопка доступна, когда чек ставишь, кнопка доступна, снимаешь чек кнопка не доступна. как то так

выход нашел сделать по умолчанию галочку на принятии соглашении

Johny777 20-04-2012 15:20 1903204

Temyraz@fb,
Ты извини. У меня скрипт есть, но запустить не могу, тк нет временных файлов и констат
вот отдельный рабочий пример
раскидай по секциям и замени существующие куски
читать дальше »
Код:

[Setup]
AppName=DisksInfo
VersionInfoVersion=5.0
AppVerName=DisksInfo
DefaultDirName={pf}\My program
EnableDirDoesntExistWarning=true
licenseFile=compiler:license.txt


[  Code]
var
 CheckLicense: TNewCheckBox;
 
/// лицензия // начало
procedure LicenseOnClick(Sender: TObject);
begin
  if (CheckLicense.Checked) = True then
  begin
    WizardForm.LicenseAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := True;
  end else
  begin
    WizardForm.LicenseNotAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := False;
  end;
end;
/// конец

/// пропускаем страницы /// начало
function  ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpLicense: Result := True;
  end;
end;
/// конец
 
 
procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.LicenseNotAcceptedRadio.Hide;
  WizardForm.LicenseAcceptedRadio.Hide;
  { CheckLicense }
  CheckLicense := TNewCheckBox.Create(WizardForm);
  with CheckLicense do
  begin
    Name := 'CheckLicense';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(176);
    Top := ScaleY(288);
    Width := ScaleX(200);
    Height := ScaleY(17);
    Checked := True;
    OnClick := @LicenseOnClick;
    CheckLicense.Caption := ExpandConstant(SetupMessage(msgLicenseAccepted));
  end;
 
  with WizardForm.LicenseMemo do
  begin
    Left := ScaleX(164);
    Top := ScaleY(0);
    Width := ScaleX(333);
    Height := ScaleY(284);
    Parent := WizardForm.WelcomePage;
  end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpWelcome then
    begin
      WizardForm.NextButton.Enabled := False;
      CheckLicense.Checked := false;
    end;
end;



только при возврате на страницу приветствия опять галка будет снята, а кнопка заблокирована :(

Temyraz@fb 20-04-2012 15:32 1903213

Johny777 спасибо тебе большое

я правильно понял логику:
Код:

[Files]
Source: {src}\files\*; DestDir: {code:SrcDir}\files\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: значение
Source: {src}\license\*; DestDir: {code:SrcDir}\license\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: значение

вот какие значения надо подставлять при первом варианте и при втором?

Johny777 20-04-2012 15:38 1903219

Temyraz@fb,
ты о чём?

Temyraz@fb 20-04-2012 15:39 1903220

Run_A и Run_B соответственно?

Johny777 20-04-2012 15:42 1903226

Temyraz@fb,
ну да если ты хочешь чтобы при отмеченном одном чекбоксе и ли другом распаковать те или иные файлы
Run_A или Run_B можешь по своему назвать для удобства, если хочешь. Только без пробелов

[Files]
Source: {src}\files\*; DestDir: {code:SrcDir}\files\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: Run_B
Source: {src}\license\*; DestDir: {code:SrcDir}\license\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: Run_A

PS:
Только для компонентов это не прокатит

Temyraz@fb 20-04-2012 15:43 1903230

все понял, спасибо большое.

Ivan_009 20-04-2012 17:04 1903289

Небольшой вопросик можно. Как изменить курсор при наведении на кнопку музыки, чтобы он был ввиде руки... :not-me:

Johny777 20-04-2012 17:28 1903307

Ivan_009,
Цитата:

Цитата Лександер
Модуль BASS_Module.iss открываешь, крутишь в самый низ, находишь этот блок и добавляешь строчки, которых у тебя нет »

там же дописываешь эту строчку
Код:

procedure BASS_CreateOnOffButton(Parent: TWinControl; Image: String; Left, Top, Width, Height, ShadowWidth: Integer);
begin
  ......
  BtnSetCursor(BASS_OnOffBtn,GetSysCursorHandle(32649)); //установим стандартный курсор OCR_HAND=32649, константы OCR_... ищем в инете
end;

Источник:
...\Inno Setup 5\Modules\South\botva2_example\test19.iss

Ivan_009 20-04-2012 17:31 1903309

Johny777 спасибо... :up

valyok666 20-04-2012 18:13 1903348

Цитата:

Цитата Ivan_009
Johny777 спасибо... »

Видишь всё берётся из справок,а не из воздуха)Мы без неё как без рук :happy: :happy:

nikitich95 21-04-2012 16:32 1903753

Добрый день! у меня возник вопрос.
Как сделать картинку на всех страницах сетапа так чтобы она была на все окно?

Ivan_009 21-04-2012 17:22 1903775

nikitich95 как-то так. Пример: :drug:

valyok666 21-04-2012 18:30 1903804

Цитата:

Цитата Ivan_009
nikitich95 как-то так. Пример:
Вложения
Тип файла: 7z Скрипт.7z
(2.1 Kb, 0 просмотров) »

проще использовать IsPicture

Ivan_009 21-04-2012 20:04 1903827

valyok666 ну можно и так... :)

Johny777 22-04-2012 00:00 1903917

Добрые люди скажите пожалуйста как добавить разделитель во сплывающее меню?

NewLine; не помогает
Они, разделители, не так уж важны в моём случае, но помогли бы немного упорядочить айтемы меню :)

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,

El Sanchez,
прошу совета!
странное мигание скроллбокса (в частности картинок и ричэдитов) на второй странице и отсутствие анимации при использовании панели (код ниже), работающей через .Repaint; (она вызывается на странице компонентов из выпадающего меню SpeedButton)
наглядный пример - http://sendfile.su/577889
после добавления
Код:

const
  GWL_EXSTYLE = (-20);
  WS_EX_COMPOSITED = $2000000;

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

procedure InitializeWizard;
begin
  ...
  SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED)
end;

*(добавил давно а косяки исправить так и не получается)
есть код для выкатывающейся панели через таймер, но с его использованием вылетают непонятные и жуткие ошибки
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[ Code]
 var
  SettingPanel: TPanel;
  SettingPanel_m_Timer,SettingPanel_p_Timer: TTimer;

 procedure NewButton1Click(Sender: TObject);
 begin
  SettingPanel_m_Timer.Enabled:=False; SettingPanel_p_Timer.Enabled:=False;

  if SettingPanel.Top<0 then SettingPanel_p_Timer.Enabled:=True;
  if SettingPanel.Top>-1 then SettingPanel_m_Timer.Enabled:=True;
 end;

 procedure PanelTop_p_Timer(Sender: TObject);
 begin
  SettingPanel.Top:=ScaleY(SettingPanel.Top + 5);
  if SettingPanel.Top>-1 then
    SettingPanel_p_Timer.Enabled:=False;
 end;

 procedure PanelTop_m_Timer(Sender: TObject);
 begin
  SettingPanel.Top:=ScaleY(SettingPanel.Top - 5);
  if SettingPanel.Top<-314 then
    SettingPanel_m_Timer.Enabled:=False;
 end;

 procedure InitializeWizard();
 begin
  SettingPanel_p_Timer := TTimer.Create(WizardForm);
  with SettingPanel_p_Timer do
  begin
    Interval := 1;
    Enabled:=False;
    OnTimer := @PanelTop_p_Timer;
  end;

  SettingPanel_m_Timer := TTimer.Create(WizardForm);
  with SettingPanel_m_Timer do
  begin
    Interval := 1;
    Enabled:=False;
    OnTimer := @PanelTop_m_Timer;
  end;

  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  with TNewButton.Create(WizardForm) do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption := 'open';
    OnClick := @NewButton1Click;
  end;
 end;


другой пример использвания таймера привел к тому что он (таймер) не работал (то была проверки на странице выбора директории установки)
речь идёт об этом незамысловатом примере:
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
PrivilegesRequired=none
OutputDir=userdocs:Inno Setup Examples Output
 
 
[  Code]
var
 UTimer: TTimer;  //Таймер для обновления событий
 
procedure UpdateTimer(Sender: TObject);
begin
//123 - ваш определённый текст!
if WizardForm.DirEdit.Text='123' then begin
 WizardForm.NextButton.Enabled:= False;
end;
if WizardForm.DirEdit.Text='' then begin
 WizardForm.NextButton.Enabled:= True;
end;
end;
 
procedure InitializeWizard;
begin
 UTimer:= TTimer.Create(WizardForm);
 UTimer.Interval:= 1;
 UTimer.OnTimer:= @UpdateTimer;
end;
 
procedure CurPageChanged(CurPageID: Integer);
begin
 UTimer.Enabled:= False;
if CurPageID=wpSelectDir then begin
 UTimer.Enabled:= True;
end;
end;


Дело в том что использую innocallback и возможно конфликт идёт с ним
ситуация такая
панель - часть оформления и отказаться от неё было бы не желательно
в данный момент использую эту
читать дальше »
Код:

procedure Rolling(Sender: TObject);
var
  i:integer;
begin
i:=Panel3.Left;
If i= -Panel3.Width then
  begin
    while True do
      begin
        if i>0 then i:=0;
        Panel3.Left:= ScaleX(i);
///      Panel3.Repaint;
        if i=0 then Break;
        i:=i+10;
      end;
    MnuItem.Caption := ExpandConstant('{cm:Console0}');
  end
else
  begin
    while True do
      begin
        if i<-Panel3.Width then i:=-Panel3.Width;
        Panel3.Left:= ScaleX(i);
///        Panel3.Repaint;
        if i=-Panel3.Width then Break;
        i:=i-10;
      end;
    MnuItem.Caption := ExpandConstant('{cm:Console1}');
  end;
end;


единственное что приходит в голову это
1. я неправильно использую WS_EX_COMPOSITED...
2. нужно вернуться на таймер-панель, но переделанную по innocallback

nikitich95 22-04-2012 00:12 1903919

Спасибо. скрипт работает)) а как увеличить само окно установщика?

valyok666 22-04-2012 03:09 1903939

nikitich95,
procedure InitializeWizard();
begin
WizardForm.ClientWidth:=ScaleX(790); ширина
WizardForm.ClientHeight:=ScaleY(533); высота
WizardForm.Center; установшик будет стоять по центру
end;

wertulll 22-04-2012 20:20 1904138

Ребят подскажите пожалуйста как в этот скрипт прописать отображение своей папки ?

чтото не выходит нехрена :splat:

valyok666 22-04-2012 23:09 1904222

EvilAlex, в исдоне полазей и поймёшь как=)

detiedyatosla 22-04-2012 23:10 1904224

Привет народ)
Киньте плз скрипт добавления дополнительного по в сетап
Зарание благодарен

valyok666 22-04-2012 23:19 1904226

detiedyatosla,
читать дальше »
[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: Redist; Description: Дополнительное Пограммное Обеспечение:;
Name: Redist\directx; Description: Обновить Microsoft DirectX; Flags: unchecked;
Name: Redist\vcredist_x86_2005SP1; Description: "Установить MS Visual c++ 2005 SP1"; Flags: unchecked;
Name: Redist\vcredist_x86_2008; Description: "Установить MS Visual c++ 2008"; Flags: unchecked;
Name: Redist\dotNetFx40_Full_x86_x64; Description: "Установить Net Framework 4.0"; Flags: unchecked;

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, "&", "&&")}}"; Flags: nowait postinstall skipifsilent
Filename: {src}\Redist\directx.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\directx; Flags: waituntilterminated;
Filename: {src}\Redist\vcredist_x86_2005SP1.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\vcredist_x86_2005SP1; Flags: waituntilterminated;
Filename: {src}\Redist\vcredist_x86_2008.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\vcredist_x86_2008; Flags: waituntilterminated;
Filename: {src}\Redist\netframework.exe; WorkingDir: {src}\Redist\; Parameters: /silent; Tasks: Redist\dotNetFx40_Full_x86_x64; Flags: waituntilterminated;

Johny777 22-04-2012 23:33 1904228

valyok666,
дополню :)
[Tasks]
Name: ADOBE_READER; Description: Установить Adobe Reader 1010; Flags: unchecked dontinheritcheck
Name: NVIDIA_PX; Description: Установить Nvidia PhysX; Flags: unchecked dontinheritcheck
Name: NO_STEAM; Description: Завершить процесс сервиса Steam; Flags: unchecked dontinheritcheck
Name: RESTART; Description: перезагрузить Матрицу; Flags: unchecked dontinheritcheck
[Run]
Filename: {src}\Redist\AdobeReader\AdbeRdr_RU.exe; Parameters: /sAll /rs; WorkingDir: {src}\Redist\AdobeReader; StatusMsg: Установка Adobe Reader; Tasks: ADOBE_READER; Flags: skipifdoesntexist waituntilterminated; Languages: Russian
Filename: {src}\Redist\AdobeReader\AdbeRdr_US.exe; Parameters: /sAll /rs; WorkingDir: {src}\Redist\AdobeReader; StatusMsg: Installing Adobe Reader; Tasks: ADOBE_READER; Flags: skipifdoesntexist waituntilterminated; Languages: English

Filename: {src}\Redist\PhysX.exe; Parameters: /quiet; WorkingDir: {src}\Redist; StatusMsg: Установка Nvidia PhysX; Tasks: NVIDIA_PX; Flags: skipifdoesntexist waituntilterminated;
Filename: taskkill; Parameters: /f /t /im steam.exe; Tasks: NO_STEAM; Flags: runhidden waituntilterminated;
Filename: shutdown.exe; Parameters: /r /t 10; Tasks: RESTART; Flags: runhidden waituntilterminated;

________________________________________
шрифты стаятся так http://forum.oszone.net/thread-92136.html (сам использую этот отличный метод)

valyok666 22-04-2012 23:36 1904229

Johny777, Ну не знаю чекбоксы не поместятся :)

Ivan_009 23-04-2012 00:24 1904255

wertulll как-то так. Пример: :)

valyok666 23-04-2012 02:13 1904279

EvilAlex, если ты пытаешься делать всё копипастой то тебя жаль((

valyok666 23-04-2012 03:14 1904285

EvilAlex, Я писал что помогу да(только уже не помню когда)Целыми днями я тут не сижу у меня и другие дела есть)А вот твои 10 сообщений "Помогите" "Дайте скрипт" "Исправте" и т.д)Набивание постов вообще глубость накой чёрт мне это надо???Ты элементарное сделать не можешь

Дорого времени суток !

Нужна помощь в исправлении скрипта ...

создав и запустив инстал в строке "Осталось времени:" показывает "Тестовый прогон", а не время до окончания установки...



Здравствуйте форумчане !

Подскажите пожалуйста чем кроме фриарка можно еще паковать и главное как ?

Заранее спасибо !


Доброго времени суток форумчане !

Вы кнопки для инсталов сами делаете или же есть какая-то прога ?

Зарание спасибо за ответ ...

valyok666 23-04-2012 05:40 1904301

значит неправильно делаешь)кинь full на ргхост

wertulll 23-04-2012 05:49 1904302

valyok666

http://rghost.ru/37722145

valyok666 23-04-2012 06:49 1904308

wertulll,
download
Ты код полностью смотрел???Если бы смотрел увидел бы
WizardForm.SelectDirBitmapImage.Hide
WizardForm.SelectGroupBitmapImage.Hide
в середине кода вот поэтому код для картинки на папку не срабатывал:)

wertulll 23-04-2012 07:04 1904312

всё работает :up
недосмотрел малёха

Devils Night 23-04-2012 09:52 1904378

Цитата:

Цитата EvilAlex
я там весь код облазил »

Хреново значит лазил, и главное не в ту степь заплёл!

Цитата:

Цитата EvilAlex
извини, но мне жаль тебя »

И мне тебя жаль что ты такой лентяй!

Блин, EvilAlex, почитай справку к исдон, ты её 100% не читал!
Там же ясно написано:
Цитата:

Цитата:

;#define records
определяет будет ли включен в компиляцию файл records.inf. Он служит для автоматического определения процентных соотношений между операциями. Создается в первом прогоне установки, далее включается в установщик раскомментированием выше указанной строки. Более подробную информацию об этом файле и тестовом прогоне см. раздел "Работа с библиотекой";
Как я понял, Тестовый прогон нужен для того чтобы создался records.inf в котором будут прописаны необходимые параметры, после раскомментируй #define records и будут тебе проценты.

Ну реально разжёвано до того чтобы даже идиот понял.

El Sanchez 23-04-2012 12:51 1904450

Цитата:

Цитата Johny777
Добрые люди скажите пожалуйста как добавить разделитель во сплывающее меню? »

Johny777, смотри реализацию в Example_Menu_StatusBar.iss

Цитата:

Цитата Johny777
странное мигание скроллбокса (в частности картинок и ричэдитов) на второй странице »

Johny777, если инсталлятор запускать прямо из IDE по F9, то мерцание обеспечено, т.к. IDE запускает сетап в режиме отладки. Этот медленный процесс в совокупности с медленной операцией рисования и вызывает мерцание. При запуске двойным кликом мерцания я не заметил, скроллил как мог.

Цитата:

Цитата Johny777
есть код для выкатывающейся панели через таймер, но с его использованием вылетают непонятные и жуткие ошибки »

Johny777, глюков не увидел. Но ставить такой низкий интервал таймеру не рекомендую - минимум 10 мс, и таймеров многовато - достаточно одного. А можно и без таймеров:
читать дальше »

Код:

[code]
const
    GWL_EXSTYLE = (-20);
    WS_EX_COMPOSITED = $2000000;
    AW_HIDE = $10000;
    AW_VER_POSITIVE = $4;
    AW_VER_NEGATIVE = $8;

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function AnimateWindow(hwnd: HWND; dwTime, dwFlags: DWORD): BOOL; external 'AnimateWindow@user32.dll stdcall';

var
    SettingPanel: TPanel;

procedure NewButton1Click(Sender: TObject);
begin
    with SettingPanel do
    begin
        //временно отрубаем стиль WS_EX_COMPOSITED, а то AnimateWindow плавненько не отработает
        SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) xor WS_EX_COMPOSITED);
        AnimateWindow(Handle, 1000, (AW_VER_POSITIVE * dword(not Visible)) or ((AW_HIDE or AW_VER_NEGATIVE) * dword(Visible)));
        SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED);
        Visible := not Visible;
    end;
end;

procedure InitializeWizard();
begin
    SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED);

    SettingPanel := TPanel.Create(WizardForm);
    with SettingPanel do
    begin
        Parent := WizardForm;
        SetBounds(ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.OuterNotebook.ClientHeight);
        Visible := False;
    end;

    with TNewButton.Create(WizardForm) do
    begin
        Parent := WizardForm;
        SetBounds(ScaleX(40), ScaleY(327), ScaleX(75), ScaleY(25));
        Caption := 'open';
        OnClick := @NewButton1Click;
    end;
end;



Цитата:

Цитата Johny777
другой пример использвания таймера привел к тому что он (таймер) не работал (то была проверки на странице выбора директории установки)
речь идёт об этом незамысловатом примере: »

Johny777, такую проверку нужно делать в обработчике OnChange компонента WizardForm.DirEdit:
читать дальше »

Код:

[code]
procedure DirEditOnChange(Sender: TObject);
begin
    WizardForm.NextButton.Enabled := TEdit(Sender).Text <> '123';
end;

procedure InitializeWizard();
begin
    WizardForm.DirEdit.OnChange := @DirEditOnChange;
end;


Johny777 23-04-2012 13:02 1904455

El Sanchez,
спасибо добрый человек! :)
буду разбирать
Цитата:

Цитата El Sanchez
таймеров многовато »

ну innocallback для процентов стоит
читать дальше »
Код:

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

[Files]
Source: compiler:innocallback.dll; Flags: dontcopy
Source: {win}\Help\*; DestDir: {app}; Flags: external recursesubdirs

[  code]
type
TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);

var
PercentsTimer: LongWord;
PercentsLabel: TLabel;

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';

Function NumToStr(Float: Extended): String;
Begin
Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
SetLength(Result, Length(Result)-1);
End;

Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
with WizardForm.ProgressGauge do
begin
PercentsLabel.Caption:= 'Выполнено ' + NumToStr((Position*100)/Max) + ' %';
end;
End;

procedure DeinitializeSetup();
begin
KillTimer(0, PercentsTimer);
end;

procedure InitializeWizard();
begin
PercentsLabel:= TLabel.Create(WizardForm);
with PercentsLabel do
begin
Left:= WizardForm.ProgressGauge.Left;
Top:= WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10);
Width:= WizardForm.StatusLabel.Width;
Height:= WizardForm.StatusLabel.Height;
AutoSize:= False;
Transparent := True;
Parent:= WizardForm.InstallingPage;
end;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
if CurStep = ssInstall then
begin
PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
end;
end;


и для того чтобы форма задач двигалась вместе с основным окном
читать дальше »
Код:

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

[Files]
Source: compiler:innocallback.dll; DestDir: {tmp}; Flags: dontcopy

[  code]
const
  WM_MOVE = $3;

  GWL_WNDPROC = -4;

type
  TCallbackProc = function(h:hWnd;Msg,wParam,lParam:Longint):Longint  ;

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function WndProcCallBack(P:TCallbackProc;ParamCount:integer  ):LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function SetWindowPos(hWnd: HWND; hWndInsertAfter: HWND; X, Y, cx, cy: Integer; uFlags: UINT): BOOL; external 'SetWindowPos@user32.dll stdcall';

var
Form1: TForm;
OldProc: Longint;

function MyProc(h: HWND; Msg, wParam, lParam: longint): Longint;
begin
  if Msg=WM_MOVE then SetWindowPos(Form1.Handle, 0, WizardForm.Left+WizardForm.Width+5, WizardForm.Top, 0, 0, $415);
  Result:= CallWindowProc(OldProc, h, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
  Form1:= TForm.Create(MainForm);
  Form1.SetBounds(WizardForm.Left+WizardForm.Width+5  , WizardForm.Top, 100, 358);
  Form1.BorderStyle:= bsSingle;
  Form1.Show;

  OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, WndProcCallBack(@MyProc, 4));
end;

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


Цитата:

Цитата El Sanchez
проверку нужно делать в обработчике OnChange »

отлично,
Хочу переделать запрет на кириллицу в пути для отображения лейбла и блокирования кнопки далее вместо меседж бокса.
Займусь теперь.

,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,

во время выката панель плавно появляется, но не обновляется (т.е. мемо пролога появляется в самом конце после анимации), что не есть красиво!
менял панель на саму мемо - результат тот же
Ты бы не мог пожалуйста, если не трудно, немного переделать старый пример под innocallback?
Может так будет достигнуто желаемое.
Если нужно залью весь скрипт

nikitich95 23-04-2012 15:28 1904527

Вложений: 1
Спасибо)) Рабочий, но правда возникла небольшая проблема:
Нужно убрать разделители и опустить кнопки.
Вот скрин:

El Sanchez 23-04-2012 18:22 1904620

Цитата:

Цитата Johny777
во время выката панель плавно появляется, но не обновляется (т.е. мемо пролога появляется в самом конце после анимации), что не есть красиво! »

Лады, переделаю.

Цитата:

Цитата Johny777
под innocallback »

Johny777, зачем тебе вообще эта библиотека в Restools, когда там вместо нее можно использовать ф-ию CallbackAddr?

Цитата:

Цитата Johny777
Хочу переделать запрет на кириллицу в пути »

Чтоб ты ничего не выдумывал, то вот функция:
IsStringCyrillic.iss

Код:

function IsStringCyrillic(Str: String): Boolean;
var
    objRegExp: Variant;
begin
    try
        objRegExp := CreateOleObject('VBScript.RegExp');
    except
        ShowExceptionMessage;
    end;

    if objRegExp.Test(Str) then
    begin
        objRegExp.Pattern := '[\u0400-\u04FF,\u0500-\u052F,\u2DE0-\u2DFF,\uA640-\uA69F]';
        Result := objRegExp.Execute(Str).Count = 1;
    end;
end;


Johny777 23-04-2012 18:35 1904627

Цитата:

Цитата El Sanchez
Лады, переделаю. »

Спасибо! Скрипт нужен для удобства?
Цитата:

Цитата El Sanchez
ты ничего не выдумывал »

да есть уже в приготовом виде :)
http://forum.ru-board.com/topic.cgi?...&limit=1&m=2#1

но спасибо за IsStringCyrillic.iss

Ivan_009 23-04-2012 19:11 1904648

Возможно ли сделать в Inno Fairy Пропорциональное растягивание изображения до размеров окна.Тоесть, чтобы неуказывать размер вручную... :)

Johny777 23-04-2012 20:06 1904676

Ivan_009,
почему именно Inno Fairy?
есть ведь isgsg.dll#
________________
вот наполовину готово
текущее разрешение поставил ) (при каком разрешении монитора запускают то и будет)
только не используй тк скрипт почистить нужно
А как растянуть хз
читать дальше »
Код:

//Пример работы с fairy.dll. Через c .jpg

#include "fairy.iss"

[Setup]
AppName=fairy
AppVerName=fairy Ver 2.0
DefaultDirName={pf}\fairy
DefaultGroupName=fairy
OutputDir=.
SolidCompression=yes

[Files]
Source: miku.jpg; Flags: dontcopy

[  code]
///////// начало
function DeleteDC(hDC: Integer): Integer;
external 'DeleteDC@GDI32 stdcall';

function CreateDC(lpDriverName, lpDeviceName, lpOutput: String; lpInitData: Integer): Integer;
external 'CreateDCA@GDI32 stdcall';

function GetDeviceCaps(hDC, nIndex: Integer): Integer;
external 'GetDeviceCaps@GDI32 stdcall';



Const
    HORZRES = 8;    //horizontal resolution
    VERTRES = 10;  //vertical resolution
    BITSPIXEL = 12; //bits per pixel
    PLANES = 14;    //number of planes (color depth=bits_per_pixel*number_of_planes)
////////// конец

function GetSysColor(nIndex: Integer): DWORD; external 'GetSysColor@user32.dll stdcall';
function GetWindowLong(hWnd, nIndex: Integer): Longint; external 'GetWindowLongA@user32.dll';

var
  GifFrameCount: Integer;

function ColorToRGB(Color: TColor): Longint;
begin
  if Color < 0 then
    Result := GetSysColor(Color and $000000FF)
  else
    Result := Color;
end;

procedure InitializeWizard();
var
  Btn: TNewButton;
  ImgFile: AnsiString;
  S: AnsiString;
  x, y: Integer;
  BAlpha, TransparentColor: Integer;
  ///////// начало
  xres, yres, bpp, pl, tmp: Integer;
  hDC: Integer;
  ////////// конец
begin
///////// начало
    //get resolution & BPP
    hDC := CreateDC('DISPLAY', '', '', 0);
    pl := GetDeviceCaps(hDC, PLANES);
    bpp := GetDeviceCaps(hDC, BITSPIXEL);
    xres := GetDeviceCaps(hDC, HORZRES); //horizontal resolution
    yres := GetDeviceCaps(hDC, VERTRES); //vertical resolution

////////// конец
  InitFairy(GetWindowLong(MainForm.Handle, -8), 0, 20);
  ImgFile := 'miku.jpg';
  ExtractTemporaryFile(ImgFile);
  x := -xres div 2;  // Расположение изображения (горизонталь [X]). По умолчанию -1280.
  y := -yres div 2;  // Расположение изображения (Вертикаль [Y]). По умолчанию -960.
  BAlpha := 255;    // Прозрачность изображения. По умолчанию 255.
  TransparentColor := ColorToRGB(clNone);
  AddImgToList(x, y, BAlpha, TransparentColor, ExpandConstant('{tmp}\'+ImgFile))
  ShowFairyEx(0);
end;

procedure DeinitializeSetup();
begin
  HideFairy;
  WizardForm.Hide;
  UninitFairy;
end;


nikitich95 23-04-2012 20:55 1904698

Вложений: 1
Сори) забыл. Вот скрипт:
Если чего-то не хватает - скажите.

valyok666 23-04-2012 22:13 1904719

Вложений: 1
nikitich95, Ты OuterNotebook и InnerNotebook растяни в редакторе и меняй дальше куда хочешь :)

P.S Прикрепляй полный скрипт!Со всеми файлами!
Разделители можно убрать так-->
читать дальше »

procedure InitializeWizard();
begin
with WizardForm.Bevel do Hide;
with WizardForm.Bevel1 do Hide;
end;

detiedyatosla 23-04-2012 23:01 1904736

valyok666 а можно подробней о OuterNotebook ?

valyok666 23-04-2012 23:14 1904740

detiedyatosla, Cкриншот посмотри и поймёшь:)

Johny777 23-04-2012 23:43 1904751

detiedyatosla,



и чтобы окно было аккурат по центру экрана напиши в процедуру InitializeWizard строку *(выделил жирным)
procedure InitializeWizard;
begin
WizardForm.Position:= poScreenCenter;
end;

_________________________________________________________________________

Вопрос
для того чтобы заблокировать закрытие окна через alt + F4 нужно использовать ?

Код:

const
    WS_EX_NOACTIVATE = $8000000;
    GWL_EXSTYLE = (-20);

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';

procedure InitializeWizard();
begin
  SetWindowLong(WizardForm.Handle,GWL_EXSTYLE,GetWindowLong(WizardForm.Handle,GWL_EXSTYLE) or WS_EX_NOACTIVATE);
end;

(нужно запретить закрытие одной из форм. Slim_Form.BorderIcons := []; а вот чудесно работающую комбинацию alt + F4 никто не отменял :))

Temyraz@fb 24-04-2012 09:39 1904878

привет, друзья. вот с чем столкнулся я. есть два варианта установки. Check: Run_A; и Check: Run_B;
вот не могу понять как это указать в компонентах
Код:

[Components]

Name: backup_db; Description: {cm:MakeDBBackupComponent}; Flags: checkablealone; Types: custom full; Languages: ; ExtraDiskSpaceRequired: 5000000
Name: backup_app; Description: {cm:MakeApplicationBackupComponent}; Flags: checkablealone; Types: custom full; ExtraDiskSpaceRequired: 50000000


Name: Tomcat; Description: {cm:ApacheTomcatComponent}; Flags: fixed; Types: custom compact full
Name: PostgreSQL; Description: {cm:PostgresComponent}; Types: custom full; Flags: checkablealone;ExtraDiskSpaceRequired: 16080384; Languages:

первые две строчки по Check: Run_A;
а вторые по Check: Run_B;
при попытке просто вставить в это строчки чек, то выдает ошибку: could not call proc

R.i.m.s.k.y. 24-04-2012 09:47 1904885

Temyraz@fb, компилятор ругается в этом месте? или в другом? или ругается на стадии выполнения?
полный код

Temyraz@fb 24-04-2012 09:55 1904888

ругается тут
Код:

function Run_A: Boolean; begin Result:=CheckBoxA.Checked; end;
function Run_B: Boolean; begin Result:=CheckBoxB.Checked; end;

да при выполнении.

valyok666 24-04-2012 10:43 1904923

Temyraz@fb, кинь полный скрипт со всеми файлами!Желательно архивом

Temyraz@fb 24-04-2012 10:46 1904926

полный скрипт
читать дальше »
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Synergy Center"
#ifndef MyAppVer
        #define MyAppVer "2.4"
#endif
#ifndef MyAppPatch
        #define MyAppPatch "11"
#endif
#ifndef MyAppBuild
        #define MyAppBuild "0"
#endif
#define MyAppPublisher "ÎÎÎ Èíñòèòóò Âûñîêèõ òåõíîëîãèé ÁåëÃÓ"

#define MyAppURL "http://www.ivt.su/"
#define InstalledLocalURL "http://localhost"

[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={{903E5749-D9EC-45A3-A5E1-B0621695F680}
AppName={#MyAppName}
AppVerName={#MyAppName} {#MyAppVer}.{#MyAppPatch}
VersionInfoVersion={#MyAppVer}.{#MyAppPatch}.{#MyAppBuild}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
;OutputDir={#MyOutputDir}
UpdateUninstallLogAppName=no
UsePreviousAppDir=yes
CreateUninstallRegKey=no
;DisableDirPage=yes

OutputBaseFilename=Synergy Center {#MyAppVer}.{#MyAppPatch}
Compression=lzma
SolidCompression=yes
WizardImageFile=wizard\WizModernImage-IS.bmp
WizardSmallImageFile=wizard\WizModernSmallImage-IS.bmp

[Languages]
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl; LicenseFile: dontcopy\license_ru.rtf
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl; LicenseFile: dontcopy\license_ua.rtf

[Registry]
Root: HKLM; Subkey: Software\IVTBelGU\Synergy Center; ValueType: string; ValueName: Version; ValueData: {#MyAppVer}.{#MyAppPatch}; Check: Run_B; Flags: uninsdeletekey

[Dirs]
Name: {app}\apache-tomcat; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\files; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\nginx; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\dbinit; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\db_update; Flags: uninsneveruninstall; Check: Run_A; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Check: Run_A; Languages:

[Files]
Source: apache-tomcat\*; DestDir: {app}\apache-tomcat; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: apache-tomcat\msvcr71.dll; DestDir: {sys}\; Check: Run_B; Flags: onlyifdoesntexist
;Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: configs\WEB-INF\settings.properties; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\nginx_to_autorun.reg; DestDir: {app}\nginx\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\add_reg.bat; DestDir: {app}\nginx\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\*; DestDir: {app}\nginx; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: dbinit\*; DestDir: {app}\dbinit; Check: Run_B; Flags: ignoreversion recursesubdirs; AfterInstall: ReplacePathInConfigsPass
Source: UserMenu\*; DestDir: {app}; Check: Run_B; Flags: ignoreversion recursesubdirs; Languages: ; AfterInstall: ReplacePathInConfigs
;Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\dbinit; Check: Run_B; Flags: ignoreversion




Source: {app}\apache-tomcat\webapps\ROOT\*; DestDir: {app}\backups\Webcontent-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs external uninsneveruninstall; Components: backup_app
;Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: StopTomcat
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: apache-tomcat\bin\service.bat; DestDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: configs\WEB-INF\settings.properties; Check: Run_A; Flags: dontcopy
;Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: db_update\*; DestDir: {app}\db_update; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; Languages:
;Source: D:\work\_Stable\setup\db\update\{#MyAppVer}\*.sql; DestDir: {app}\db_update\sql_scripts; Flags: ignoreversion
;Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\db_update\sql_scripts; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs

Source: dontcopy\netstat1.bat; Flags: dontcopy
Source: dontcopy\check.bat; Check: Run_A; Flags: dontcopy
Source: dontcopy\check.bat; Check: Run_B; Flags: dontcopy

[Icons]
Name: {group}\{#MyAppName}; Check: Run_B; Filename: {#InstalledLocalURL}
;Name: {group}\Start Tomcat; Filename: {app}\TomcatServiceStart.exe; WorkingDir: {app}\; Comment: {cm:RunTomcat}; Flags: runminimized; Components:
;Name: {group}\Stop Tomcat; Filename: {app}\TomcatServiceStop.exe; WorkingDir: {app}\; Comment: {cm:StopTomcat}; Flags: runminimized
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\admin_manual.pdf; Check: Run_B; Languages: ru
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\user_manual.pdf; Check: Run_B; Languages: ru
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_admin.pdf;  Check: Run_B; Languages: ua
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_user.pdf; Check: Run_B; Languages: ua
Name: {group}\{cm:Rukovodstvo_administratora}; Check: Run_B;  Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\Rukovodstvo_administratora.pdf
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Check: Run_B; Filename: {uninstallexe}






[Run]
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden; Check: Run_B; StatusMsg: Installing Apache Tomcat as Service
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; Components: PostgreSQL; Check: Run_B; StatusMsg: {cm:StartingTomcat}
Filename: {app}\dbinit\createAndInitDb.bat; Parameters: """{code:GetPsqlPath}""  {language}"; WorkingDir: {app}\dbinit\; Flags: shellexec runhidden waituntilterminated; Check: Run_B; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}
Filename: {app}\nginx\add_reg.bat; Check: Run_B; Flags: shellexec runhidden
Filename: {app}\start_nginx.bat; Check: Run_B; Flags: shellexec runhidden
Filename: {app}\dbinit\installAdditionalCards.bat; Parameters: """{code:GetPsqlPath}"" {language}"; WorkingDir: {app}\dbinit\;  Check: Run_B; Flags: shellexec runhidden waituntilterminated; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}; Tasks: IntstallDefaultShemes
Filename: {app}\Synergy Center.url; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent shellexec; Check: Run_B; Components: PostgreSQL


;Filename: {app}\postgresql\bin\pg_dump.exe; Parameters: "-h localhost -p 5432 -U postgres -F c -b -v -f ""{app}\backups\db-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}.backup"" sc"; Flags: waituntilterminated; StatusMsg: ????? ??????? ??; Components: backup_db
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " remove"; WorkingDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: runhidden
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: runhidden
Filename: {app}\db_update\make_db_backup.bat; WorkingDir: {app}\; Flags: shellexec  waituntilterminated; StatusMsg: StatusMsg: {cm:BackupingCurrentDB}; Check: Run_A; Components: backup_db
;Filename: NET; Parameters: "STOP ""Apache Tomcat"""; Flags: runhidden; StatusMsg: {cm:StoppingTomcat}
Filename: {app}\db_update\run_db_update.bat; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; Check: Run_A; StatusMsg: {cm:UpdatingDatabase}
;Filename: java; Parameters: " -jar --patches_path=""./sql_scripts/"" --log=""./sql_scripts/sql_scripts_log.log"" --sc_properites_path=""{app}/apache-tomcat/webapps/ROOT/WEB-INF/settings.properties"" "; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; StatusMsg: {cm:UpdatingDatabase}
;Filename: rmdir; Parameters: "/S /Q ""{app}\apache-tomcat\work\Catalina\"""; Flags: shellexec runhidden; StatusMsg: {cm:StartingTomcat}
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; Check: Run_A; StatusMsg: {cm:StartingTomcat}





[Components]
Name: Tomcat; Description: {cm:ApacheTomcatComponent}; Flags: fixed; Types: custom compact full
Name: PostgreSQL; Description: {cm:PostgresComponent}; Types: custom full; Flags: checkablealone;ExtraDiskSpaceRequired: 16080384; Languages:

Name: backup_db; Description: {cm:MakeDBBackupComponent}; Flags: checkablealone; Types: custom full; Languages: ; ExtraDiskSpaceRequired: 5000000
Name: backup_app; Description: {cm:MakeApplicationBackupComponent}; Flags: checkablealone; Check: Run_A; Types: custom full; ExtraDiskSpaceRequired: 50000000

[Tasks]
Name: IntstallDefaultShemes; Description: {cm:IntstallDefaultShemes}; Flags: checkablealone; Components: Postgresql; Languages:

















[ Code]
var
  CheckBoxA: TNewCheckBox;
  CheckBoxB: TNewCheckBox;

  PasswordPage: TInputQueryWizardPage;
  DataDirPage: TInputDirWizardPage;

  UserVarPass: String;
  PathToPsql: String;
  CheckLicense: TNewCheckBox;



procedure ReplacePathInConfigsReg();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','\\');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  for i:=0 to GetArrayLength(fileStrings)-1 do
  begin
                if ((Pos(':'+Port+' ',fileStrings[i])>0) and (Pos('LISTENING',fileStrings[i]) >0)) then
                        begin
                                Result := true;
                                exit;
                        end;
  end;
  Result := false;
end;



procedure LicenseOnClick(Sender: TObject);
begin
  WizardForm.NextButton.Enabled := false;
  if (CheckLicense.Checked) = True then

  begin
    WizardForm.LicenseAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := True;
  end else
  begin
    WizardForm.LicenseNotAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := False;
  end;
end;


function  ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpLicense: Result := True;
  end;
end;




function GetBuildNumber(param: String): String;
    var
          BuildVersion: String;
    begin
          LoadStringFromFile(ExpandConstant('buildNumber.txt'), BuildVersion);
          Result := BuildVersion;
    end;




function GetPsqlPath(Param: String): String;
begin
        Result := PathToPsql + '\psql.exe';
end;

procedure ReplacePathInConfigs();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','/');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;



procedure ReplacePathInConfigsPass();
var filecontent: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  StringChange(filecontent,'{PG_PASS}',UserVarPass);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;




procedure StopTomcat();
var
  ErrorCode: Integer;
begin
  if not Exec('NET',' STOP "Apache Tomcat"', '' ,SW_HIDE, ewWaitUntilTerminated, ErrorCode) then
  begin
    MsgBox('Fail to stop tomcat', mbInformation, mb_Ok);
  end;
end;





function CheckDBUpdateIsOk(): Boolean;
var filecontent: String;
var pathToLog: String;
begin
  Result:= false;
  pathToLog:=ExpandConstant('{app}')+'\db_update\db_update_log.log';
  LoadStringFromFile(pathToLog, filecontent);
  if (Pos('Update succesfully',filecontent)>0) then
  begin
        Result:= true;
  end

end;








procedure AddDefaultToConfig();
var filecontent_default: String;
var configStrings,defaultStrings: TArrayOfString;
var pathToConfig,pathToDefaultConfig,appPath: String;
var langForConfig,currentKey: String;
var currentPos,i,j: Integer;
var containKey: Boolean;
begin

  ExtractTemporaryFile('settings.properties');
  pathToConfig:=ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF\settings.properties';
  pathToDefaultConfig:=ExpandConstant('{tmp}\settings.properties');
  appPath:=ExpandConstant('{app}');
  langForConfig:=ExpandConstant('{language}');

  LoadStringFromFile(pathToDefaultConfig, filecontent_default);
  StringChange(appPath,'\','/');
  StringChange(filecontent_default,'{INSTALL_PATH}',appPath);
  StringChange(filecontent_default,'{LANGUAGE}',langForConfig);
  SaveStringToFile(pathToDefaultConfig, filecontent_default, false);

  LoadStringsFromFile(pathToDefaultConfig, defaultStrings);

  LoadStringsFromFile(pathToConfig, configStrings);

  for i:=0 to GetArrayLength(defaultStrings)-1 do
  begin
                currentPos:=Pos('=',defaultStrings[i]);
                if ((currentPos>0)) then
                        begin
                                currentKey:=Trim(Copy(defaultStrings[i], 0, currentPos-1));
                                containKey:=false;
                                  for j:=0 to GetArrayLength(configStrings)-1 do
                                        begin
                                                if ((Pos(currentKey,configStrings[j])>0)) then
                                                begin
                                                        containKey:=true;
                                                end;
                                        end;
                                if (containKey=false) then
                                        begin
                                               
                                                SetArrayLength(configStrings, GetArrayLength(configStrings)+1);
                                                configStrings[GetArrayLength(configStrings)-1]:=defaultStrings[i];
                                        end
                        end;
  end;
  SaveStringsToFile(pathToConfig, configStrings, false);
end;


var
  TodaysName : String;

function GetToday : String;
begin
  Result := GetDateTimeString ('yyyy.mm.dd hh.nn.ss', '-', #0);
end;

function GetTodaysName (Param: String): String;
begin
  if ('' = TodaysName) then
  begin
    TodaysName := GetToday ();
  end;
  Result := TodaysName;
end;



procedure CurPageChanged(CurPageID: Integer);
  var ResultCode: Integer;
Begin
If (CurPageID=wpInfoAfter)or(CurPageID=wpFinished ) then
        begin
        if (not CheckDBUpdateIsOk) then begin
                        MsgBox(ExpandConstant('{cm:ErrorUpdatingDB}')+' ('+ExpandConstant('{app}')+'\backups)', mbCriticalError, mb_Ok);
                        Abort;
                end
        end
        if CurPageID=wpWelcome then
    begin
      WizardForm.NextButton.Enabled := False;
    end;
end;



function Run_A: Boolean; begin Result:=CheckBoxA.Checked; end;
function Run_B: Boolean; begin Result:=CheckBoxB.Checked; end;


Function InitializeSetup: Boolean;
  var ResultCode: Integer;
  var fileStrings: TArrayOfString;
  var pathToOutput: String;
  var outputFile: String;


Begin

        If (ExpandConstant('{reg:HKLM\Software\JavaSoft\Java Runtime Environment,CurrentVersion}') = '1.6') then
                Result:= True
        else MsgBox(ExpandConstant('{cm:SetupJRE}'), mbInformation, mb_Ok);

       
        outputFile:=ExpandConstant('{tmp}\netstatoutput.log');
        pathToOutput:=ExpandConstant('{tmp}\');
        ExtractTemporaryFile('netstat1.bat');
        if Exec(ExpandConstant('{tmp}\netstat1.bat'),  'netstatoutput.log', pathToOutput, SW_HIDE, ewWaitUntilTerminated, ResultCode) then
        begin
                //MsgBox(outputFile, mbInformation, mb_Ok);
                // handle success if necessary; ResultCode contains the exit code
                LoadStringsFromFile(outputFile, fileStrings);
                DeleteFile(outputFile);
                DeleteFile(ExpandConstant('{tmp}\netstat1.bat'));
                If (CheckPortUsing('80',fileStrings) and (Result=true)) then
                begin
                  Result := MsgBox(ExpandConstant('{cm:Port80InUse}'), mbConfirmation, MB_YESNO) = idYes;
                end
  end
  else MsgBox('Error ', mbInformation, mb_Ok);
End;

var
ReturnCode: Integer;
procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.LicenseNotAcceptedRadio.Hide;
  WizardForm.LicenseAcceptedRadio.Hide;
  { CheckLicense }
  CheckLicense := TNewCheckBox.Create(WizardForm);
  with CheckLicense do
  begin
    Name := 'CheckLicense';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(176);
    Top := ScaleY(288);
    Width := ScaleX(200);
    Height := ScaleY(17);
    OnClick := @LicenseOnClick;
    CheckLicense.Caption := WizardForm.LicenseAcceptedRadio.Caption;
  end;

  with WizardForm.LicenseMemo do
  begin
    Left := ScaleX(164);
    Top := ScaleY(0);
    Width := ScaleX(333);
    Height := ScaleY(284);
    Parent := WizardForm.WelcomePage;
  end;
        CheckLicense.Checked := false;

  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
  DataDirPage.Add('');
  DataDirPage.Values[0] := GetPreviousData('DataDir', 'C:\Program Files\PostgreSQL\9.0\bin');

  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('{cm:PasswordInputCaption}') ,ExpandConstant('{cm:PasswordInputDescription}'), ExpandConstant('{cm:PasswordInputSubCapton}') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);


  { CheckBoxA }
  CheckBoxA := TNewCheckBox.Create(WizardForm);
  with CheckBoxA do
  begin
    Name := 'CheckBoxA';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(176);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'âàðèàíò 1';
  end;
  { CheckBoxB }
  CheckBoxB := TNewCheckBox.Create(WizardForm);
  with CheckBoxB do
  begin
    Name := 'CheckBoxB';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(208);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'Âàðèàíò 2';
  end;

  if RegKeyExists(HKEY_CURRENT_USER, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_CURRENT_USER, 'Software\IVTBelGU\Synergy Center')
  then
    begin

      CheckBoxA.Enabled:=true;
      CheckBoxA.Checked:=true;

      CheckBoxB.Enabled:=false;
      CheckBoxB.Checked:=false;
    end

  else
    begin
      CheckBoxA.Enabled:=false;
      CheckBoxA.Checked:=false;

      CheckBoxB.Enabled:=true;
      CheckBoxB.Checked:=true;
    end;
CheckBoxA.visible:=false;
CheckBoxB.visible:=false;


end;


function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;
       
       
begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;


begin
if CheckBoxA.Checked = true then
begin


begin
  Result := True;
 If CurPageID = wpSelectDir then
  begin
        If (FileSearch('settings.properties', ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF')='') then
        begin
                MsgBox(ExpandConstant('{cm:ErrorSCNotFound}'), mbCriticalError, mb_Ok);
                Result:=False;
        end
 end;


  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;


end;


if CheckBoxB.Checked = true then
  begin


  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;

end;

end;


R.i.m.s.k.y. 24-04-2012 10:49 1904929

Temyraz@fb, потому что ты сначала делаешь
CheckBoxA.visible:=false;
CheckBoxB.visible:=false;

И позже в списке компонентов пытаешься обратиться к тому чего нет
Добавь проверку в Run_A
if CheckBoxA.visible = true then ...

Temyraz@fb 24-04-2012 10:54 1904932

да суть в том что
CheckBoxA.visible:=false;
CheckBoxB.visible:=false;
нужны для того чтоб пользователь не видел это.

Johny777 24-04-2012 11:25 1904945

Temyraz@fb,
я ж тебе писал
для компонентов не прокатит через Ceck:
сам тогда споткнулся об эту проблему. Теперь у меня их нет.
используй реестр для проверки какой компонент долже быть в списке, а какой не должен. Тебе это как раз и поможет
(пример давал Devil Nights страниц 10-5 назад)

Temyraz@fb 24-04-2012 11:27 1904947

а как сделать так чтоб не было проблем с ним? но при этом окно check не было видно

Johny777 24-04-2012 11:29 1904948

Цитата:

Цитата Temyraz@fb
окно check »

что это? Имеешь ввиду чеклистбокс, где компоненты перечислены?
Смотри
у тебя в зависимости от ключей реестра определённые действия в коде
и зависят они от проверки наличия ключа
в примере как раз в зависимости от ключа появится/не появися чекбокс
не нужно привязывать проверку к тем двум невидимым чекбоксам. У них своя задача

для компонентов эта проверка
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
OutputDir=userdocs:Inno Setup Examples Output

[Types]
Name: "full"; Description: "Full installation"
Name: "compact"; Description: "Compact installation"
Name: "custom"; Description: "Custom installation"; Flags: iscustom

[Components]
Name: "program"; Description: "Program Files"; Check: Skip
Name: "help"; Description: "Help File"

[ Code]
function Skip:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If RegKeyExists(HKEY_CURRENT_USER, 'Software\Jordan Russell\Inno Setup') then
  Result:=False
end;
end;


Temyraz@fb 24-04-2012 13:43 1905006

спасибо, сделал как ты сказал, помогло

Ivan_009 24-04-2012 18:43 1905181

Как сделать выделенную область черным цветом а сам текст белым. Пробовал через редактор форм почемуто не пулучается.Подскажите если не трудно... :not-me:

Johny777 24-04-2012 19:08 1905192

Ivan_009,
всё просто :)
1.
в дизайнере на соответствующей странице *(выбери её слева) нажми на это окошко (InfoBeforeMemo) как у тебя на картинке
выбери для него *(справа) в сроке Color цвет clBlack
2.
в качестве файла используй RTF ("Пуск" - "все программы" - "стандартные" - "WordPad") документ и поменяй в нём цвет строк и слов на белый или любой другой который будет виден на чёрном фоне
пример
[Setup]
InfoBeforeFile=info_before-Russian.rtf

файл пример ниже
но скроллбар будет белым (это если без скина)
______________________________________________
в него же можно вписывать ссылки
они будут кликабельны

http://forum.oszone.net/thread-218969-166.html

Ivan_009 24-04-2012 19:15 1905200

Johny777 класс :up. Большое спасибо.

R.i.m.s.k.y. 24-04-2012 19:59 1905229

подскажите, пожалуйста, как узнать "канальность" звука в windows

Temyraz@fb 25-04-2012 09:23 1905492

не знаю почему то сначала работает так как надо, а потом нет(((
помогите если вам не сложно.
есть инсталер
читать дальше »
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Synergy Center"
#ifndef MyAppVer
        #define MyAppVer "2.4"
#endif
#ifndef MyAppPatch
        #define MyAppPatch "11"
#endif
#ifndef MyAppBuild
        #define MyAppBuild "0"
#endif
#define MyAppPublisher ""
#define MyAppURL ""
#define InstalledLocalURL "http://localhost"

[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={{903E5749-D9EC-45A3-A5E1-B0621695F680}
AppName={#MyAppName}
AppVerName={#MyAppName} {#MyAppVer}
VersionInfoVersion={#MyAppVer}.{#MyAppPatch}.{#MyAppBuild}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir={#MyOutputDir}
OutputBaseFilename=SynergyCenter{#MyAppVer}Setup
Compression=lzma
SolidCompression=yes
LicenseFile=dontcopy\license_ru.rtf
WizardImageFile=wizard\WizModernImage-IS.bmp
WizardSmallImageFile=wizard\WizModernSmallImage-IS.bmp

[Languages]
;Name: en; MessagesFile: i18n\Default.isl,i18n\sc_english.isl; LicenseFile: dontcopy\license_en.rtf
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl; LicenseFile: dontcopy\license_ru.rtf
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl; LicenseFile: dontcopy\license_ua.rtf

[Registry]
Root: HKLM; Subkey: Software\Synergy Center; ValueType: string; ValueName: Version; ValueData: {#MyAppVer}.{#MyAppPatch}; Flags: uninsdeletekey

[Dirs]
Name: {app}\apache-tomcat; Flags: uninsneveruninstall; Languages:
Name: {app}\files; Flags: uninsneveruninstall; Languages:
Name: {app}\nginx; Flags: uninsneveruninstall; Languages:
Name: {app}\dbinit; Flags: uninsneveruninstall; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Languages:

[Files]
Source: apache-tomcat\*; DestDir: {app}\apache-tomcat; Flags: ignoreversion recursesubdirs createallsubdirs
Source: apache-tomcat\msvcr71.dll; DestDir: {sys}\; Flags: onlyifdoesntexist
Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Flags: ignoreversion recursesubdirs createallsubdirs
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Flags: ignoreversion recursesubdirs createallsubdirs
Source: configs\WEB-INF\settings.properties; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\nginx_to_autorun.reg; DestDir: {app}\nginx\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\add_reg.bat; DestDir: {app}\nginx\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\*; DestDir: {app}\nginx; Flags: ignoreversion recursesubdirs createallsubdirs
Source: dbinit\*; DestDir: {app}\dbinit; Flags: ignoreversion recursesubdirs; AfterInstall: ReplacePathInConfigsPass
Source: UserMenu\*; DestDir: {app}; Flags: ignoreversion recursesubdirs; Languages: ; AfterInstall: ReplacePathInConfigs
Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\dbinit; Flags: ignoreversion
Source: dontcopy\netstat1.bat; Flags: dontcopy
Source: dontcopy\check.bat; Flags: dontcopy

[Icons]
Name: {group}\{#MyAppName}; Filename: {#InstalledLocalURL}
;Name: {group}\Start Tomcat; Filename: {app}\TomcatServiceStart.exe; WorkingDir: {app}\; Comment: {cm:RunTomcat}; Flags: runminimized; Components:
;Name: {group}\Stop Tomcat; Filename: {app}\TomcatServiceStop.exe; WorkingDir: {app}\; Comment: {cm:StopTomcat}; Flags: runminimized
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\admin_manual.pdf; Languages: ru
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\user_manual.pdf; Languages: ru
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_admin.pdf; Languages: ua
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_user.pdf; Languages: ua
Name: {group}\{cm:Rukovodstvo_administratora}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\Rukovodstvo_administratora.pdf
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Filename: {uninstallexe}

[Run]
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden; StatusMsg: Installing Apache Tomcat as Service
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; Components: PostgreSQL; StatusMsg: {cm:StartingTomcat}
Filename: {app}\dbinit\createAndInitDb.bat; Parameters: """{code:GetPsqlPath}""  {language}"; WorkingDir: {app}\dbinit\; Flags: shellexec runhidden waituntilterminated; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}
Filename: {app}\nginx\add_reg.bat; Flags: shellexec runhidden
Filename: {app}\start_nginx.bat; Flags: shellexec runhidden
Filename: {app}\dbinit\installAdditionalCards.bat; Parameters: """{code:GetPsqlPath}"" {language}"; WorkingDir: {app}\dbinit\; Flags: shellexec runhidden waituntilterminated; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}; Tasks: IntstallDefaultShemes
Filename: {app}\Synergy Center.url; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent shellexec; Components: PostgreSQL

[UninstallRun]
Filename: NET; Parameters: "STOP ""Apache Tomcat"""; Flags: runhidden
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " remove"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden; Components:
Filename: {app}\stop_nginx.bat; WorkingDir: {app}\; Components:

[Components]
Name: Tomcat; Description: {cm:ApacheTomcatComponent}; Flags: fixed; Types: custom compact full
Name: PostgreSQL; Description: {cm:PostgresComponent}; Types: custom full; Flags: checkablealone; ExtraDiskSpaceRequired: 16080384; Languages:

[Tasks]
Name: IntstallDefaultShemes; Description: {cm:IntstallDefaultShemes}; Flags: checkablealone; Components: Postgresql; Languages:

[UninstallDelete]
Name: {app}\dbinit; Type: dirifempty

[ Code]

var
  PasswordPage: TInputQueryWizardPage;
  DataDirPage: TInputDirWizardPage;

  UserVarPass: String;
  PathToPsql: String;
// STAGE 2
procedure InitializeWizard();
begin

  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
  DataDirPage.Add('');
  DataDirPage.Values[0] := GetPreviousData('DataDir', 'C:\Program Files\PostgreSQL\9.0\bin');

  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('{cm:PasswordInputCaption}') ,ExpandConstant('{cm:PasswordInputDescription}'), ExpandConstant('{cm:PasswordInputSubCapton}') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;
begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;

  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;


function GetBuildNumber(param: String): String;
    var
          BuildVersion: String;
    begin
          LoadStringFromFile(ExpandConstant('buildNumber.txt'), BuildVersion);
          Result := BuildVersion;
    end;

function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  for i:=0 to GetArrayLength(fileStrings)-1 do
  begin
                if ((Pos(':'+Port+' ',fileStrings[i])>0) and (Pos('LISTENING',fileStrings[i]) >0)) then
                        begin
                                Result := true;
                                exit;
                        end;
  end;
  Result := false;
end;

// >>> STAGE 1 <<<
Function InitializeSetup: Boolean;
  var ResultCode: Integer;
  var fileStrings: TArrayOfString;
  var pathToOutput: String;
  var outputFile: String;
Begin
        If (ExpandConstant('{reg:HKLM\Software\JavaSoft\Java Runtime Environment,CurrentVersion}') = '1.6') then
                Result:= True
        else MsgBox(ExpandConstant('{cm:SetupJRE}'), mbInformation, mb_Ok);
        outputFile:=ExpandConstant('{tmp}\netstatoutput.log');
        pathToOutput:=ExpandConstant('{tmp}\');
        ExtractTemporaryFile('netstat1.bat');
        if Exec(ExpandConstant('{tmp}\netstat1.bat'),  'netstatoutput.log', pathToOutput, SW_HIDE, ewWaitUntilTerminated, ResultCode) then
        begin
                //MsgBox(outputFile, mbInformation, mb_Ok);
                // handle success if necessary; ResultCode contains the exit code
                LoadStringsFromFile(outputFile, fileStrings);
                DeleteFile(outputFile);
                DeleteFile(ExpandConstant('{tmp}\netstat1.bat'));
                If (CheckPortUsing('80',fileStrings) and (Result=true)) then
                begin
                  Result := MsgBox(ExpandConstant('{cm:Port80InUse}'), mbConfirmation, MB_YESNO) = idYes;
                end
  end
  else MsgBox('Error ', mbInformation, mb_Ok);

End;

function GetPsqlPath(Param: String): String;
begin
        Result := PathToPsql + '\psql.exe';
end;

procedure ReplacePathInConfigs();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','/');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

procedure ReplacePathInConfigsReg();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','\\');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

procedure ReplacePathInConfigsPass();
var filecontent: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  StringChange(filecontent,'{PG_PASS}',UserVarPass);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;


есть обновление
читать дальше »
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Обновление Synergy Center"
#ifndef MyAppVer
        #define MyAppVer "2.4"
#endif
#ifndef MyAppPatch
        #define MyAppPatch "11"
#endif
#ifndef MyAppBuild
        #define MyAppBuild "0"
#endif
#define MyAppPublisher " "

#define MyAppURL " "
#define InstalledLocalURL "http://localhost"

[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={{903E5749-D9EC-45A3-A5E1-B0621695F680}
AppName={cm:UpdateApplicationName}
AppVerName={#MyAppName} {#MyAppVer}.{#MyAppPatch}
VersionInfoVersion={#MyAppVer}.{#MyAppPatch}.{#MyAppBuild}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir={#MyOutputDir}
UpdateUninstallLogAppName=no
UsePreviousAppDir=yes
CreateUninstallRegKey=no
;DisableDirPage=yes

OutputBaseFilename=Synergy Center Update {#MyAppVer}.{#MyAppPatch}
Compression=lzma
SolidCompression=yes
WizardImageFile=wizard\WizModernImage-IS.bmp
WizardSmallImageFile=wizard\WizModernSmallImage-IS.bmp

[Registry]
Root: HKLM; Subkey: Software\Corssys\Synergy Center; ValueType: string; ValueName: Version; ValueData: {#MyAppVer}.{#MyAppPatch}; Flags: uninsdeletekey

[Languages]
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl

[Dirs]
Name: {app}\db_update; Flags: uninsneveruninstall; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Languages:

[InstallDelete]
Name: {app}\apache-tomcat\bin\service.bat; Type: filesandordirs; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\work\*; Type: filesandordirs; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\su\*; Type: filesandordirs; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\i18n\*; Type: filesandordirs; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\lib\*; Type: filesandordirs; BeforeInstall: StopTomcat


[Files]
Source: {app}\apache-tomcat\webapps\ROOT\*; DestDir: {app}\backups\Webcontent-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}; Flags: ignoreversion recursesubdirs createallsubdirs external uninsneveruninstall; Components: backup_app
Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: StopTomcat
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: apache-tomcat\bin\service.bat; DestDir: {app}\apache-tomcat\bin\; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: configs\WEB-INF\settings.properties; Flags: dontcopy
;Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: db_update\*; DestDir: {app}\db_update; Flags: ignoreversion recursesubdirs createallsubdirs; Languages:
;Source: D:\work\_Stable\setup\db\update\{#MyAppVer}\*.sql; DestDir: {app}\db_update\sql_scripts; Flags: ignoreversion
Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\db_update\sql_scripts; Flags: ignoreversion recursesubdirs createallsubdirs
Source: dontcopy\check.bat; Flags: dontcopy


[Run]
;Filename: {app}\postgresql\bin\pg_dump.exe; Parameters: "-h localhost -p 5432 -U postgres -F c -b -v -f ""{app}\backups\db-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}.backup"" sc"; Flags: waituntilterminated; StatusMsg: Бэкап текущей БД; Components: backup_db
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " remove"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden
Filename: {app}\db_update\make_db_backup.bat; WorkingDir: {app}\; Flags: shellexec  waituntilterminated; StatusMsg: StatusMsg: {cm:BackupingCurrentDB}; Components: backup_db
;Filename: NET; Parameters: "STOP ""Apache Tomcat"""; Flags: runhidden; StatusMsg: {cm:StoppingTomcat}
Filename: {app}\db_update\run_db_update.bat; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; StatusMsg: {cm:UpdatingDatabase}
;Filename: java; Parameters: " -jar --patches_path=""./sql_scripts/"" --log=""./sql_scripts/sql_scripts_log.log"" --sc_properites_path=""{app}/apache-tomcat/webapps/ROOT/WEB-INF/settings.properties"" "; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; StatusMsg: {cm:UpdatingDatabase}
;Filename: rmdir; Parameters: "/S /Q ""{app}\apache-tomcat\work\Catalina\"""; Flags: shellexec runhidden; StatusMsg: {cm:StartingTomcat}
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; StatusMsg: {cm:StartingTomcat}


[Components]
Name: backup_db; Description: {cm:MakeDBBackupComponent}; Flags: checkablealone; Types: custom full; Languages: ; ExtraDiskSpaceRequired: 5000000
Name: backup_app; Description: {cm:MakeApplicationBackupComponent}; Flags: checkablealone; Types: custom full; ExtraDiskSpaceRequired: 50000000
[ Code]

var
  PasswordPage: TInputQueryWizardPage;
  DataDirPage: TInputDirWizardPage;

  UserVarPass: String;
  PathToPsql: String;

procedure InitializeWizard();
begin

  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
  DataDirPage.Add('');
  DataDirPage.Values[0] := GetPreviousData('DataDir', 'C:\Program Files\PostgreSQL\9.0\bin');

  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('{cm:PasswordInputCaption}') ,ExpandConstant('{cm:PasswordInputDescription}'), ExpandConstant('{cm:PasswordInputSubCapton}') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);
end;

function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;
begin
  Result := True;
 If CurPageID = wpSelectDir then
  begin
        If (FileSearch('settings.properties', ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF')='') then
        begin
                MsgBox(ExpandConstant('{cm:ErrorSCNotFound}'), mbCriticalError, mb_Ok);
                Result:=False;
        end
 end;

  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;

  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;

procedure StopTomcat();
var
  ErrorCode: Integer;
begin
  if not Exec('NET',' STOP "Apache Tomcat"', '' ,SW_HIDE, ewWaitUntilTerminated, ErrorCode) then
  begin
    MsgBox('Fail to stop tomcat', mbInformation, mb_Ok);
  end;
end;



Function InitializeSetup: Boolean;
  var ResultCode: Integer;
  var fileStrings: TArrayOfString;
  var pathToOutput: String;
  var outputFile: String;
Begin
        If (ExpandConstant('{reg:HKLM\Software\JavaSoft\Java Runtime Environment,CurrentVersion}') = '1.6') then
                Result:= True
        else MsgBox(ExpandConstant('{cm:SetupJRE}'), mbInformation, mb_Ok);
end;


function CheckDBUpdateIsOk(): Boolean;
var filecontent: String;
var pathToLog: String;
begin
  Result:= false;
  pathToLog:=ExpandConstant('{app}')+'\db_update\db_update_log.log';
  LoadStringFromFile(pathToLog, filecontent);
  if (Pos('Update succesfully',filecontent)>0) then
  begin
        Result:= true;
  end

end;

procedure CurPageChanged(CurPageID: Integer);
  var ResultCode: Integer;
Begin
If (CurPageID=wpInfoAfter)or(CurPageID=wpFinished ) then
        begin
        if (not CheckDBUpdateIsOk) then begin
                        MsgBox(ExpandConstant('{cm:ErrorUpdatingDB}')+' ('+ExpandConstant('{app}')+'\backups)', mbCriticalError, mb_Ok);
                        Abort;
                end
        end
end;


procedure ReplacePathInConfigs();
var filecontent: String;
var pathToConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathToConfig:=ExpandConstant('{app}');
  StringChange(pathToConfig,'\','/');
  StringChange(filecontent,'{INSTALL_PATH}',pathToConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  for i:=0 to GetArrayLength(fileStrings)-1 do
  begin
                if ((Pos(':'+Port+' ',fileStrings[i])>0) and (Pos('LISTENING',fileStrings[i]) >0)) then
                        begin
                                Result := true;
                                exit;
                        end;
  end;
  Result := false;
end;


procedure AddDefaultToConfig();
var filecontent_default: String;
var configStrings,defaultStrings: TArrayOfString;
var pathToConfig,pathToDefaultConfig,appPath: String;
var langForConfig,currentKey: String;
var currentPos,i,j: Integer;
var containKey: Boolean;
begin
  // извлекаем конфиг по умолчанию
  ExtractTemporaryFile('settings.properties');
  pathToConfig:=ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF\settings.properties';
  pathToDefaultConfig:=ExpandConstant('{tmp}\settings.properties');
  appPath:=ExpandConstant('{app}');
  langForConfig:=ExpandConstant('{language}');
  // заменяем пути в конфиге по умолчанию
  LoadStringFromFile(pathToDefaultConfig, filecontent_default);
  StringChange(appPath,'\','/');
  StringChange(filecontent_default,'{INSTALL_PATH}',appPath);
  StringChange(filecontent_default,'{LANGUAGE}',langForConfig);
  SaveStringToFile(pathToDefaultConfig, filecontent_default, false);
  // загружаем как строки конфиг по умолчанию
  LoadStringsFromFile(pathToDefaultConfig, defaultStrings);
  // загружаем как строки конфиг sc
  LoadStringsFromFile(pathToConfig, configStrings);

  for i:=0 to GetArrayLength(defaultStrings)-1 do
  begin
                currentPos:=Pos('=',defaultStrings[i]);
                if ((currentPos>0)) then
                        begin
                                currentKey:=Trim(Copy(defaultStrings[i], 0, currentPos-1));
                                containKey:=false;
                                  for j:=0 to GetArrayLength(configStrings)-1 do
                                        begin
                                                if ((Pos(currentKey,configStrings[j])>0)) then
                                                begin
                                                        containKey:=true;
                                                end;
                                        end;
                                if (containKey=false) then
                                        begin
                                                //добавляю в конфиг
                                                SetArrayLength(configStrings, GetArrayLength(configStrings)+1);
                                                configStrings[GetArrayLength(configStrings)-1]:=defaultStrings[i];
                                        end
                        end;
  end;
  SaveStringsToFile(pathToConfig, configStrings, false);
end;


var
  TodaysName : String;

function GetToday : String;
begin
  Result := GetDateTimeString ('yyyy.mm.dd hh.nn.ss', '-', #0);
end;

function GetTodaysName (Param: String): String;
begin
  if ('' = TodaysName) then
  begin
    TodaysName := GetToday ();
  end;
  Result := TodaysName;
end;


Temyraz@fb 25-04-2012 09:24 1905493

вот с помощью ваших советов получилось так:
читать дальше »
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Synergy Center"
#ifndef MyAppVer
        #define MyAppVer "2.4"
#endif
#ifndef MyAppPatch
        #define MyAppPatch "11"
#endif
#ifndef MyAppBuild
        #define MyAppBuild "0"
#endif
#define MyAppPublisher ""

#define MyAppURL ""
#define InstalledLocalURL "http://localhost"

[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={{903E5749-D9EC-45A3-A5E1-B0621695F680}
AppName={#MyAppName}
AppVerName={#MyAppName} {#MyAppVer}.{#MyAppPatch}
VersionInfoVersion={#MyAppVer}.{#MyAppPatch}.{#MyAppBuild}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
;OutputDir={#MyOutputDir}
UpdateUninstallLogAppName=no
UsePreviousAppDir=yes
CreateUninstallRegKey=no
;DisableDirPage=yes

OutputBaseFilename=Synergy Center {#MyAppVer}.{#MyAppPatch}
Compression=lzma
SolidCompression=yes
WizardImageFile=wizard\WizModernImage-IS.bmp
WizardSmallImageFile=wizard\WizModernSmallImage-IS.bmp

[Languages]
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl; LicenseFile: dontcopy\license_ru.rtf
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl; LicenseFile: dontcopy\license_ua.rtf

[Registry]
Root: HKLM; Subkey: Software\IVTBelGU\Synergy Center; ValueType: string; ValueName: Version; ValueData: {#MyAppVer}.{#MyAppPatch}; Check: Run_B; Flags: uninsdeletekey

[Dirs]
Name: {app}\apache-tomcat; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\files; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\nginx; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\dbinit; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\db_update; Flags: uninsneveruninstall; Check: Run_A; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Check: Run_A; Languages:

[Files]
Source: apache-tomcat\*; DestDir: {app}\apache-tomcat; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: apache-tomcat\msvcr71.dll; DestDir: {sys}\; Check: Run_B; Flags: onlyifdoesntexist
;Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: configs\WEB-INF\settings.properties; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\nginx_to_autorun.reg; DestDir: {app}\nginx\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\add_reg.bat; DestDir: {app}\nginx\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\*; DestDir: {app}\nginx; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: dbinit\*; DestDir: {app}\dbinit; Check: Run_B; Flags: ignoreversion recursesubdirs; AfterInstall: ReplacePathInConfigsPass
Source: UserMenu\*; DestDir: {app}; Check: Run_B; Flags: ignoreversion recursesubdirs; Languages: ; AfterInstall: ReplacePathInConfigs
;Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\dbinit; Check: Run_B; Flags: ignoreversion




Source: {app}\apache-tomcat\webapps\ROOT\*; DestDir: {app}\backups\Webcontent-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs external uninsneveruninstall; Components: backup_app
;Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: StopTomcat
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: apache-tomcat\bin\service.bat; DestDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: configs\WEB-INF\settings.properties; Check: Run_A; Flags: dontcopy
;Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: db_update\*; DestDir: {app}\db_update; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; Languages:
;Source: D:\work\_Stable\setup\db\update\{#MyAppVer}\*.sql; DestDir: {app}\db_update\sql_scripts; Flags: ignoreversion
;Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\db_update\sql_scripts; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs

Source: dontcopy\netstat1.bat; Flags: dontcopy
Source: dontcopy\check.bat; Check: Run_A; Flags: dontcopy
Source: dontcopy\check.bat; Check: Run_B; Flags: dontcopy

[Icons]
Name: {group}\{#MyAppName}; Check: Run_B; Filename: {#InstalledLocalURL}
;Name: {group}\Start Tomcat; Filename: {app}\TomcatServiceStart.exe; WorkingDir: {app}\; Comment: {cm:RunTomcat}; Flags: runminimized; Components:
;Name: {group}\Stop Tomcat; Filename: {app}\TomcatServiceStop.exe; WorkingDir: {app}\; Comment: {cm:StopTomcat}; Flags: runminimized
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\admin_manual.pdf; Check: Run_B; Languages: ru
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\user_manual.pdf; Check: Run_B; Languages: ru
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_admin.pdf; Check: Run_B; Languages: ua
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_user.pdf; Check: Run_B; Languages: ua
Name: {group}\{cm:Rukovodstvo_administratora}; Check: Run_B; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\Rukovodstvo_administratora.pdf
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Check: Run_B; Filename: {uninstallexe}






[Run]
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden; Check: Run_B; StatusMsg: Installing Apache Tomcat as Service
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; Components: PostgreSQL; Check: Run_B; StatusMsg: {cm:StartingTomcat}
Filename: {app}\dbinit\createAndInitDb.bat; Parameters: """{code:GetPsqlPath}""  {language}"; WorkingDir: {app}\dbinit\; Flags: shellexec runhidden waituntilterminated; Check: Run_B; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}
Filename: {app}\nginx\add_reg.bat; Check: Run_B; Flags: shellexec runhidden
Filename: {app}\start_nginx.bat; Check: Run_B; Flags: shellexec runhidden
Filename: {app}\dbinit\installAdditionalCards.bat; Parameters: """{code:GetPsqlPath}"" {language}"; WorkingDir: {app}\dbinit\; Check: Run_B; Flags: shellexec runhidden waituntilterminated; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}; Tasks: IntstallDefaultShemes
Filename: {app}\Synergy Center.url; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent shellexec; Check: Run_B; Components: PostgreSQL


;Filename: {app}\postgresql\bin\pg_dump.exe; Parameters: "-h localhost -p 5432 -U postgres -F c -b -v -f ""{app}\backups\db-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}.backup"" sc"; Flags: waituntilterminated; StatusMsg: ????? ??????? ??; Components: backup_db
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " remove"; WorkingDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: runhidden
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: runhidden
Filename: {app}\db_update\make_db_backup.bat; WorkingDir: {app}\; Flags: shellexec  waituntilterminated; StatusMsg: StatusMsg: {cm:BackupingCurrentDB}; Check: Run_A; Components: backup_db
;Filename: NET; Parameters: "STOP ""Apache Tomcat"""; Flags: runhidden; StatusMsg: {cm:StoppingTomcat}
Filename: {app}\db_update\run_db_update.bat; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; Check: Run_A; StatusMsg: {cm:UpdatingDatabase}
;Filename: java; Parameters: " -jar --patches_path=""./sql_scripts/"" --log=""./sql_scripts/sql_scripts_log.log"" --sc_properites_path=""{app}/apache-tomcat/webapps/ROOT/WEB-INF/settings.properties"" "; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; StatusMsg: {cm:UpdatingDatabase}
;Filename: rmdir; Parameters: "/S /Q ""{app}\apache-tomcat\work\Catalina\"""; Flags: shellexec runhidden; StatusMsg: {cm:StartingTomcat}
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; Check: Run_A; StatusMsg: {cm:StartingTomcat}





[Components]
Name: Tomcat; Description: {cm:ApacheTomcatComponent}; Flags: fixed; Types: custom compact full; Check: Skips
Name: PostgreSQL; Description: {cm:PostgresComponent}; Types: custom full; Flags: checkablealone; ExtraDiskSpaceRequired: 16080384; Check: Skips; Languages:

Name: backup_db; Description: {cm:MakeDBBackupComponent}; Flags: checkablealone; Types: custom full; Languages: ; ExtraDiskSpaceRequired: 5000000; Check: Skip
Name: backup_app; Description: {cm:MakeApplicationBackupComponent}; Flags: checkablealone; Types: custom full; ExtraDiskSpaceRequired: 50000000; Check: Skip

[Tasks]
Name: IntstallDefaultShemes; Description: {cm:IntstallDefaultShemes}; Flags: checkablealone; Components: Postgresql; Languages:



[ Code]

var
  CheckBoxA: TNewCheckBox;
  CheckBoxB: TNewCheckBox;

  PasswordPage: TInputQueryWizardPage;
  DataDirPage: TInputDirWizardPage;

  UserVarPass: String;
  PathToPsql: String;
  CheckLicense: TNewCheckBox;



procedure ReplacePathInConfigsReg();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','\\');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  for i:=0 to GetArrayLength(fileStrings)-1 do
  begin
                if ((Pos(':'+Port+' ',fileStrings[i])>0) and (Pos('LISTENING',fileStrings[i]) >0)) then
                        begin
                                Result := true;
                                exit;
                        end;
  end;
  Result := false;
end;



procedure LicenseOnClick(Sender: TObject);
begin
  WizardForm.NextButton.Enabled := false;
  if (CheckLicense.Checked) = True then

  begin
    WizardForm.LicenseAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := True;
  end else
  begin
    WizardForm.LicenseNotAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := False;
  end;
end;


function  ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpLicense: Result := True;
  end;
end;




function GetBuildNumber(param: String): String;
    var
          BuildVersion: String;
    begin
          LoadStringFromFile(ExpandConstant('buildNumber.txt'), BuildVersion);
          Result := BuildVersion;
    end;




function GetPsqlPath(Param: String): String;
begin
        Result := PathToPsql + '\psql.exe';
end;

procedure ReplacePathInConfigs();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','/');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;



procedure ReplacePathInConfigsPass();
var filecontent: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  StringChange(filecontent,'{PG_PASS}',UserVarPass);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;




procedure StopTomcat();
var
  ErrorCode: Integer;
begin
  if not Exec('NET',' STOP "Apache Tomcat"', '' ,SW_HIDE, ewWaitUntilTerminated, ErrorCode) then
  begin
    MsgBox('Fail to stop tomcat', mbInformation, mb_Ok);
  end;
end;





function CheckDBUpdateIsOk(): Boolean;
var filecontent: String;
var pathToLog: String;
begin
  Result:= false;
  pathToLog:=ExpandConstant('{app}')+'\db_update\db_update_log.log';
  LoadStringFromFile(pathToLog, filecontent);
  if (Pos('Update succesfully',filecontent)>0) then
  begin
        Result:= true;
  end

end;


procedure CurPageChanged(CurPageID: Integer);
  var ResultCode: Integer;
Begin
        if CurPageID=wpWelcome then
    begin
      WizardForm.NextButton.Enabled := False;
    end;
end;





procedure AddDefaultToConfig();
var filecontent_default: String;
var configStrings,defaultStrings: TArrayOfString;
var pathToConfig,pathToDefaultConfig,appPath: String;
var langForConfig,currentKey: String;
var currentPos,i,j: Integer;
var containKey: Boolean;
begin

  ExtractTemporaryFile('settings.properties');
  pathToConfig:=ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF\settings.properties';
  pathToDefaultConfig:=ExpandConstant('{tmp}\settings.properties');
  appPath:=ExpandConstant('{app}');
  langForConfig:=ExpandConstant('{language}');

  LoadStringFromFile(pathToDefaultConfig, filecontent_default);
  StringChange(appPath,'\','/');
  StringChange(filecontent_default,'{INSTALL_PATH}',appPath);
  StringChange(filecontent_default,'{LANGUAGE}',langForConfig);
  SaveStringToFile(pathToDefaultConfig, filecontent_default, false);

  LoadStringsFromFile(pathToDefaultConfig, defaultStrings);

  LoadStringsFromFile(pathToConfig, configStrings);

  for i:=0 to GetArrayLength(defaultStrings)-1 do
  begin
                currentPos:=Pos('=',defaultStrings[i]);
                if ((currentPos>0)) then
                        begin
                                currentKey:=Trim(Copy(defaultStrings[i], 0, currentPos-1));
                                containKey:=false;
                                  for j:=0 to GetArrayLength(configStrings)-1 do
                                        begin
                                                if ((Pos(currentKey,configStrings[j])>0)) then
                                                begin
                                                        containKey:=true;
                                                end;
                                        end;
                                if (containKey=false) then
                                        begin

                                                SetArrayLength(configStrings, GetArrayLength(configStrings)+1);
                                                configStrings[GetArrayLength(configStrings)-1]:=defaultStrings[i];
                                        end
                        end;
  end;
  SaveStringsToFile(pathToConfig, configStrings, false);
end;


var
  TodaysName : String;

function GetToday : String;
begin
  Result := GetDateTimeString ('yyyy.mm.dd hh.nn.ss', '-', #0);
end;

function GetTodaysName (Param: String): String;
begin
  if ('' = TodaysName) then
  begin
    TodaysName := GetToday ();
  end;
  Result := TodaysName;
end;







function Run_A: Boolean; begin Result:=CheckBoxA.Checked; end;
function Run_B: Boolean; begin Result:=CheckBoxB.Checked; end;


Function InitializeSetup: Boolean;
  var ResultCode: Integer;
  var fileStrings: TArrayOfString;
  var pathToOutput: String;
  var outputFile: String;


Begin

        If (ExpandConstant('{reg:HKLM\Software\JavaSoft\Java Runtime Environment,CurrentVersion}') = '1.6') then
                Result:= True
        else MsgBox(ExpandConstant('{cm:SetupJRE}'), mbInformation, mb_Ok);


        outputFile:=ExpandConstant('{tmp}\netstatoutput.log');
        pathToOutput:=ExpandConstant('{tmp}\');
        ExtractTemporaryFile('netstat1.bat');
        if Exec(ExpandConstant('{tmp}\netstat1.bat'),  'netstatoutput.log', pathToOutput, SW_HIDE, ewWaitUntilTerminated, ResultCode) then
        begin
                //MsgBox(outputFile, mbInformation, mb_Ok);
                // handle success if necessary; ResultCode contains the exit code
                LoadStringsFromFile(outputFile, fileStrings);
                DeleteFile(outputFile);
                DeleteFile(ExpandConstant('{tmp}\netstat1.bat'));
                If (CheckPortUsing('80',fileStrings) and (Result=true)) then
                begin
                  Result := MsgBox(ExpandConstant('{cm:Port80InUse}'), mbConfirmation, MB_YESNO) = idYes;
                end
  end
  else MsgBox('Error ', mbInformation, mb_Ok);
End;

var
ReturnCode: Integer;
procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.LicenseNotAcceptedRadio.Hide;
  WizardForm.LicenseAcceptedRadio.Hide;
  { CheckLicense }
  CheckLicense := TNewCheckBox.Create(WizardForm);
  with CheckLicense do
  begin
    Name := 'CheckLicense';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(176);
    Top := ScaleY(288);
    Width := ScaleX(200);
    Height := ScaleY(17);
    OnClick := @LicenseOnClick;
    CheckLicense.Caption := WizardForm.LicenseAcceptedRadio.Caption;
  end;

  with WizardForm.LicenseMemo do
  begin
    Left := ScaleX(164);
    Top := ScaleY(0);
    Width := ScaleX(333);
    Height := ScaleY(284);
    Parent := WizardForm.WelcomePage;
  end;
        CheckLicense.Checked := false;

  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
  DataDirPage.Add('');
  DataDirPage.Values[0] := GetPreviousData('DataDir', 'C:\Program Files\PostgreSQL\9.0\bin');

  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('{cm:PasswordInputCaption}') ,ExpandConstant('{cm:PasswordInputDescription}'), ExpandConstant('{cm:PasswordInputSubCapton}') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);


  { CheckBoxA }
  CheckBoxA := TNewCheckBox.Create(WizardForm);
  with CheckBoxA do
  begin
    Name := 'CheckBoxA';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(176);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'вариант 1';
  end;
  { CheckBoxB }
  CheckBoxB := TNewCheckBox.Create(WizardForm);
  with CheckBoxB do
  begin
    Name := 'CheckBoxB';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(208);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'Вариант 2';
  end;

  if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\IVTBelGU\Synergy Center')
  then
    begin

      CheckBoxA.Enabled:=true;
      CheckBoxA.Checked:=true;

      CheckBoxB.Enabled:=false;
      CheckBoxB.Checked:=false;
    end

  else
    begin
      CheckBoxA.Enabled:=false;
      CheckBoxA.Checked:=false;

      CheckBoxB.Enabled:=true;
      CheckBoxB.Checked:=true;
    end;
CheckBoxA.visible:=false;
CheckBoxB.visible:=false;


end;


function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;


begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;


begin
if CheckBoxA.Checked = true then
begin


begin
  Result := True;
 If CurPageID = wpSelectDir then
  begin
        If (FileSearch('settings.properties', ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF')='') then
        begin
                MsgBox(ExpandConstant('{cm:ErrorSCNotFound}'), mbCriticalError, mb_Ok);
                Result:=False;
        end
 end;


  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;


end;


if CheckBoxB.Checked = true then
  begin


  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;

end;

end;

function Skip:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If not RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\IVTBelGU\Synergy Center') then
  Result:=False
end;
end;
function Skips:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\IVTBelGU\Synergy Center') then
  Result:=False
end;
end;


а так же будет отдельное удаление:
читать дальше »
Код:

#define MyAppName "Uninstall"

[Setup]
AppId=proto15
SourceDir=.
OutputDir=Setup
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false

ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no
DisableProgramGroupPage=yes
DisableWelcomePage=yes
DisableDirPage=yes
DisableReadyPage=yes
DisableFinishedPage=yes



[Languages]
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl

[InstallDelete]



[Files]
Source: {src}\files\*; DestDir: {code:SrcDir}\files\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: make_copy
Source: {src}\license\*; DestDir: {code:SrcDir}\license\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: make_copy
Source: dontcopy\check.bat; Flags: dontcopy
Source: dontcopy\checkdb.bat; Flags: dontcopy
[Run]
Filename: {src}\make_db_backup.bat; Parameters: {code:GetPsqlPass}; Flags: shellexec runhidden waituntilterminated; Check: make_copy
Filename: {src}\delbase.bat; Parameters: {code:GetPsqlPass}; Flags: shellexec runhidden waituntilterminated


Filename: NET; Parameters: "STOP ""Apache Tomcat"""; Flags: runhidden
Filename: {src}\apache-tomcat\bin\service.bat; Parameters: " remove"; WorkingDir: {src}\apache-tomcat\bin\; Flags: runhidden; Components:
Filename: {src}\stop_nginx.bat; WorkingDir: {src}\; Components:
[ Code]
{ RedesignWizardFormBegin } // Íå óäàëÿòü ýòó ñòðîêó!
// Íå èçìåíÿòü ýòó ñåêöèþ. Îíà ñîçäàíà àâòîìàòè÷åñêè.
var
  ISCustomPage1: TWizardPage;
  SuperBackupCheckBox: TNewCheckBox;
  Edit_1: TNewEdit;
  WhereButton: TNewButton;
  DataDirPage: TInputDirWizardPage;
  PasswordPage: TInputQueryWizardPage;
  UserVarPass: String;

procedure RePlaceTextinFile(FilePath:string; find:string; replace:string);
var
  S: TArrayOfString;
  i : Integer;
begin
  if not FileExists(FilePath) then begin MsgBox('Ôàéë íå íàéäåí ' + FilePath, mbError, mb_Ok); Exit;end; // åñëè ôàéëà íåò, âûõîäèì
  LoadStringsFromFile(FilePath, S); // çàãðóæàåì ôàéë
  for i:= 0 to GetArrayLength(S)-1 do begin
    if (Pos(AnsiUpperCase(find), AnsiUpperCase(S[i])) > 0) then begin
      StringChangeEx(S[i], find, replace, True);
    end;
  end;
  SaveStringsToFile(FilePath, S, False); // ñîõðàíÿåì ôàéë
end;

procedure make_copy_again(Sender: TObject); forward;
procedure ButtonOnClick(Sender: TObject); forward;


procedure RedesignWizardForm;
begin
  { Creates custom wizard page }
  ISCustomPage1 := CreateCustomPage(wpSelectDir, 'BackUpPage', 'ISCustomPage1_Description');

  { ISCustomPage1 }
  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

  { SuperBackupCheckBox }
  SuperBackupCheckBox := TNewCheckBox.Create(WizardForm);
  with SuperBackupCheckBox do
  begin
    Name := 'SuperBackupCheckBox';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(24);
    Width := ScaleX(169);
    Height := ScaleY(17);
    Hint := 'áýêàï íóæåí?';
    Caption := 'Ìíå áû ðåçåðâíóþ êîïèþ';

    ShowHint := True;
    OnClick := @make_copy_again;
  end;

  { Edit_1 }
  Edit_1 := TNewEdit.Create(WizardForm);
  with Edit_1 do
  begin
    Name := 'Edit_1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(56);
    Width := ScaleX(393);
    Height := ScaleY(21);
    Text := 'C:\';
  end;

  { WhereButton }
  WhereButton := TNewButton.Create(WizardForm);
  with WhereButton do
  begin
    Name := 'WhereButton';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(168);
    Top := ScaleY(80);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'êóäà?';
    OnClick := @ButtonOnClick;
  end;

  SuperBackupCheckBox.TabOrder := 0;
  Edit_1.TabOrder := 1;
  WhereButton.TabOrder := 2;

{ ReservationBegin }
  // Âû ìîæåòå äîáàâèòü âàø êîä çäåñü.

{ ReservationEnd }
end;
// Íå èçìåíÿòü ýòó ñåêöèþ. Îíà ñîçäàíà àâòîìàòè÷åñêè.
{ RedesignWizardFormEnd } // Íå óäàëÿòü ýòó ñòðîêó!

function make_copy: Boolean;
begin
    Result:=SuperBackupCheckBox.Checked;
end;





procedure make_copy_again (Sender: TObject);
begin
if SuperBackupCheckBox.Checked = false then
  begin
    Edit_1.Enabled:= false;
    Edit_1.visible:= false;
    WhereButton.Enabled:= false;
    WhereButton.visible:= false;
  end
else
  begin
    Edit_1.Enabled:= true;
    Edit_1.visible:= true;
    WhereButton.Enabled:= true;
    WhereButton.visible:= true;


  end;
end;

var
  DataDir: String;

function SrcDir(Param: String): String;
begin
  Result := DataDir;
end;

procedure ButtonOnClick(Sender: TObject);
var
  res: Boolean;
begin
  DataDir := ExpandConstant('{src}');
  res := BrowseForFolder('Âûáåðèòå ïàïêó èç ñïèñêà è íàæìèòå «ÎÊ»', DataDir, True);
  if res then
    begin
      Edit_1.Text := DataDir;
    end;
    RePlaceTextinFile(ExpandConstant('{src}\make_db_backup.bat'), '%~dp0\backups', DataDir);
end;
function PUTT(filepath:string):string;
var
S: TArrayOfString;
i : Integer;
begin
if not FileExists(FilePath) then begin MsgBox('Ôàéë íå íàéäåí ' + FilePath, mbError, mb_Ok); Exit;end; // åñëè ôàéëà íåò, âûõîäèì
LoadStringsFromFile(FilePath, S); // çàãðóæàåì ôàéë
result := S[0];
end;
procedure InitializeWizard();
begin
  RedesignWizardForm;
  Edit_1.Text := ExpandConstant('{userdocs}');
  Edit_1.Enabled:= false;
  Edit_1.visible:= false;
  WhereButton.Enabled:= false;
  WhereButton.visible:= false;
  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('Äîáðî ïîæàëîâàòü'), ExpandConstant('â ïðîöåññ Óäàëåíèå SC'), ExpandConstant('Ñëåäóþòå èíñòðóêöèè. íàæìèòå äàëåå ÷òîá ïðîäîëæèòü óäàëåíèå èëè îòìåíà ÷òîá åå îòìåíèòü'), False, '' );
  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('Ïàðîëü') ,ExpandConstant('ê áàççå äàííûõ'), ExpandConstant('Ââåäèòå') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);
 end;

function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
  ReturnCode: Integer;

begin
  Result := True;


  if CurPageID = PasswordPage.ID then begin
  UserVarPass := PasswordPage.Edits[0].Text;
  ExtractTemporaryFile('check.bat');
  Exec (ExpandConstant ('{tmp}\check.bat'), PasswordPage.Edits[0].Text + ' "' + PUTT(ExpandConstant('{src}\text.txt')) + '"', ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
  if ReturnCode = 0 then
    begin
      Result := True;
    end
  else
    begin
      MsgBox(ExpandConstant('Íå âåðíûé ïàðîëü'), mbError, MB_OK);
      Result := False;
    end;
  DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;

end;
function GetPsqlPass(Param: String): String;
begin
  Result := UserVarPass;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;



как это все объединить? установку, обновление и удаление?

Gnom_aka_Lexander 25-04-2012 11:41 1905570

R.i.m.s.k.y., тут посмотри.

R.i.m.s.k.y. 25-04-2012 11:48 1905573

Лександер, так этож дельфи, а не инно

Johny777 25-04-2012 11:50 1905574

Цитата:

Цитата Temyraz@fb
работает так как надо, а потом нет »

что именно не работает?
мой совет
знаешь как я делаю? Прежде чем доабавить что-то обширное в код я сначала добавляю, но не сохраняю (или делаю резервную копию) пока не протестирую и не убежусь что всё работает. Никогда не добавлял несколько различных процедур сразу. Всё по чуть чуть. И тесты, тесты. У меня в коде везде пометки что к чему относится. Что я изменил и для чего. Если начинаются косяки, то сразу становится понятно где
А теперь вопрос. До того как ты начал добавлять компонеты код работал? (функции кнопки далее, в зависимости от чекбоксов и всё остальное)
насчёт деинсталятора посмотри моё самое последнее сообщение по деинсталлу. Там не только он, но ещё и несколько строк в основном скрипте, без которых никак
Цитата:

Цитата Temyraz@fb
make_copy_again »

помнится это не совсем рабочий вариант
лучше посмотри пример CopyFiles_{code;SrcDir}.iss

Devils Night 25-04-2012 12:07 1905586

Temyraz@fb
Так сказать на будущее:
  1. Очень рекомендуется выкладывать скрипты с файлами.
  2. Файлы такие как музыка, картинки и пр. можно даже не оригинальные, хотя бы пустышки, но чтоб были рабочими, вот пример.
  3. Файлы такие как DLL-ки, естественно оригинальные, от них многое зависит.
  4. Скрипт можно и во вложенный архив вложить, если нет то рекомендуется заключить в теги
    PHP код:

    [more][code]Твой код[/code][/more
    можно ещё так
    ht=Код][code]Твой код [/code][ /ht

    , всё делается для того чтобы было аккуратно и не разносить всю эту портянку во всю страницу.
  5. Скрины так же рекомендуется заключить в теги
    PHP код:

    [more] [IMG]Твой скрин[/IMG][/more
    или так 
    ht=Скрин][IMG]Твой скрин[/IMG][ /ht


Всё просто, тот кто помогает, он может и проверить скрипт прежде чем выкладывать, а без файлов очень затрудняется проверка, потому как не хватает этих самых недостающих файлов, и тот кто пытается тебе помочь, тратит время на то чтобы создать эти картинки, музыку и.т.д, найти DLL и пр., ну или же выкладывает скрипт как есть, что потом у вас появляется ещё тысяча вопросов такие как: "Почему не работает", "Выскочила ошибка, как исправить?" и.т.д.
У помогающего, время не вечно, терпение тоже, а многим из вас подавай побыстрее.

Gnom_aka_Lexander 25-04-2012 12:22 1905595

R.i.m.s.k.y., там много типов, которых инно точно не знает. сама инно работать со звуком не может. Хотя, может El Sanchez, или Serega смогут этот код в инно перенести. Или найти более простой способ.

Temyraz@fb 25-04-2012 15:34 1905718

у меня вот какой вопрос:
как менять значения ?
Код:

DefaultDirName=D:\{#MyAppName}
просто нужно чтоб
при Chek-A было одно значение(DefaultDirName=D:\{#MyAppName} )
а при Chek-B другое значение(DefaultDirName=D:\{cm:UpdateApplicationName})
разве нельзя на прямую в
Код:

DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
менять значение?

R.i.m.s.k.y. 25-04-2012 15:51 1905726

Temyraz@fb, на странице выбора директории выбранный компонент неизвестен тк страница компонентов идет после выбора директории
Как вариант спрятать страницу выбора папки, и DefaultDirName={code:my_app_dir_components}

Johny777 25-04-2012 15:51 1905727

Temyraz@fb,
думаю проще всего так
читать дальше »
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpSelectDir then
  begin
    if CheckBoxA.Checked = true then
    begin
      WizardForm.DirEdit.Text:=ExpandConstant('{pf}\Setup_A');
    end;
   
    if CheckBoxB.Checked = true then
    begin
      WizardForm.DirEdit.Text:=ExpandConstant('{pf}\Setup_B');
    end;
  end;
end;


,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
самодостаточный пример

читать дальше »
Код:

[Setup]
AppName=Setup
AppVerName=Setup
DefaultDirName={pf}\Setup
OutputDir=.



[  code]
var
  CheckBoxA: TNewCheckBox;
  CheckBoxB: TNewCheckBox;

function Run_A: Boolean; begin Result:=CheckBoxA.Checked; end;
function Run_B: Boolean; begin Result:=CheckBoxB.Checked; end;

procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  { CheckBoxA }
  CheckBoxA := TNewCheckBox.Create(WizardForm);
  with CheckBoxA do
  begin
    Name := 'CheckBoxA';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(176);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'вариант 1';
  end;
  { CheckBoxB }
  CheckBoxB := TNewCheckBox.Create(WizardForm);
  with CheckBoxB do
  begin
    Name := 'CheckBoxB';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(208);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'Вариант 2';
  end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpSelectDir then
  begin
    if CheckBoxA.Checked = true then
    begin
      WizardForm.DirEdit.Text:=ExpandConstant('{pf}\Setup_A');
    end;
   
    if CheckBoxB.Checked = true then
    begin
      WizardForm.DirEdit.Text:=ExpandConstant('{pf}\Setup_B');
    end;
  end;
end;


,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
(только что заметил, что страница вставлена)
если своя страница, то
заместо wpSelectDir поставь DataDirPage.ID

а вместо WizardForm.DirEdit название своего эдита
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Цитата:

Цитата Temyraz@fb
D:\{#MyAppName} »

а если у пользователя нет диска/партиции D ?
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,
R.i.m.s.k.y.,
у него всё привязано к проверке ключей в реестре
если есть/нет ключа, то отмечен один из 2-х невидимых для пользователя чекбоксов,
а в зависимости какой отмечен, то определённые действия в коде. (CurPageChanged, NextButtonClick)
через реестр зависит наличие компонетов, те проще всего по возможности всё привязывать к 2-м чекбоксам *(CheckBoxA; CheckBoxB)
Цитата:

Цитата R.i.m.s.k.y.
тк страница компонентов идет после выбора директории »

есть пример смены страниц местами в
...\Inno Setup 5\Scripts\Dobrov\SwapDirComponents.iss
читать дальше »
Код:

[Setup]
AppName=My program
AppVerName=My program 1.5
DefaultDirName={pf}\My program
DisableDirPage=false
;DisableDirPage=true

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

[Components]
Name: WB; Description: 'Мой компьютер' - Настройки; ExtraDiskSpaceRequired: 1048576

[ Code]
function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
        if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  Case CurPageID of
  wpSelectDir: if WizardForm.Tag = 1 then
        begin
                WizardForm.SelectDirPage.Notebook.ActivePage:= WizardForm.SelectComponentsPage;
                WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectComponents)
                WizardForm.Hint:= WizardForm.PageDescriptionLabel.Caption; // запомнить SetupMessage(msgSelectDirDesc)
                WizardForm.PageDescriptionLabel.Caption:= SetupMessage(msgSelectComponentsDesc)
        end;
  wpSelectComponents: if WizardForm.Tag = 1 then
    begin
                WizardForm.SelectComponentsPage.Notebook.ActivePage:= WizardForm.SelectDirPage;
                WizardForm.DiskSpaceLabel.Caption:= WizardForm.ComponentsDiskSpaceLabel.Caption;
                WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectDir)
                WizardForm.PageDescriptionLabel.Caption:= WizardForm.Hint // иначе вместо названия программы [name]
    end;
  end;
End;

Procedure InitializeWizard;
Begin
        PageFromID(wpSelectDir).OnShouldSkipPage:= @OnShouldSkipPage
End;


только если у тебя скажем проверка на странице выбора директории, то при использовании этого примера
эту проверку придётся делать на странице компонентов.

Temyraz@fb 25-04-2012 17:16 1905767

все отлично получилось сделать рабочую версию установки и обновления. СПАСИБО ВСЕМ ЗА ПОМОЩЬ.
теперь осталось удаление прикрутить.

Johny777 25-04-2012 17:29 1905774

Цитата:

Цитата Temyraz@fb
рабочую версию установки и обновления. »

тестируй под всеми углами
при разных фазах луны
никогда не знаешь где недосмотрел пока 100 раз не проверишь
Это я к тому чтоб потом обидно не было

Temyraz@fb 25-04-2012 17:33 1905776

уже проверил)))
только у меня все же есть вопросы по удалению(((
как мне прикрутить удаление к установке так, чтоб пользователь не заметил разницы?
вот скрипт установки
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Synergy Center"
#ifndef MyAppVer
        #define MyAppVer "2.4"
#endif
#ifndef MyAppPatch
        #define MyAppPatch "11"
#endif
#ifndef MyAppBuild
        #define MyAppBuild "0"
#endif
#define MyAppPublisher ""

#define MyAppURL ""
#define InstalledLocalURL "http://localhost"

[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={{903E5749-D9EC-45A3-A5E1-B0621695F680}
AppName={#MyAppName}
AppVerName={#MyAppName} {#MyAppVer}.{#MyAppPatch}
VersionInfoVersion={#MyAppVer}.{#MyAppPatch}.{#MyAppBuild}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir={#MyOutputDir}
UpdateUninstallLogAppName=no
UsePreviousAppDir=yes
CreateUninstallRegKey=no
;DisableDirPage=yes

OutputBaseFilename=Synergy Center {#MyAppVer}.{#MyAppPatch}
Compression=lzma
SolidCompression=yes
WizardImageFile=wizard\WizModernImage-IS.bmp
WizardSmallImageFile=wizard\WizModernSmallImage-IS.bmp

[Languages]
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl; LicenseFile: dontcopy\license_ru.rtf
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl; LicenseFile: dontcopy\license_ua.rtf

[Registry]
Root: HKLM; Subkey: Software\IVTBelGU\Synergy Center; ValueType: string; ValueName: Version; ValueData: {#MyAppVer}.{#MyAppPatch}; Check: Run_B; Flags: uninsdeletekey

[Dirs]
Name: {app}\apache-tomcat; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\files; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\nginx; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\dbinit; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\db_update; Flags: uninsneveruninstall; Check: Run_A; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Check: Run_A; Languages:
[InstallDelete]
Name: {app}\apache-tomcat\bin\service.bat; Type: filesandordirs; Check: Run_A; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\work\*; Type: filesandordirs; Check: Run_A; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\su\*; Type: filesandordirs; Check: Run_A; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\i18n\*; Type: filesandordirs; Check: Run_A; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\lib\*; Type: filesandordirs; Check: Run_A; BeforeInstall: StopTomcat

[Files]
Source: apache-tomcat\*; DestDir: {app}\apache-tomcat; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: apache-tomcat\msvcr71.dll; DestDir: {sys}\; Check: Run_B; Flags: onlyifdoesntexist
Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: configs\WEB-INF\settings.properties; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\nginx_to_autorun.reg; DestDir: {app}\nginx\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\add_reg.bat; DestDir: {app}\nginx\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\*; DestDir: {app}\nginx; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: dbinit\*; DestDir: {app}\dbinit; Check: Run_B; Flags: ignoreversion recursesubdirs; AfterInstall: ReplacePathInConfigsPass
Source: UserMenu\*; DestDir: {app}; Check: Run_B; Flags: ignoreversion recursesubdirs; Languages: ; AfterInstall: ReplacePathInConfigs
Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\dbinit; Check: Run_B; Flags: ignoreversion




Source: {app}\apache-tomcat\webapps\ROOT\*; DestDir: {app}\backups\Webcontent-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs external uninsneveruninstall; Components: backup_app
Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: StopTomcat
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: apache-tomcat\bin\service.bat; DestDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: configs\WEB-INF\settings.properties; Check: Run_A; Flags: dontcopy
;Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: db_update\*; DestDir: {app}\db_update; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; Languages:
;Source: D:\work\_Stable\setup\db\update\{#MyAppVer}\*.sql; DestDir: {app}\db_update\sql_scripts; Flags: ignoreversion
Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\db_update\sql_scripts; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs

Source: dontcopy\netstat1.bat; Flags: dontcopy
Source: dontcopy\check.bat; Check: Run_A; Flags: dontcopy
Source: dontcopy\check.bat; Check: Run_B; Flags: dontcopy

[Icons]
Name: {group}\{#MyAppName}; Check: Run_B; Filename: {#InstalledLocalURL}
;Name: {group}\Start Tomcat; Filename: {app}\TomcatServiceStart.exe; WorkingDir: {app}\; Comment: {cm:RunTomcat}; Flags: runminimized; Components:
;Name: {group}\Stop Tomcat; Filename: {app}\TomcatServiceStop.exe; WorkingDir: {app}\; Comment: {cm:StopTomcat}; Flags: runminimized
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\admin_manual.pdf; Check: Run_B; Languages: ru
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\user_manual.pdf; Check: Run_B; Languages: ru
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_admin.pdf; Check: Run_B; Languages: ua
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_user.pdf; Check: Run_B; Languages: ua
Name: {group}\{cm:Rukovodstvo_administratora}; Check: Run_B; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\Rukovodstvo_administratora.pdf
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Check: Run_B; Filename: {uninstallexe}






[Run]
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden; Check: Run_B; StatusMsg: Installing Apache Tomcat as Service
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; Components: PostgreSQL; Check: Run_B; StatusMsg: {cm:StartingTomcat}
Filename: {app}\dbinit\createAndInitDb.bat; Parameters: """{code:GetPsqlPath}""  {language}"; WorkingDir: {app}\dbinit\; Flags: shellexec runhidden waituntilterminated; Check: Run_B; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}
Filename: {app}\nginx\add_reg.bat; Check: Run_B; Flags: shellexec runhidden
Filename: {app}\start_nginx.bat; Check: Run_B; Flags: shellexec runhidden
Filename: {app}\dbinit\installAdditionalCards.bat; Parameters: """{code:GetPsqlPath}"" {language}"; WorkingDir: {app}\dbinit\; Check: Run_B; Flags: shellexec runhidden waituntilterminated; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}; Tasks: IntstallDefaultShemes
Filename: {app}\Synergy Center.url; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent shellexec; Check: Run_B; Components: PostgreSQL


;Filename: {app}\postgresql\bin\pg_dump.exe; Parameters: "-h localhost -p 5432 -U postgres -F c -b -v -f ""{app}\backups\db-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}.backup"" sc"; Flags: waituntilterminated; StatusMsg: ????? ??????? ??; Components: backup_db
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " remove"; WorkingDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: runhidden
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: runhidden
Filename: {app}\db_update\make_db_backup.bat; WorkingDir: {app}\; Flags: shellexec  waituntilterminated; StatusMsg: StatusMsg: {cm:BackupingCurrentDB}; Check: Run_A; Components: backup_db
;Filename: NET; Parameters: "STOP ""Apache Tomcat"""; Flags: runhidden; StatusMsg: {cm:StoppingTomcat}
Filename: {app}\db_update\run_db_update.bat; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; Check: Run_A; StatusMsg: {cm:UpdatingDatabase}
;Filename: java; Parameters: " -jar --patches_path=""./sql_scripts/"" --log=""./sql_scripts/sql_scripts_log.log"" --sc_properites_path=""{app}/apache-tomcat/webapps/ROOT/WEB-INF/settings.properties"" "; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; StatusMsg: {cm:UpdatingDatabase}
;Filename: rmdir; Parameters: "/S /Q ""{app}\apache-tomcat\work\Catalina\"""; Flags: shellexec runhidden; StatusMsg: {cm:StartingTomcat}
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; Check: Run_A; StatusMsg: {cm:StartingTomcat}





[Components]
Name: Tomcat; Description: {cm:ApacheTomcatComponent}; Flags: fixed; Types: custom compact full; Check: Skips
Name: PostgreSQL; Description: {cm:PostgresComponent}; Types: custom full; Flags: checkablealone; ExtraDiskSpaceRequired: 16080384; Check: Skips; Languages:

Name: backup_db; Description: {cm:MakeDBBackupComponent}; Flags: checkablealone; Types: custom full; Languages: ; ExtraDiskSpaceRequired: 5000000; Check: Skip
Name: backup_app; Description: {cm:MakeApplicationBackupComponent}; Flags: checkablealone; Types: custom full; ExtraDiskSpaceRequired: 50000000; Check: Skip

[Tasks]
Name: IntstallDefaultShemes; Description: {cm:IntstallDefaultShemes}; Flags: checkablealone; Components: Postgresql; Languages:


[ Code]

var
  CheckBoxA: TNewCheckBox;
  CheckBoxB: TNewCheckBox;

  PasswordPage: TInputQueryWizardPage;
  DataDirPage: TInputDirWizardPage;

  UserVarPass: String;
  PathToPsql: String;
  CheckLicense: TNewCheckBox;



procedure ReplacePathInConfigsReg();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','\\');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  for i:=0 to GetArrayLength(fileStrings)-1 do
  begin
                if ((Pos(':'+Port+' ',fileStrings[i])>0) and (Pos('LISTENING',fileStrings[i]) >0)) then
                        begin
                                Result := true;
                                exit;
                        end;
  end;
  Result := false;
end;



procedure LicenseOnClick(Sender: TObject);
begin
  WizardForm.NextButton.Enabled := false;
  if (CheckLicense.Checked) = True then

  begin
    WizardForm.LicenseAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := True;
  end else
  begin
    WizardForm.LicenseNotAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := False;
  end;
end;


function  ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpLicense: Result := True;
  end;
end;




function GetBuildNumber(param: String): String;
    var
          BuildVersion: String;
    begin
          LoadStringFromFile(ExpandConstant('buildNumber.txt'), BuildVersion);
          Result := BuildVersion;
    end;




function GetPsqlPath(Param: String): String;
begin
        Result := PathToPsql + '\psql.exe';
end;

procedure ReplacePathInConfigs();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','/');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;



procedure ReplacePathInConfigsPass();
var filecontent: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  StringChange(filecontent,'{PG_PASS}',UserVarPass);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;




procedure StopTomcat();
var
  ErrorCode: Integer;
begin
  if not Exec('NET',' STOP "Apache Tomcat"', '' ,SW_HIDE, ewWaitUntilTerminated, ErrorCode) then
  begin
    MsgBox('Fail to stop tomcat', mbInformation, mb_Ok);
  end;
end;





function CheckDBUpdateIsOk(): Boolean;
var filecontent: String;
var pathToLog: String;
begin
  Result:= false;
  pathToLog:=ExpandConstant('{app}')+'\db_update\db_update_log.log';
  LoadStringFromFile(pathToLog, filecontent);
  if (Pos('Update succesfully',filecontent)>0) then
  begin
        Result:= true;
  end

end;


procedure CurPageChanged(CurPageID: Integer);
  var ResultCode: Integer;
Begin
        if CurPageID=wpWelcome then
    begin
      WizardForm.NextButton.Enabled := False;
    end;
end;





procedure AddDefaultToConfig();
var filecontent_default: String;
var configStrings,defaultStrings: TArrayOfString;
var pathToConfig,pathToDefaultConfig,appPath: String;
var langForConfig,currentKey: String;
var currentPos,i,j: Integer;
var containKey: Boolean;
begin

  ExtractTemporaryFile('settings.properties');
  pathToConfig:=ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF\settings.properties';
  pathToDefaultConfig:=ExpandConstant('{tmp}\settings.properties');
  appPath:=ExpandConstant('{app}');
  langForConfig:=ExpandConstant('{language}');

  LoadStringFromFile(pathToDefaultConfig, filecontent_default);
  StringChange(appPath,'\','/');
  StringChange(filecontent_default,'{INSTALL_PATH}',appPath);
  StringChange(filecontent_default,'{LANGUAGE}',langForConfig);
  SaveStringToFile(pathToDefaultConfig, filecontent_default, false);

  LoadStringsFromFile(pathToDefaultConfig, defaultStrings);

  LoadStringsFromFile(pathToConfig, configStrings);

  for i:=0 to GetArrayLength(defaultStrings)-1 do
  begin
                currentPos:=Pos('=',defaultStrings[i]);
                if ((currentPos>0)) then
                        begin
                                currentKey:=Trim(Copy(defaultStrings[i], 0, currentPos-1));
                                containKey:=false;
                                  for j:=0 to GetArrayLength(configStrings)-1 do
                                        begin
                                                if ((Pos(currentKey,configStrings[j])>0)) then
                                                begin
                                                        containKey:=true;
                                                end;
                                        end;
                                if (containKey=false) then
                                        begin

                                                SetArrayLength(configStrings, GetArrayLength(configStrings)+1);
                                                configStrings[GetArrayLength(configStrings)-1]:=defaultStrings[i];
                                        end
                        end;
  end;
  SaveStringsToFile(pathToConfig, configStrings, false);
end;


var
  TodaysName : String;

function GetToday : String;
begin
  Result := GetDateTimeString ('yyyy.mm.dd hh.nn.ss', '-', #0);
end;

function GetTodaysName (Param: String): String;
begin
  if ('' = TodaysName) then
  begin
    TodaysName := GetToday ();
  end;
  Result := TodaysName;
end;







function Run_A: Boolean; begin Result:=CheckBoxA.Checked; end;
function Run_B: Boolean; begin Result:=CheckBoxB.Checked; end;


Function InitializeSetup: Boolean;
  var ResultCode: Integer;
  var fileStrings: TArrayOfString;
  var pathToOutput: String;
  var outputFile: String;


Begin

        If (ExpandConstant('{reg:HKLM\Software\JavaSoft\Java Runtime Environment,CurrentVersion}') = '1.6') then
                Result:= True
        else MsgBox(ExpandConstant('{cm:SetupJRE}'), mbInformation, mb_Ok);


        outputFile:=ExpandConstant('{tmp}\netstatoutput.log');
        pathToOutput:=ExpandConstant('{tmp}\');
        ExtractTemporaryFile('netstat1.bat');
        if Exec(ExpandConstant('{tmp}\netstat1.bat'),  'netstatoutput.log', pathToOutput, SW_HIDE, ewWaitUntilTerminated, ResultCode) then
        begin
                //MsgBox(outputFile, mbInformation, mb_Ok);
                // handle success if necessary; ResultCode contains the exit code
                LoadStringsFromFile(outputFile, fileStrings);
                DeleteFile(outputFile);
                DeleteFile(ExpandConstant('{tmp}\netstat1.bat'));
                If (CheckPortUsing('80',fileStrings) and (Result=true)) then
                begin
                  Result := MsgBox(ExpandConstant('{cm:Port80InUse}'), mbConfirmation, MB_YESNO) = idYes;
                end
  end
  else MsgBox('Error ', mbInformation, mb_Ok);
End;

var
ReturnCode: Integer;
procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.LicenseNotAcceptedRadio.Hide;
  WizardForm.LicenseAcceptedRadio.Hide;
  { CheckLicense }
  CheckLicense := TNewCheckBox.Create(WizardForm);
  with CheckLicense do
  begin
    Name := 'CheckLicense';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(176);
    Top := ScaleY(288);
    Width := ScaleX(200);
    Height := ScaleY(17);
    OnClick := @LicenseOnClick;
    CheckLicense.Caption := WizardForm.LicenseAcceptedRadio.Caption;
  end;

  with WizardForm.LicenseMemo do
  begin
    Left := ScaleX(164);
    Top := ScaleY(0);
    Width := ScaleX(333);
    Height := ScaleY(284);
    Parent := WizardForm.WelcomePage;
  end;
        CheckLicense.Checked := false;

  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
  DataDirPage.Add('');
  DataDirPage.Values[0] := GetPreviousData('DataDir', 'C:\Program Files\PostgreSQL\9.0\bin');

  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('{cm:PasswordInputCaption}') ,ExpandConstant('{cm:PasswordInputDescription}'), ExpandConstant('{cm:PasswordInputSubCapton}') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);


  { CheckBoxA }
  CheckBoxA := TNewCheckBox.Create(WizardForm);
  with CheckBoxA do
  begin
    Name := 'CheckBoxA';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(176);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'вариант 1';
  end;
  { CheckBoxB }
  CheckBoxB := TNewCheckBox.Create(WizardForm);
  with CheckBoxB do
  begin
    Name := 'CheckBoxB';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(208);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'Вариант 2';
  end;

  if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\IVTBelGU\Synergy Center')
  then
    begin

      CheckBoxA.Enabled:=true;
      CheckBoxA.Checked:=true;

      CheckBoxB.Enabled:=false;
      CheckBoxB.Checked:=false;
    end

  else
    begin
      CheckBoxA.Enabled:=false;
      CheckBoxA.Checked:=false;

      CheckBoxB.Enabled:=true;
      CheckBoxB.Checked:=true;
    end;
CheckBoxA.visible:=false;
CheckBoxB.visible:=false;


end;


function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;


begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;


begin
if CheckBoxA.Checked = true then
begin


begin
  Result := True;
 If CurPageID = wpSelectDir then
  begin
        If (FileSearch('settings.properties', ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF')='') then
        begin
                MsgBox(ExpandConstant('{cm:ErrorSCNotFound}'), mbCriticalError, mb_Ok);
                Result:=False;
        end
 end;


  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;


end;


if CheckBoxB.Checked = true then
  begin


  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;

end;

end;

function Skip:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If not RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\IVTBelGU\Synergy Center') then
  Result:=False
end;
end;
function Skips:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\IVTBelGU\Synergy Center') then
  Result:=False
end;
end;

вот скрипт удаления
Код:

#define MyAppName "Uninstall"

[Setup]
AppId=proto15
SourceDir=.
OutputDir=Setup
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false

ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
UsePreviousLanguage=no
DisableProgramGroupPage=yes
DisableWelcomePage=yes
DisableDirPage=yes
DisableReadyPage=yes
DisableFinishedPage=yes



[Languages]
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl

[InstallDelete]



[Files]
Source: {src}\files\*; DestDir: {code:SrcDir}\files\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: make_copy
Source: {src}\license\*; DestDir: {code:SrcDir}\license\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: make_copy
Source: dontcopy\check.bat; Flags: dontcopy
Source: dontcopy\checkdb.bat; Flags: dontcopy
[Run]
Filename: {src}\make_db_backup.bat; Parameters: {code:GetPsqlPass}; Flags: shellexec runhidden waituntilterminated; Check: make_copy
Filename: {src}\delbase.bat; Parameters: {code:GetPsqlPass}; Flags: shellexec runhidden waituntilterminated


Filename: NET; Parameters: "STOP ""Apache Tomcat"""; Flags: runhidden
Filename: {src}\apache-tomcat\bin\service.bat; Parameters: " remove"; WorkingDir: {src}\apache-tomcat\bin\; Flags: runhidden; Components:
Filename: {src}\stop_nginx.bat; WorkingDir: {src}\; Components:
[ Code]
{ RedesignWizardFormBegin } // Не удалять эту строку!
// Не изменять эту секцию. Она создана автоматически.
var
  ISCustomPage1: TWizardPage;
  SuperBackupCheckBox: TNewCheckBox;
  Edit_1: TNewEdit;
  WhereButton: TNewButton;
  DataDirPage: TInputDirWizardPage;
  PasswordPage: TInputQueryWizardPage;
  UserVarPass: String;

procedure RePlaceTextinFile(FilePath:string; find:string; replace:string);
var
  S: TArrayOfString;
  i : Integer;
begin
  if not FileExists(FilePath) then begin MsgBox('Файл не найден ' + FilePath, mbError, mb_Ok); Exit;end; // если файла нет, выходим
  LoadStringsFromFile(FilePath, S); // загружаем файл
  for i:= 0 to GetArrayLength(S)-1 do begin
    if (Pos(AnsiUpperCase(find), AnsiUpperCase(S[i])) > 0) then begin
      StringChangeEx(S[i], find, replace, True);
    end;
  end;
  SaveStringsToFile(FilePath, S, False); // сохраняем файл
end;

procedure make_copy_again(Sender: TObject); forward;
procedure ButtonOnClick(Sender: TObject); forward;


procedure RedesignWizardForm;
begin
  { Creates custom wizard page }
  ISCustomPage1 := CreateCustomPage(wpSelectDir, 'BackUpPage', 'ISCustomPage1_Description');

  { ISCustomPage1 }
  with ISCustomPage1.Surface do
  begin
    Name := 'ISCustomPage1';
  end;

  { SuperBackupCheckBox }
  SuperBackupCheckBox := TNewCheckBox.Create(WizardForm);
  with SuperBackupCheckBox do
  begin
    Name := 'SuperBackupCheckBox';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(24);
    Width := ScaleX(169);
    Height := ScaleY(17);
    Hint := 'бэкап нужен?';
    Caption := 'Мне бы резервную копию';

    ShowHint := True;
    OnClick := @make_copy_again;
  end;

  { Edit_1 }
  Edit_1 := TNewEdit.Create(WizardForm);
  with Edit_1 do
  begin
    Name := 'Edit_1';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(16);
    Top := ScaleY(56);
    Width := ScaleX(393);
    Height := ScaleY(21);
    Text := 'C:\';
  end;

  { WhereButton }
  WhereButton := TNewButton.Create(WizardForm);
  with WhereButton do
  begin
    Name := 'WhereButton';
    Parent := ISCustomPage1.Surface;
    Left := ScaleX(168);
    Top := ScaleY(80);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'куда?';
    OnClick := @ButtonOnClick;
  end;

  SuperBackupCheckBox.TabOrder := 0;
  Edit_1.TabOrder := 1;
  WhereButton.TabOrder := 2;

{ ReservationBegin }
  // Вы можете добавить ваш код здесь.

{ ReservationEnd }
end;
// Не изменять эту секцию. Она создана автоматически.
{ RedesignWizardFormEnd } // Не удалять эту строку!

function make_copy: Boolean;
begin
    Result:=SuperBackupCheckBox.Checked;
end;





procedure make_copy_again (Sender: TObject);
begin
if SuperBackupCheckBox.Checked = false then
  begin
    Edit_1.Enabled:= false;
    Edit_1.visible:= false;
    WhereButton.Enabled:= false;
    WhereButton.visible:= false;
  end
else
  begin
    Edit_1.Enabled:= true;
    Edit_1.visible:= true;
    WhereButton.Enabled:= true;
    WhereButton.visible:= true;


  end;
end;

var
  DataDir: String;

function SrcDir(Param: String): String;
begin
  Result := DataDir;
end;

procedure ButtonOnClick(Sender: TObject);
var
  res: Boolean;
begin
  DataDir := ExpandConstant('{src}');
  res := BrowseForFolder('Выберите папку из списка и нажмите «ОК»', DataDir, True);
  if res then
    begin
      Edit_1.Text := DataDir;
    end;
    RePlaceTextinFile(ExpandConstant('{src}\make_db_backup.bat'), '%~dp0\backups', DataDir);
end;
function PUTT(filepath:string):string;
var
S: TArrayOfString;
i : Integer;
begin
if not FileExists(FilePath) then begin MsgBox('Файл не найден ' + FilePath, mbError, mb_Ok); Exit;end; // если файла нет, выходим
LoadStringsFromFile(FilePath, S); // загружаем файл
result := S[0];
end;
procedure InitializeWizard();
begin
  RedesignWizardForm;
  Edit_1.Text := ExpandConstant('{userdocs}');
  Edit_1.Enabled:= false;
  Edit_1.visible:= false;
  WhereButton.Enabled:= false;
  WhereButton.visible:= false;
  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('Добро пожаловать'), ExpandConstant('в процесс Удаление SC'), ExpandConstant('Следуюте инструкции. нажмите далее чтоб продолжить удаление или отмена чтоб ее отменить'), False, '' );
  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('Пароль') ,ExpandConstant('к баззе данных'), ExpandConstant('Введите') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);
 end;

function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
  ReturnCode: Integer;

begin
  Result := True;


  if CurPageID = PasswordPage.ID then begin
  UserVarPass := PasswordPage.Edits[0].Text;
  ExtractTemporaryFile('check.bat');
  Exec (ExpandConstant ('{tmp}\check.bat'), PasswordPage.Edits[0].Text + ' "' + PUTT(ExpandConstant('{src}\text.txt')) + '"', ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
  if ReturnCode = 0 then
    begin
      Result := True;
    end
  else
    begin
      MsgBox(ExpandConstant('Не верный пароль'), mbError, MB_OK);
      Result := False;
    end;
  DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;

end;
function GetPsqlPass(Param: String): String;
begin
  Result := UserVarPass;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;


Johny777 25-04-2012 17:49 1905784

Цитата:

Цитата Temyraz@fb
как мне прикрутить удаление к установке так, чтоб пользователь не заметил разницы? »

этот деинсталатор тот же инсталл, только для удаления
я плохо понимаю какие махинации делает батник и прочее, но скажу, что ты инсталле проверяешь наличие ключей и ставишь определённую версию
соответственно эти ключи никуда не денутся после установки
в деинсталятре так
ищем ключ - находим - значит стоит обновление - удаляем файлы обновления - удаляем всё, если нужно
или
ищем ключ - Не находим - значит стоит полная версия - удаляем файлы

Судя по первому коды ты так и не посмотрел мои посты с этим самым деинсталятором
У тебя не будет работать при таком раскладе

прочитай внимательно это


и давай писать компактнее по возможности
убери пожалуйста свои коды в
[more][code] твой код [/code][/more]

Ivan_009 25-04-2012 18:05 1905788

Вопрос как сделать, чтобы вместо запроса следующего диска можно было бы указать путь к следующему файлу...Тоесть укажите путь к следующему файлу и нажмите ок...

Johny777 25-04-2012 18:21 1905791

Ваня
я тебе уже писал
думал ты научился
http://forum.oszone.net/post-1886671-1326.html

Садись
2 тебе в дневник
завтра рядом с этой двойкой чтоб подпись родителей стояла!

Ivan_009 25-04-2012 18:27 1905793

Johny777 спасибо, :up до меня сначала не дошло.

ivsatel 25-04-2012 23:05 1905900

Подскажите почему "identifer expected" на else

Код:

function InitializeSetup(): Boolean;
var
    ErrorCode: Integer;
    NetFrameWorkInstalled : Boolean;
    Result1 : Boolean;
begin
  NetFrameWorkInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\.NETFramework\policy\v2.0');
  if NetFrameWorkInstalled =true then
    begin
      Result := true;
end;
  if NetFrameWorkInstalled = false then
    begin
      Result1 := MsgBox('This setup requires the .NET Framework. Please download and install the .NET Framework and run this setup again. Do you want to download the framwork now?',
      mbConfirmation, MB_YESNO) = idYes;
  if Result1 =false then
    begin
      Result:=false;
    end;
else
begin
      Result:=false;
      InstShellExec('http://www.microsoft.com/downloads/info.aspx?na=41&SrcFamilyId=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&SrcDisplayLang=ru&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f5%2f6%2f7%2f567758a3-759e-473e-bf8f-52154438565a%2fdotnetfx.exe','','',SW_SHOWNORMAL,ErrorCode);
begin
  NetFrameWorkInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\.NETFramework\policy\v4.0');
  if NetFrameWorkInstalled =true then
    begin
      Result := true;
end;
  if NetFrameWorkInstalled = false then
    begin
      Result1 := MsgBox('This setup requires the .NET Framework. Please download and install the .NET Framework and run this setup again. Do you want to download the framwork now?',
      mbConfirmation, MB_YESNO) = idYes;
  if Result1 =false then
    begin
      Result:=false;
    end;
else
begin
      Result:=false;
      InstShellExec('http://www.microsoft.com/downloads/info.aspx?na=41&SrcFamilyId=0A391ABD-25C1-4FC0-919F-B21F31AB88B7&SrcDisplayLang=ru&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f9%2f5%2fA%2f95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE%2fdotNetFx40_Full_x86_x64.exe','','',SW_SHOWNORMAL,ErrorCode);
end;
end;
end;
end;
end;
end;
end;


R.i.m.s.k.y. 25-04-2012 23:19 1905913

Цитата:

Цитата ivsatel
Подскажите почему "identifer expected" на else »

перед else точка с запятой не ставится

ivsatel 25-04-2012 23:25 1905918

Тогда InstShellExec почему то "unknown identifier")
Вот так работает:
ShellExec('open', 'http://download.microsoft.com/download/a/a/c/aac39226-8825-44ce-90e3-bf8203e74006/dotnetfx.exe','','',SW_SHOWNORMAL,ewNoWait,ErrorCode);

Temyraz@fb 26-04-2012 08:29 1906007

Johny777, в деинстоляторе он не будет искать ключ, он будет удалять одинакова в обоих случаях. полное удаление системы.
но там есть условия, если пользователь выбрал сделать бекап, то сначала делается бекап базы и файлов, это уже сделано у меня.
я читал как ты говорил, только почему та у меня там в итоге два деистолятора, один из которых просто все удаляет, а второй делает по скрипту. но надо сделать либо все в одном файле, либо чтоб один вызвал другого.

Johny777 26-04-2012 10:11 1906052

Цитата:

Цитата Temyraz@fb
я читал как ты говорил .... либо чтоб один вызвал другого. »

Нет. Не читал*(или плохо читал) .То что ты хочешь реализовано и описано по русски как (и при каком условии).
И касательно бэкапа повторюсь, Тот бэкап в том виде криво работал если директорию оставить по умолчанию и не менять. Проверь.
ЗЫ
я хочу чтобы ты сделал, а не я, тк тебе виднее что удалять,

R.i.m.s.k.y. 26-04-2012 11:02 1906077

Serega, El Sanchez, Александр Друзь
Цитата:

Цитата R.i.m.s.k.y.
подскажите, пожалуйста, как узнать "канальность" звука в windows »


Lancher 26-04-2012 12:58 1906137

Здравствуйте, поиск не помог.
Как сделать размер собранного инстяллятора больше 2,100,000,000 не используя diskspanning? Нужен один цельный файл.

El Sanchez 26-04-2012 13:35 1906158

Цитата:

Цитата R.i.m.s.k.y.
подскажите, пожалуйста, как узнать "канальность" звука в windows »

R.i.m.s.k.y., с bass.dll:
Код:

type
    BASS_CHANNELINFO = record
        freq, chans, flags, ctype, origres, plugin, sample: DWORD;
        filename: String;
    end;

function BASS_Init(device: Integer; freq, flags: DWORD; win: HWND; CLSID: Integer): BOOL; external 'BASS_Init@files:bass.dll stdcall delayload';
function BASS_StreamCreateFile(mem: BOOL; file: String; offset, length: Single; flags: DWORD): DWORD; external 'BASS_StreamCreateFile@files:bass.dll stdcall delayload';
function BASS_ChannelGetInfo(handle: DWORD; var info: BASS_CHANNELINFO): BOOL; external 'BASS_ChannelGetInfo@files:bass.dll stdcall delayload';
function BASS_Free(): BOOL; external 'BASS_Free@files:bass.dll stdcall delayload';

procedure InitializeWizard();
var
    hStream: DWORD;
    info: BASS_CHANNELINFO;
begin
    BASS_Init(-1, 44100, 0, 0, 0);
    hStream := BASS_StreamCreateFile(False, ExpandConstant('{win}\media\start.wav'), 0, 0, 0);
    BASS_ChannelGetInfo(hStream, info);
    BASS_Free;
    MsgBox('Channels: ' + IntToStr(info.chans), mbInformation, MB_OK);
end;


Temyraz@fb 26-04-2012 14:10 1906174

у меня вот какой вопрос
есть такая команда
читать дальше »
Код:

function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;


begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
    end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;


вот как сделать чтоб при
читать дальше »
Код:

begin
if CheckBoxA.Checked = true then
begin


не проверялось наличия уже существующей папки
а при
читать дальше »
Код:

if CheckBoxB.Checked = true then
  begin


проверялась
а?

Lancher 27-04-2012 11:44 1906645

Подскажите плиз, как сделать установщик одним файлом более 2.1 гигов?

Johny777 27-04-2012 14:11 1906717

Lancher,
стандартными средствами инно никак
воспользуйся внешними упаковщиками типа is7zip.dll или фриарк или ещё чем-нибудь
подробнее здесь http://forum.ru-board.com/topic.cgi?forum=5&topic=32025
Temyraz@fb
я ж тебе в скрипте так и сделал
если чекбокс А отмечен то в function NextButtonClick выполняется это на той ли иной странице при нажатии на кнопку "далее"
если чекбокс Б отмечен, то выполняется другое.
Ты хоть разбирал что к чему? Я старался не для того чтоб ты просто скомпилил и использовал, а чтоб ты посмотрел как оно сделано, понял, и смог при желании осмысленно воспроизвести :(

Temyraz@fb 27-04-2012 14:24 1906720

я и разобрался, много чего сделал. исправил. но все же не хочет этот момент сделать.
читать дальше »
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Synergy Center"
#ifndef MyAppVer
        #define MyAppVer "2.4"
#endif
#ifndef MyAppPatch
        #define MyAppPatch "11"
#endif
#ifndef MyAppBuild
        #define MyAppBuild "0"
#endif
#define MyAppPublisher "??? ???????? ??????? ?????????? ?????"

#define MyAppURL "http://www.ivt.su/"
#define InstalledLocalURL "http://localhost"

[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={{903E5749-D9EC-45A3-A5E1-B0621695F680}
AppName={#MyAppName}
AppVerName={#MyAppName} {#MyAppVer}.{#MyAppPatch}
VersionInfoVersion={#MyAppVer}.{#MyAppPatch}.{#MyAppBuild}
AppPublisher={#MyAppPublisher}
AppPublisherURL={#MyAppURL}
AppSupportURL={#MyAppURL}
AppUpdatesURL={#MyAppURL}
DefaultDirName=D:\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir={#MyOutputDir}
UpdateUninstallLogAppName=no
UsePreviousAppDir=yes
CreateUninstallRegKey=no
;DisableDirPage=yes

OutputBaseFilename=Synergy Center0 {#MyAppVer}.{#MyAppPatch}
Compression=lzma
SolidCompression=yes
WizardImageFile=wizard\WizModernImage-IS.bmp
WizardSmallImageFile=wizard\WizModernSmallImage-IS.bmp

[Languages]
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl; LicenseFile: dontcopy\license_ru.rtf
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl; LicenseFile: dontcopy\license_ua.rtf

[Registry]
Root: HKLM; Subkey: Software\IVTBelGU\Synergy Center; ValueType: string; ValueName: Version; ValueData: {#MyAppVer}.{#MyAppPatch}; Check: Run_B; Flags: uninsdeletekey

[Dirs]
Name: {app}\apache-tomcat; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\files; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\nginx; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\dbinit; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Check: Run_B; Languages:
Name: {app}\db_update; Flags: uninsneveruninstall; Check: Run_A; Languages:
Name: {app}\backups; Flags: uninsneveruninstall; Check: Run_A; Languages:
[InstallDelete]
Name: {app}\apache-tomcat\bin\service.bat; Type: filesandordirs; Check: Run_A; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\work\*; Type: filesandordirs; Check: Run_A; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\su\*; Type: filesandordirs; Check: Run_A; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\i18n\*; Type: filesandordirs; Check: Run_A; BeforeInstall: StopTomcat
Name: {app}\apache-tomcat\webapps\ROOT\WEB-INF\lib\*; Type: filesandordirs; Check: Run_A; BeforeInstall: StopTomcat

[Files]
Source: apache-tomcat\*; DestDir: {app}\apache-tomcat; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: apache-tomcat\msvcr71.dll; DestDir: {sys}\; Check: Run_B; Flags: onlyifdoesntexist
Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: configs\WEB-INF\settings.properties; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: configs\nginx_to_autorun.reg; DestDir: {app}\nginx\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\add_reg.bat; DestDir: {app}\nginx\; Check: Run_B; Flags: ignoreversion; AfterInstall: ReplacePathInConfigsReg
Source: nginx\*; DestDir: {app}\nginx; Check: Run_B; Flags: ignoreversion recursesubdirs createallsubdirs
Source: dbinit\*; DestDir: {app}\dbinit; Check: Run_B; Flags: ignoreversion recursesubdirs; AfterInstall: ReplacePathInConfigsPass
Source: UserMenu\*; DestDir: {app}; Check: Run_B; Flags: ignoreversion recursesubdirs; Languages: ; AfterInstall: ReplacePathInConfigs
Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\dbinit; Check: Run_B; Flags: ignoreversion




Source: {app}\apache-tomcat\webapps\ROOT\*; DestDir: {app}\backups\Webcontent-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs external uninsneveruninstall; Components: backup_app
Source: {#MyWebContentPath}\*; DestDir: {app}\apache-tomcat\webapps\ROOT; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: StopTomcat
Source: download\*; DestDir: {app}\apache-tomcat\webapps\ROOT\public\download\; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: apache-tomcat\bin\service.bat; DestDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; BeforeInstall: AddDefaultToConfig
Source: configs\WEB-INF\settings.properties; Check: Run_A; Flags: dontcopy
;Source: configs\WEB-INF\classes\log4j.xml; DestDir: {app}\apache-tomcat\webapps\ROOT\WEB-INF\classes\; Flags: ignoreversion; AfterInstall: ReplacePathInConfigs
Source: db_update\*; DestDir: {app}\db_update; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs; Languages:
;Source: D:\work\_Stable\setup\db\update\{#MyAppVer}\*.sql; DestDir: {app}\db_update\sql_scripts; Flags: ignoreversion
Source: {#MySetupDbPath}\db\*.sql; DestDir: {app}\db_update\sql_scripts; Check: Run_A; Flags: ignoreversion recursesubdirs createallsubdirs

Source: dontcopy\netstat1.bat; Flags: dontcopy
Source: dontcopy\check.bat; Check: Run_A; Flags: dontcopy
Source: dontcopy\check.bat; Check: Run_B; Flags: dontcopy

[Icons]
Name: {group}\{#MyAppName}; Check: Run_B; Filename: {#InstalledLocalURL}
;Name: {group}\Start Tomcat; Filename: {app}\TomcatServiceStart.exe; WorkingDir: {app}\; Comment: {cm:RunTomcat}; Flags: runminimized; Components:
;Name: {group}\Stop Tomcat; Filename: {app}\TomcatServiceStop.exe; WorkingDir: {app}\; Comment: {cm:StopTomcat}; Flags: runminimized
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\admin_manual.pdf; Check: Run_B; Languages: ru
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\user_manual.pdf; Check: Run_B; Languages: ru
Name: {group}\{cm:AdminManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_admin.pdf; Check: Run_B; Languages: ua
Name: {group}\{cm:UserManual}; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\ua\manual_user.pdf; Check: Run_B; Languages: ua
Name: {group}\{cm:Rukovodstvo_administratora}; Check: Run_B; Filename: {app}\apache-tomcat\webapps\ROOT\public\download\User_Manual\Manual_PDF\Rukovodstvo_administratora.pdf
Name: {group}\{cm:UninstallProgram,{#MyAppName}}; Check: Run_B; Filename: {uninstallexe}






[Run]
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Flags: runhidden; Check: Run_B; StatusMsg: Installing Apache Tomcat as Service
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; Components: PostgreSQL; Check: Run_B; StatusMsg: {cm:StartingTomcat}
Filename: {app}\dbinit\createAndInitDb.bat; Parameters: """{code:GetPsqlPath}""  {language}"; WorkingDir: {app}\dbinit\; Flags: shellexec runhidden waituntilterminated; Check: Run_B; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}
Filename: {app}\nginx\add_reg.bat; Check: Run_B; Flags: shellexec runhidden
Filename: {app}\start_nginx.bat; Check: Run_B; Flags: shellexec runhidden
Filename: {app}\dbinit\installAdditionalCards.bat; Parameters: """{code:GetPsqlPath}"" {language}"; WorkingDir: {app}\dbinit\; Check: Run_B; Flags: shellexec runhidden waituntilterminated; Components: PostgreSQL; StatusMsg: {cm:CreatingDatabase}; Tasks: IntstallDefaultShemes
Filename: {app}\Synergy Center.url; Description: {cm:LaunchProgram,{#MyAppName}}; Flags: nowait postinstall skipifsilent shellexec; Check: Run_B; Components: PostgreSQL


;Filename: {app}\postgresql\bin\pg_dump.exe; Parameters: "-h localhost -p 5432 -U postgres -F c -b -v -f ""{app}\backups\db-before-{#MyAppVer}.{#MyAppPatch}-{code:GetTodaysName}.backup"" sc"; Flags: waituntilterminated; StatusMsg: ????? ??????? ??; Components: backup_db
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " remove"; WorkingDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: runhidden
Filename: {app}\apache-tomcat\bin\service.bat; Parameters: " install"; WorkingDir: {app}\apache-tomcat\bin\; Check: Run_A; Flags: runhidden
Filename: {app}\db_update\make_db_backup.bat; WorkingDir: {app}\; Flags: shellexec  waituntilterminated; StatusMsg: StatusMsg: {cm:BackupingCurrentDB}; Check: Run_A; Components: backup_db
;Filename: NET; Parameters: "STOP ""Apache Tomcat"""; Flags: runhidden; StatusMsg: {cm:StoppingTomcat}
Filename: {app}\db_update\run_db_update.bat; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; Check: Run_A; StatusMsg: {cm:UpdatingDatabase}
;Filename: java; Parameters: " -jar --patches_path=""./sql_scripts/"" --log=""./sql_scripts/sql_scripts_log.log"" --sc_properites_path=""{app}/apache-tomcat/webapps/ROOT/WEB-INF/settings.properties"" "; WorkingDir: {app}\db_update\; Flags: shellexec  waituntilterminated; StatusMsg: {cm:UpdatingDatabase}
;Filename: rmdir; Parameters: "/S /Q ""{app}\apache-tomcat\work\Catalina\"""; Flags: shellexec runhidden; StatusMsg: {cm:StartingTomcat}
Filename: NET; Parameters: "START ""Apache Tomcat"""; Flags: runhidden; Check: Run_A; StatusMsg: {cm:StartingTomcat}





[Components]
Name: Tomcat; Description: {cm:ApacheTomcatComponent}; Flags: fixed; Types: custom compact full; Check: Skips
Name: PostgreSQL; Description: {cm:PostgresComponent}; Types: custom full; Flags: checkablealone; ExtraDiskSpaceRequired: 16080384; Check: Skips; Languages:

Name: backup_db; Description: {cm:MakeDBBackupComponent}; Flags: checkablealone; Types: custom full; Languages: ; ExtraDiskSpaceRequired: 5000000; Check: Skip
Name: backup_app; Description: {cm:MakeApplicationBackupComponent}; Flags: checkablealone; Types: custom full; ExtraDiskSpaceRequired: 50000000; Check: Skip

[Tasks]
Name: IntstallDefaultShemes; Description: {cm:IntstallDefaultShemes}; Flags: checkablealone; Components: Postgresql; Languages:


[ Code]

var
  CheckBoxA: TNewCheckBox;
  CheckBoxB: TNewCheckBox;

  PasswordPage: TInputQueryWizardPage;
  DataDirPage: TInputDirWizardPage;

  UserVarPass: String;
  PathToPsql: String;
  CheckLicense: TNewCheckBox;


procedure RePlaceTextinFile(FilePath:string; find:string; replace:string);
var
  S: TArrayOfString;
  i : Integer;
begin
  if not FileExists(FilePath) then begin MsgBox('Oaee ia iaeaai ' + FilePath, mbError, mb_Ok); Exit;end; // anee oaeea iao, auoiaei
  LoadStringsFromFile(FilePath, S);
  for i:= 0 to GetArrayLength(S)-1 do begin
    if (Pos(AnsiUpperCase(find), AnsiUpperCase(S[i])) > 0) then begin
      StringChangeEx(S[i], find, replace, True);
    end;
  end;
  SaveStringsToFile(FilePath, S, False); // nio?aiyai oaee
end;

procedure ReplacePathInConfigsReg();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','\\');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;

function CheckPortUsing(Port: String; fileStrings: TArrayOfString): Boolean;
var i: Integer;
begin
  for i:=0 to GetArrayLength(fileStrings)-1 do
  begin
                if ((Pos(':'+Port+' ',fileStrings[i])>0) and (Pos('LISTENING',fileStrings[i]) >0)) then
                        begin
                                Result := true;
                                exit;
                        end;
  end;
  Result := false;
end;



procedure LicenseOnClick(Sender: TObject);
begin
  WizardForm.NextButton.Enabled := false;
  if (CheckLicense.Checked) = True then

  begin
    WizardForm.LicenseAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := True;
  end else
  begin
    WizardForm.LicenseNotAcceptedRadio.Checked := True;
    WizardForm.NextButton.Enabled := False;
  end;
end;


function  ShouldSkipPage(PageID: Integer): Boolean;
begin
  case PageID of
    wpLicense: Result := True;
  end;
end;




function GetBuildNumber(param: String): String;
    var
          BuildVersion: String;
    begin
          LoadStringFromFile(ExpandConstant('buildNumber.txt'), BuildVersion);
          Result := BuildVersion;
    end;




function GetPsqlPath(Param: String): String;
begin
        Result := PathToPsql + '\psql.exe';
end;

procedure ReplacePathInConfigs();
var filecontent: String;
var pathForConfig: String;
var langForConfig: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  langForConfig:=ExpandConstant('{language}');
  pathForConfig:=ExpandConstant('{app}');
  StringChange(pathForConfig,'\','/');
  StringChange(filecontent,'{INSTALL_PATH}',pathForConfig);
  StringChange(filecontent,'{LANGUAGE}',langForConfig);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;



procedure ReplacePathInConfigsPass();
var filecontent: String;
begin
  LoadStringFromFile(ExpandConstant(CurrentFileName), filecontent);
  StringChange(filecontent,'{PG_PASS}',UserVarPass);
  SaveStringToFile(ExpandConstant(CurrentFileName), filecontent, false);
end;




procedure StopTomcat();
var
  ErrorCode: Integer;
begin
  if not Exec('NET',' STOP "Apache Tomcat"', '' ,SW_HIDE, ewWaitUntilTerminated, ErrorCode) then
  begin
    MsgBox('Fail to stop tomcat', mbInformation, mb_Ok);
  end;
end;





function CheckDBUpdateIsOk(): Boolean;
var filecontent: String;
var pathToLog: String;
begin
  Result:= false;
  pathToLog:=ExpandConstant('{app}')+'\db_update\db_update_log.log';
  LoadStringFromFile(pathToLog, filecontent);
  if (Pos('Update succesfully',filecontent)>0) then
  begin
        Result:= true;
  end

end;


procedure CurPageChanged(CurPageID: Integer);
  var ResultCode: Integer;
Begin
        if CurPageID=wpWelcome then
    begin
      WizardForm.NextButton.Enabled := False;
    end;
end;





procedure AddDefaultToConfig();
var filecontent_default: String;
var configStrings,defaultStrings: TArrayOfString;
var pathToConfig,pathToDefaultConfig,appPath: String;
var langForConfig,currentKey: String;
var currentPos,i,j: Integer;
var containKey: Boolean;
begin

  ExtractTemporaryFile('settings.properties');
  pathToConfig:=ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF\settings.properties';
  pathToDefaultConfig:=ExpandConstant('{tmp}\settings.properties');
  appPath:=ExpandConstant('{app}');
  langForConfig:=ExpandConstant('{language}');

  LoadStringFromFile(pathToDefaultConfig, filecontent_default);
  StringChange(appPath,'\','/');
  StringChange(filecontent_default,'{INSTALL_PATH}',appPath);
  StringChange(filecontent_default,'{LANGUAGE}',langForConfig);
  SaveStringToFile(pathToDefaultConfig, filecontent_default, false);

  LoadStringsFromFile(pathToDefaultConfig, defaultStrings);

  LoadStringsFromFile(pathToConfig, configStrings);

  for i:=0 to GetArrayLength(defaultStrings)-1 do
  begin
                currentPos:=Pos('=',defaultStrings[i]);
                if ((currentPos>0)) then
                        begin
                                currentKey:=Trim(Copy(defaultStrings[i], 0, currentPos-1));
                                containKey:=false;
                                  for j:=0 to GetArrayLength(configStrings)-1 do
                                        begin
                                                if ((Pos(currentKey,configStrings[j])>0)) then
                                                begin
                                                        containKey:=true;
                                                end;
                                        end;
                                if (containKey=false) then
                                        begin

                                                SetArrayLength(configStrings, GetArrayLength(configStrings)+1);
                                                configStrings[GetArrayLength(configStrings)-1]:=defaultStrings[i];
                                        end
                        end;
  end;
  SaveStringsToFile(pathToConfig, configStrings, false);
end;


var
  TodaysName : String;

function GetToday : String;
begin
  Result := GetDateTimeString ('yyyy.mm.dd hh.nn.ss', '-', #0);
end;

function GetTodaysName (Param: String): String;
begin
  if ('' = TodaysName) then
  begin
    TodaysName := GetToday ();
  end;
  Result := TodaysName;
end;







function Run_A: Boolean; begin Result:=CheckBoxA.Checked; end;
function Run_B: Boolean; begin Result:=CheckBoxB.Checked; end;


Function InitializeSetup: Boolean;
  var ResultCode: Integer;
  var fileStrings: TArrayOfString;
  var pathToOutput: String;
  var outputFile: String;

var
ReturnCode: Integer;



 begin
  if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\IVTBelGU\Synergy Center')
  then
    begin
      if MsgBox('Сообщение' + #10#13 +
                'Установить обновление Synergy Center?', mbError, MB_YESNO) = idYes
        then
          begin
          MsgBox(ExpandConstant('Сейчас будет устанавливаться обновление Synergy Center'), mbInformation, mb_Ok);
          Result :=  true;
          end

      else
          begin
          MsgBox(ExpandConstant('Сообщение' #13#10 'Не возможно установить Synergy Center, удалите предыдушую верисю и повторите попытку'), mbInformation, mb_Ok);
          Result :=  false;
                                  exit;
          end;

    end
    else
        Begin
        MsgBox(ExpandConstant('Сейчас будет устанавливаться Synergy Center'), mbInformation, mb_Ok);
          If (ExpandConstant('{reg:HKLM\Software\JavaSoft\Java Runtime Environment,CurrentVersion}') = '1.6')
          then
                              Result:= True
          else MsgBox(ExpandConstant('{cm:SetupJRE}'), mbInformation, mb_Ok);
              outputFile:=ExpandConstant('{tmp}\netstatoutput.log');
                    pathToOutput:=ExpandConstant('{tmp}\');
              ExtractTemporaryFile('netstat1.bat');
              if Exec(ExpandConstant('{tmp}\netstat1.bat'),  'netstatoutput.log', pathToOutput, SW_HIDE, ewWaitUntilTerminated, ResultCode)
          then
                  begin
                            //MsgBox(outputFile, mbInformation, mb_Ok);
                          // handle success if necessary; ResultCode contains the exit code
                          LoadStringsFromFile(outputFile, fileStrings);
                          DeleteFile(outputFile);
                          DeleteFile(ExpandConstant('{tmp}\netstat1.bat'));
                          If (CheckPortUsing('80',fileStrings) and (Result=true)) then
                              begin
                                Result := MsgBox(ExpandConstant('{cm:Port80InUse}'), mbConfirmation, MB_YESNO) = idYes;
                              end
            end
          else
          begin
          MsgBox('Error ', mbInformation, mb_Ok);
          end
          Result :=  true;

    end
End;

procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  WizardForm.LicenseNotAcceptedRadio.Hide;
  WizardForm.LicenseAcceptedRadio.Hide;
  { CheckLicense }
  CheckLicense := TNewCheckBox.Create(WizardForm);
  with CheckLicense do
  begin
    Name := 'CheckLicense';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(176);
    Top := ScaleY(288);
    Width := ScaleX(200);
    Height := ScaleY(17);
    OnClick := @LicenseOnClick;
    CheckLicense.Caption := WizardForm.LicenseAcceptedRadio.Caption;
  end;

  with WizardForm.LicenseMemo do
  begin
    Left := ScaleX(164);
    Top := ScaleY(0);
    Width := ScaleX(333);
    Height := ScaleY(284);
    Parent := WizardForm.WelcomePage;
  end;
        CheckLicense.Checked := false;

  DataDirPage := CreateInputDirPage(wpSelectDir, ExpandConstant('{cm:DirSelectCaption}'), ExpandConstant('{cm:DirSelectDescription}'), ExpandConstant('{cm:DirSelectSubCaption}'), False, '' );
  DataDirPage.Add('');
  DataDirPage.Values[0] := GetPreviousData('DataDir', 'C:\Program Files\PostgreSQL\9.0\bin');

  PasswordPage := CreateInputQueryPage(DataDirPage.ID, ExpandConstant('{cm:PasswordInputCaption}') ,ExpandConstant('{cm:PasswordInputDescription}'), ExpandConstant('{cm:PasswordInputSubCapton}') );
  PasswordPage.Add(SetupMessage(msgPasswordEditLabel), True);


  { CheckBoxA }
  CheckBoxA := TNewCheckBox.Create(WizardForm);
  with CheckBoxA do
  begin
    Name := 'CheckBoxA';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(176);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := '??????? 1';
  end;
  { CheckBoxB }
  CheckBoxB := TNewCheckBox.Create(WizardForm);
  with CheckBoxB do
  begin
    Name := 'CheckBoxB';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(208);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := '??????? 2';
  end;

  if RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\IVTBelGU\Synergy Center')
  then
    begin

      CheckBoxA.Enabled:=true;
      CheckBoxA.Checked:=true;

      CheckBoxB.Enabled:=false;
      CheckBoxB.Checked:=false;
    end

  else
    begin
      CheckBoxA.Enabled:=false;
      CheckBoxA.Checked:=false;

      CheckBoxB.Enabled:=true;
      CheckBoxB.Checked:=true;
    end;
CheckBoxA.visible:=false;
CheckBoxB.visible:=false;


end;


function NextButtonClick(CurPageID: Integer): Boolean;
var filecontent: String;
        ReturnCode: Integer;
begin




begin
if CheckBoxA.Checked = true then
begin

 If CurPageID = wpSelectDir then
  begin
        If (FileSearch('settings.properties', ExpandConstant('{app}')+'\apache-tomcat\webapps\ROOT\WEB-INF')='') then
        begin
                MsgBox(ExpandConstant('{cm:ErrorSCNotFound}'), mbCriticalError, mb_Ok);
                Result:=False;
        end
 end

 Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                        DeleteFile(ExpandConstant('{app}\text.txt'))
                        SaveStringToFile(ExpandConstant('{app}\text.txt'), DataDirPage.Edits[0].Text, True)
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end
       
  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end
end





if CheckBoxB.Checked = true then
  begin
  Result := True;
  if CurPageID = DataDirPage.ID then begin
        if FileExists ( DataDirPage.Edits[0].Text + '\psql.exe' ) then
                begin
                        Result := True;
                        PathToPsql := DataDirPage.Edits[0].Text;
                        DeleteFile(ExpandConstant('{app}\text.txt'))
                        SaveStringToFile(ExpandConstant('{app}\text.txt'), DataDirPage.Edits[0].Text, True)
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgNotFoundPsql}'), mbError, MB_OK);
                        Result := False;
                end;
        end;

  begin
  if CurPageID = PasswordPage.ID then begin
        UserVarPass := PasswordPage.Edits[0].Text;
        ExtractTemporaryFile('check.bat');
    Exec (ExpandConstant ( '{tmp}\check.bat' ), PasswordPage.Edits[0].Text + ' "' + PathToPsql + '"' , ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
        if ReturnCode = 0 then
                begin
                        Result := True;
                end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);
                        Result := False;
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;
end;
end;
end;


function Skip:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If not RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\IVTBelGU\Synergy Center') then
  Result:=False
end;
end;
function Skips:boolean;
var
  sz:Integer;
  s:string;
begin
  Result:=True;
begin
 If RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\Corssys\Synergy Center') or
    RegKeyExists(HKEY_LOCAL_MACHINE, 'Software\IVTBelGU\Synergy Center') then
  Result:=False
end;
end;


Temyraz@fb 27-04-2012 14:39 1906730

у меня не получается запретить при чекбокса А проверку наличия папки

Johny777 27-04-2012 16:31 1906781

Цитата:

Цитата Temyraz@fb
у меня не получается запретить при чекбокса А проверку наличия папки »

давай думать!
У тебя есть 2 чекбокса. И отмечен может быть только 1 из них.
К каждому чекбоксу, если он отмечен там и сям привязано уникальное действие.
Если папка должна проверяться как ты писал при отмеченном чекбоксе ( CheckBoxB.Checked ), то так тому и быть
Вопрос:
нафига привязывать запрет на проверку в чекбоксу А, если проверка идёт только(!) при отмеченном Б?
Это лишнее:(

Lancher 27-04-2012 16:39 1906783

Цитата:

Цитата Johny777
Lancher,
стандартными средствами инно никак
воспользуйся внешними упаковщиками типа is7zip.dll или фриарк или ещё чем-нибудь
подробнее здесь http://forum.ru-board.com/topic.cgi?forum=5&topic=32025 »

Т.е. как я понимаю, с помощью is7zip он просто сильнее сжимает - да? Но больший размер чем 2.1 быть все равно не может?

Devils Night 27-04-2012 17:11 1906807

Цитата:

Цитата Lancher
Т.е. как я понимаю, с помощью is7zip он просто сильнее сжимает - да? »

is7zip по моему вообще библиотека для распаковки 7zip. Жми 7zip-ом, я ужимал им 4 гига и ничего, он не умер.

А вообще полезно справочку почитать
вот отрывок

Цитата:

7z формат
7z - новый формат архива, который обеспечивает высокую степень сжатия.

Основные функции 7z формата:
  • Открытая архитектура
  • Высокая степень сжатия
  • Сильное AES-256 кодирование
  • Способность использовать любое сжатие, преобразование или метод кодирования
  • Поддержка файлов с размером до 16000000000 Гб
  • Имена файла в уникоде
  • Solid сжатие
  • Сжатие заголовков архива
7z имеет открытую архитектуру, таким образом, он может поддержать любые новые методы сжатия.

В настоящее время в 7z интегрированы следующие методы

Код:

Метод    Описание
LZMA      Улучшенная и оптимизированная версия LZ77 алгоритма
LZMA2    Метод сжатия основанный на LZMA. Он обеспечивает лучшую поддержку многопоточности, чем LZMA
PPMD      PPMdH Дмитрия Шкарина с небольшими изменениями
BCJ      Конвертер для 32-разрядных x86 исполнительных программ
BCJ2      Конвертер для 32-разрядных x86 исполнительных программ
BZip2    Стандартный BWT алгоритм
Deflate  Стандартный алгоритм основанный на LZ77

LZMA - значение по умолчанию и общий метод сжатия 7z формата. Основные функции LZMA метода:
  • Высокая степень сжатия
  • Переменный размер словаря (до 4 Гб)
  • Скорость сжатия: около 1 Мб/с на 2 ГГц-м процессоре
  • Скорость распаковки: около 10-20 Мб/с на 2 ГГц-м процессоре
  • Маленькие требуемые объемы и конфигурации памяти для распаковки (зависят от размера словаря)
  • Маленький размер кода для распаковки: приблизительно 5 кб
  • Поддержка многопоточности и P4 с hyper-threading

Алгоритм сжатия LZMA является наиболее подходящим для вложенных приложений. Если Вы хотите использовать код LZMA, Вы можете получить консультации, заказать программный код и требуемые лицензии разработчика на

www.7-zip.org/support.html

7-Zip также поддерживает кодирование с AES-256 алгоритмом. Этот алгоритм использует ключ шифра длиной 256 бит. Создавая этот ключ, 7-Zip использует функцию образования, основанную на алгоритме SHA-256 смешивания. Функция образования ключа производит получаемый ключ из текстового пароля, определенного пользователем. Чтобы увеличивать затраты времени для полного перебора паролей 7-Zip использует большое число итераций, чтобы создать ключ шифра из текстового пароля.


MrEugen 27-04-2012 20:19 1906912

Привет, ребята у меня есть ”обложка” для инсталятора в формате .ini как и где положить данные в скрипте чтобы был мой собственный стиль инсталятора а не стандартный? За ранее спасибо

MrEugen 27-04-2012 20:20 1906913

Привет, ребята у меня есть ”обложка” для инсталятора в формате .ini как и где положить данные в скрипте чтобы был мой собственный стиль инсталятора? За ранее спасибо

YURSHAT 27-04-2012 23:26 1907015

Цитата:

Цитата MrEugen
в формате .ini »

:o

Devils Night 28-04-2012 06:22 1907110

Цитата:

Цитата YURSHAT
:o »

Полагаю это не скин, а картинки, а выглядит действительно как скин.
Код:

SetupPic1 = pic-1.bmp
SetupPic2 = pic-2.bmp
SetupPic3 = pic-3.bmp
SetupPic4 = pic-4.bmp
SetupPic5 = pic-4.bmp
SetupPic6 = pic-4.bmp
SetupPic7 = pic-4.bmp
SetupPic8 = pic-4.bmp

Самому интересно узнать такую реализацию.

YURSHAT 28-04-2012 07:20 1907118

Цитата:

Цитата Devils Night
Самому интересно узнать такую реализацию. »

А чего там сложного то? ;) Какая разница откуда инсталл будет брать картинки, из темпа или из рядом лежащей папочки к примеру, а адрес изображений будет прописан в инишке :)

Lancher 28-04-2012 08:29 1907136

Цитата:

Цитата Devils Night
is7zip по моему вообще библиотека для распаковки 7zip. Жми 7zip-ом, я ужимал им 4 гига и ничего, он не умер.
А вообще полезно справочку почитать
вот отрывок »

Да просто беда в том, что он не ужимается до 2.1 гигов. Уже насоздавал 10ок архивов с разными параметрами сжатия - максимум что удалось ужать - это на 200 метров.
Мне еще интересно - почему в нсисе можно до 4х гигов делать инсталлятор - а в инно нет? Тут же явно не а файловой системе проблема. Мб есть какая-нить отдельная тулза или дллка которая расширяет этот параметр для инно?

Ivan_009 28-04-2012 08:56 1907149

Почему при использовании Tiger.cjstyles + слайдшоу эффект 6 - Fuse неправильно отображается... :( как исправить данную ошибку.

Temyraz@fb 28-04-2012 10:37 1907181

Цитата:

Цитата Johny777
Temyraz@fb
я ж тебе в скрипте так и сделал
если чекбокс А отмечен то в function NextButtonClick выполняется это на той ли иной странице при нажатии на кнопку "далее"
если чекбокс Б отмечен, то выполняется другое.
Ты хоть разбирал что к чему? Я старался не для того чтоб ты просто скомпилил и использовал, а чтоб ты посмотрел как оно сделано, понял, и смог при желании осмысленно воспроизвести »

но все равно делает проверку(((
может я не правильно выражаюсь, извините. но мне нужно чтоб место куда устанавливается приложение делалась проверка, при наличии папки выдавалась сообщение, это при чекбоксе В, а при чекбоксе А нет.
я думаю может этим как то можно похимичить?

читать дальше »
Предупреждения при установке в существующую папку
За появление сообщения «Папка … уже существует. Вы хотите продолжить установку в эту папку?»
отвечает директива DirExistsWarning. При DirExistsWarning=auto инсталятор выдаст это сообщение, если
UsePreviousAppDir=no или установка производится в папку впервые. При UsePreviousAppDir=yes
сообщение появится только при первой установке. Если DirExistsWarning=yes, сообщение будет
появляться всегда, а если DirExistsWarning=no, то не будет появляться никогда.


можно ли этим мне помочь?

Johny777 28-04-2012 11:15 1907193

Temyraz@fb,
плохо улавливаю мысль. Ты хочешь при отмеченном Б ставить в ту же папку, если установлено?
Если да то проверка идёт через реестр. Если ключ есть, то можно выводить сообщение и не только
читать дальше »
Код:

Setup
AppId=TheBestAppIdEver


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpSelectDir then
  begin
    if CheckBoxA.Checked = true then
    begin
      WizardForm.DirEdit.Text:=ExpandConstant('{pf}\Setup_A');
    end;
   
    if CheckBoxB.Checked = true then
    begin
      WizardForm.DirEdit.Text:=ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\Setup_B');
    end;
  end;
end;



Исправил

Gnom_aka_Lexander 28-04-2012 11:20 1907198

Ivan_009, потому, что тема тигр сама по себе криво отражается на работе с Layered-окнами, чем и является эффект Fuse в слайдшоу - два Layered-окна друг на друге. Используй другой скин, или лучше не используй его вообще.

Temyraz@fb 28-04-2012 11:28 1907201

хочу чтоб при чекбоксе В выводилась сообщение «Папка … уже существует. Вы хотите продолжить установку в эту папку?»
а при чекбоксе А не была такой проверки.

Johny777 28-04-2012 12:01 1907219

Temyraz@fb,
вот самодостаточный пример

читать дальше »
Код:


[Setup]
AppName=Test Mouse Event
AppVersion=1.5
OutputDir=.

AppId=TheBestAppIdEver
DefaultDirName={reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|{pf}\Setup_B}



[  Code]

var
  CheckBoxA: TNewCheckBox;
  CheckBoxB: TNewCheckBox;

function Run_A: Boolean; begin Result:=CheckBoxA.Checked; end;
function Run_B: Boolean; begin Result:=CheckBoxB.Checked; end;

procedure InitializeWizard;
begin
  WizardForm.WelcomeLabel1.Hide;
  WizardForm.WelcomeLabel2.Hide;
  { CheckBoxA }
  CheckBoxA := TNewCheckBox.Create(WizardForm);
  with CheckBoxA do
  begin
    Name := 'CheckBoxA';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(176);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'вариант 1';
  end;
  { CheckBoxB }
  CheckBoxB := TNewCheckBox.Create(WizardForm);
  with CheckBoxB do
  begin
    Name := 'CheckBoxB';
    Parent := WizardForm.WelcomePage;
    Left := ScaleX(216);
    Top := ScaleY(208);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'Вариант 2';
  end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpSelectDir then
  begin
//////  если отмечен чекбокс А
    if CheckBoxA.Checked = true then
    begin
      WizardForm.DirEdit.Text:=ExpandConstant('{pf}\Setup_A');  //// то путь установки такой
    end;
//////  если отмечен чекбокс Б
    if CheckBoxB.Checked = true then
    begin
      if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then  ///  если есть ключ
      begin
        if MsgBox('Папка … уже существует. Вы хотите продолжить установку в эту папку?', mbError, MB_YESNO) = idYes /// выводим сообщение /// если ответ ДА
        then
          begin
            WizardForm.DirEdit.Text:=ExpandConstant('{#SetupSetting("DefaultDirName")}');  /// путь через реестр (в скрипте, здесь, через препроцессор берётся строка из секции Setup сверху)
          end
        else
          begin
            WizardForm.DirEdit.Text:=ExpandConstant('{pf}\Setup_B');  //// в противном случа *(ответ "нет") - обычный путь для Б
          end;
      end;
    end;
  end;
end;



2 чекбокса на странице приветствия
если отмечен первый, то установка в {pf}\Setup_A
если второй {pf}\Setup_B

при повторном запуске инсталла и отмеченном втором чекбоксе при переходе на страницу выбора директории установки
проверяется ключ реестра, который вносится при первой установке
при наличии ключа появится месседж бокс с вопросм "да" "нет"

ответ "да" - путь папке приложения где бы она не находилась (куда установили)
ответ "нет" - стандартный путь {pf}\Setup_B

PS
только писать "Папка ... существует" не разумно, тк пользователь может поменять её название
Решение
либо просто "Папка существует..." либо "Приложение установлено. Установить туда же?"

Temyraz@fb 28-04-2012 12:46 1907248

ты наверное меня не понял.
у меня чекбокс А обновляет систему, а чекбокс В устанавливает на чистую систему. поэтому при варианте А не должна выдаваться сообщение о том что папка уже существует, а при варианте В должна

Johny777 28-04-2012 13:21 1907266

Temyraz@fb,
ты пример смотрел?
там только при Б
где ты запрос при А увидел?
При А вообще никаких проверок
пред тем как выложить пример я его проверил.

(добавил комментарии примеру сверху)

Temyraz@fb 28-04-2012 13:23 1907268

да менял, тоже самое получается.

извини, больше не буду

alert30 28-04-2012 13:29 1907273

detiedyatosla
Цитата:

Цитата detiedyatosla
склепать скрипт что бы в нём было расширенное окно инстолятора »

Использовать расширенный компилятор Inno Setup.


Цитата:

Цитата detiedyatosla
фоновая картинка на всех страницах инсталяции »

читать дальше »
Код:

[Setup]
WindowVisible=yes
;и по желанию
WindowResizable=no

[Files]
Source: "C:\My_Image.bmp"; DestDir: "{tmp}"; Flags: dontcopy
 
[_Code]
procedure InitializeWizard();
begin
  ExtractTemporaryFile('My_Image.bmp'); //My_Image.bmp - указываемое изображение в секции [Files]

  with TBitmapImage.Create(MainForm) do
  begin
    Parent := MainForm;
    Align := alClient;
    Bitmap.LoadFromFile(ExpandConstant('{tmp}\My_Image.bmp'));
    Stretch:=True;
  end;
end;


Devils Night 28-04-2012 13:33 1907275

YURSHAT, Да это просто был интерес, а так ничего полезного, только лишний мусор рядом в папке.
Цитата:

Цитата Lancher
Да просто беда в том, что он не ужимается до 2.1 гигов. »

читать дальше »
Погоди, тебе что нужно?:
1. Ужать допустим 4 гига в 2.1 гб?
2. Распределить файлы так чтобы они не важно какое количество рапределялось по 2.1 гб, так?
3. Сделать инсталятор в 4 гига?

И так:
По первому, это вряд ли, потому как есть файлы которые вообще никак не ужимаются, даже если ты будешь использовать супер-мега-ультра-64 компрессию. Можешь конечно ещё попробовать фриарк или прекомп, но и то вряд ли.

По второму, это тебе самому нужно тестировать и расчитывать. Я тоже пытался распределить, так чтобы было ровно по 2 гига, но сжатие сделало своё дело и всё сжалось не так как хотел, и архивы стали на много меньше чем расчитывал, по этому тебе придётся сжать все свои файлы и смотреть где степень сжатия 0 кб, и вот как раз эти файлы распределить таким образом, чтобы было как максимум приблизительно к тому размеру какой хочешь.

По третьему, инно этого не умеет, может только рядом создать файл типа setup-1.bin.

Цитата:

Цитата Lancher
Мне еще интересно - почему в нсисе можно до 4х гигов делать инсталлятор - а в инно нет? »

Да инно много чего не умеет, например ещё добавлять запрещённые ветки реестра, или добавлять службы без последствий, хотя InstalShield без проблем с этим справляется.
А вообще, а вообще, эта тема не предназначена для обсуждения различного степени сжатия файлов, по этому пройди сюда или сюда.
Эта тема предназначена только для обсуждения написания скриптов!

Johny777 28-04-2012 13:47 1907283

Цитата:

Цитата Devils Night
а так ничего полезного »

не скажи
взять мой скрипт
при запуске извлекаются 70 метров картинок
вот так
ExtractTemporaryFile('My_Image.bmp');
а потом грузятся
так
LoadFromFile(ExpandConstant('{tmp}\My_Image.bmp'));
А если рядом лежат (да лучше когда рядом их нет), то просто можно грузить без извлечения
Это должно повысить скорость запуска.
(хотя я не собираюсь этого делать, но + ещё в том, что даже после компиляции ты можешь в какой-то мере менять внешность инсталла)
Цитата:

Цитата Devils Night
использовать супер-мега-ультра-64 компрессию. Можешь конечно ещё попробовать фриарк или прекомп, но и от вряд ли »

покруче всего этого будет NanoZip. Он очень сильно жмёт. Не намного хуже связки прекомп+фриарк
тут внизу тест
http://freearc.org/HFCB.aspx

Bolshaya_Dzhigurda@fb 28-04-2012 17:00 1907371

Здравствуйте! Проблема с удалением. При удалении ошибка
Код:

Internal error: Cannot find utCompiledCode record for this version of the uninstaller
Сам скрипт

Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "Medal of Honor"
#define MyAppVersion "592256"
#define MyAppPublisher "EA"
#define MyAppExeName "moh.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.)
DiskSpanning=true
DiskSliceSize=1457664000
AppId={{F5BCF2BF-4EC2-4ECF-9C70-F1582F2AB889}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
OutputDir=D:\Установщики
OutputBaseFilename=setup
SetupIconFile=C:\Documents and Settings\Neo\Рабочий стол\00000.ico
Compression=lzma
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
Name: task1; Description: Установка дополнительного программного обеспечения;
Name: task1\task2; Description: Punk Buster; Flags: unchecked

[Files]
Source: "D:\Games\Medal Of Honor\Binaries\moh.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "D:\Games\Medal Of Honor\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: "{group}\Проверить наличие обновлений"; Filename: "{app}\MP\mohmpupdater.exe"
Name: "{group}\Medal of Honor Multiplayer"; Filename: "{app}\MP\MoHMPGame.exe"
Name: "{group}\Medal of Honor"; Filename: "{app}\Binaries\moh.exe"
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\Medal of Honor Multiplayer"; Filename: "{app}\MP\MoHMPGame.exe"; Tasks: desktopicon
Name: "{commondesktop}\Medal of Honor"; Filename: "{app}\Binaries\moh.exe"; Tasks: desktopicon

[Run]
Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
Filename: {app}\Support\PunkBuster\pbsvc_moh.exe; WorkingDir: {app}; StatusMsg: Установка PunkBuster; Flags: waituntilterminated; Tasks: task1\task2

[Registry]
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: DisplayName; ValueData: "Medal of Honor (TM)"; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: "CD Drive"; ValueData: ""; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: ProductName; ValueData: """Medal of Honor (TM)"""; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: Folder; ValueData: ""; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: "Install Dir"; ValueData: {app}; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: "Installed From"; ValueData: ""; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: Locale; ValueData: "ru"; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: Language; ValueData: "Russian"; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: "Product GUID"; ValueData: "415030B8-3E8B-462A-8C03-41D95AA3AB3B"; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: "Suppression Exe"; ValueData: ""; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor"; ValueName: Registration; ValueData: "Software\\Electronic Arts\\Electronic Arts\\Medal of Honor\\ergc"; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor\1.0"; ValueName: DisplayName; ValueData: "Medal of Honor"; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor\1.0"; ValueName: Language; ValueData: 00000010; ValueType: dword;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor\1.0"; ValueName: LanguageName; ValueData: "Russian"; ValueType: string;
Root: HKLM; SubKey: "SOFTWARE\Electronic Arts\Medal of Honor\1.0"; ValueName: ProgramGroup; ValueData: ""; ValueType: string;


detiedyatosla 28-04-2012 17:03 1907372

помогите сделать скрипт с увеличиным окном инсталятора и фоновой картинкой на всех страницах

alert30 28-04-2012 18:03 1907400

Bolshaya_Dzhigurda@fb, попробуй генерировать ID приложения.


detiedyatosla, я уже написАл: пост #1705. Сколько можно повторять, за столькие же вопросы?

detiedyatosla 28-04-2012 18:12 1907404

alert30,
это совсем не то

alert30 28-04-2012 18:26 1907409

detiedyatosla, другой скрипт для фона, только требуется библиотеку isxbb.dll:
читать дальше »
Код:

[Setup]
WindowVisible=yes
WindowResizable=no
WindowShowCaption=no

[Files]
Source: C:\isxbb.dll; DestDir: {tmp}; Flags: dontcopy
Source: C:\1.jpg; DestDir: {tmp}; Flags: dontcopy

[_Code]
const
  BACKGROUND=6;

function isxbb_AddImage(Image: PChar; Flags: Cardinal): Integer;
external 'isxbb_AddImage@files:isxbb.dll stdcall';

function isxbb_Init(hWnd: Integer): Integer;
external 'isxbb_Init@files:isxbb.dll stdcall';

procedure InitializeWizard();
begin
    ExtractTemporaryFile('1.jpg');
    isxbb_AddImage(ExpandConstant('{tmp}')+'\1.jpg',BACKGROUND);
    isxbb_Init(StrToInt(ExpandConstant('{hwnd}')));
end;


detiedyatosla 28-04-2012 18:54 1907421

alert30, нужно растянуть инсталятор и в него вставить картинку на все страницы

alert30 28-04-2012 19:05 1907425

detiedyatosla, а Вы хоть пробовали?

detiedyatosla 28-04-2012 19:09 1907426

alert30, да там с кнопками проблема
они по середине инстала

alert30 28-04-2012 19:11 1907427

detiedyatosla, покажите скриншоты.

detiedyatosla 28-04-2012 19:18 1907435

alert30, это мой друг делал есть ссылка
http://forum.oszone.net/attachment.p...6&d=1335180407

alert30 28-04-2012 19:21 1907436

detiedyatosla, где то этот скрипт я видел (еще и сделал мои RePack-и)...
...что в инсталяторе, хоть и растяженном. Попробуй отыскать.

detiedyatosla 28-04-2012 19:23 1907437

alert30, а где конкретно искать ?

alert30 28-04-2012 19:26 1907439

detiedyatosla, почитай в архиве скрипта (в шапке ссылка). Я бы рад скинуть скрипт, но как-бы то ни было придется долго искать.

detiedyatosla 28-04-2012 19:38 1907443

alert30, всёравно не работает
помоги соеденить мож я что то не так делаю

alert30 28-04-2012 19:49 1907449

detiedyatosla


detiedyatosla 28-04-2012 19:51 1907452

alert30, спасибо я видел
у меня скрипт не работает а не проблемы со зрением

Devils Night 28-04-2012 20:51 1907480

Цитата:

Цитата detiedyatosla
нужно растянуть инсталятор»

Цитата:

Цитата detiedyatosla
спасибо я видел »

Значит плохо видел. alert30, тебе дал пищу для ума, и между прочим, тут были примеры как сделать, растянуть форму, перетащить кнопки и писалось не один раз, и если бы ты хоть чуть чуть напрягся, а не ленился, то ты бы сделал бы себе подобное этому:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVersion=1.5
;AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Icons]
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"; Tasks: desktopicon

[ Code]
procedure TasksListClick(Sender: TObject); forward;

procedure RedesignWizardForm;
begin
  with WizardForm do
  begin
    AutoScroll := False;
    ClientHeight := ScaleY(576);
    ClientWidth := ScaleX(799);
  end;

  with WizardForm.Bevel do
  begin
    Top := ScaleY(535);
    Width := ScaleX(799);
  end;

  with WizardForm.CancelButton do
  begin
    Left := ScaleX(708);
    Top := ScaleY(543);
  end;

  with WizardForm.NextButton do
  begin
    Left := ScaleX(623);
    Top := ScaleY(543);
  end;

  with WizardForm.BackButton do
  begin
    Left := ScaleX(543);
    Top := ScaleY(543);
  end;

  with WizardForm.OuterNotebook do
  begin
    Width := ScaleX(799);
    Height := ScaleY(535);
  end;

  with WizardForm.WizardBitmapImage do
  begin
    Width := ScaleX(798);
    Height := ScaleY(538);
  end;

  with WizardForm.WelcomeLabel2 do
  begin
    Top := ScaleY(215);
    Width := ScaleX(589);
    Height := ScaleY(79);
  end;

  with WizardForm.WelcomeLabel1 do
  begin
    Top := ScaleY(160);
    Width := ScaleX(589);
    Height := ScaleY(31);
  end;

  with WizardForm.Bevel1 do
  begin
    Width := ScaleX(801);
  end;

  with WizardForm.InnerNotebook do
  begin
    Width := ScaleX(713);
    Height := ScaleY(437);
  end;

  with WizardForm.LicenseNotAcceptedRadio do
  begin
    Left := ScaleX(8);
    Top := ScaleY(416);
  end;

  with WizardForm.LicenseAcceptedRadio do
  begin
    Left := ScaleX(8);
    Top := ScaleY(396);
  end;

  with WizardForm.LicenseMemo do
  begin
    Width := ScaleX(713);
    Height := ScaleY(348);
  end;

  with WizardForm.PasswordEdit do
  begin
    Left := ScaleX(144);
    Top := ScaleY(413);
    Width := ScaleX(553);
  end;

  with WizardForm.PasswordEditLabel do
  begin
    Top := ScaleY(417);
    Width := ScaleX(137);
  end;

  with WizardForm.InfoBeforeMemo do
  begin
    Top := ScaleY(16);
    Width := ScaleX(713);
    Height := ScaleY(421);
  end;

  with WizardForm.UserInfoSerialEdit do
  begin
    Left := ScaleX(16);
    Top := ScaleY(232);
  end;

  with WizardForm.UserInfoSerialLabel do
  begin
    Left := ScaleX(16);
    Top := ScaleY(216);
  end;

  with WizardForm.UserInfoOrgEdit do
  begin
    Left := ScaleX(16);
    Top := ScaleY(180);
  end;

  with WizardForm.UserInfoOrgLabel do
  begin
    Left := ScaleX(16);
    Top := ScaleY(164);
  end;

  with WizardForm.UserInfoNameEdit do
  begin
    Left := ScaleX(16);
    Top := ScaleY(128);
  end;

  with WizardForm.UserInfoNameLabel do
  begin
    Left := ScaleX(16);
    Top := ScaleY(112);
  end;

  with WizardForm.DiskSpaceLabel do
  begin
    Left := ScaleX(8);
    Top := ScaleY(408);
  end;

  with WizardForm.DirBrowseButton do
  begin
    Left := ScaleX(630);
    Top := ScaleY(378);
  end;

  with WizardForm.DirEdit do
  begin
    Left := ScaleX(8);
    Top := ScaleY(380);
    Width := ScaleX(620);
  end;

  with WizardForm.SelectDirBrowseLabel do
  begin
    Left := ScaleX(8);
    Top := ScaleY(348);
    Width := ScaleX(689);
  end;

  with WizardForm.ComponentsDiskSpaceLabel do
  begin
    Left := ScaleX(8);
    Top := ScaleY(416);
  end;

  with WizardForm.ComponentsList do
  begin
    Width := ScaleX(713);
    Height := ScaleY(352);
  end;

  with WizardForm.TypesCombo do
  begin
    Width := ScaleX(713);
  end;

  with WizardForm.NoIconsCheck do
  begin
    Left := ScaleX(8);
    Top := ScaleY(407);
  end;

  with WizardForm.GroupBrowseButton do
  begin
    Left := ScaleX(630);
    Top := ScaleY(378);
  end;

  with WizardForm.GroupEdit do
  begin
    Left := ScaleX(8);
    Top := ScaleY(380);
    Width := ScaleX(620);
  end;

  with WizardForm.SelectStartMenuFolderBrowseLabel do
  begin
    Left := ScaleX(8);
    Top := ScaleY(348);
  end;

  with WizardForm.TasksList do
  begin
    Width := ScaleX(713);
    Height := ScaleY(400);
    OnClick := @TasksListClick;
  end;

  with WizardForm.ReadyMemo do
  begin
    Width := ScaleX(713);
    Height := ScaleY(413);
  end;

  with WizardForm.FilenameLabel do
  begin
    Left := ScaleX(200);
    Top := ScaleY(392);
    Width := ScaleX(497);
  end;

  with WizardForm.StatusLabel do
  begin
    Left := ScaleX(8);
    Top := ScaleY(392);
    Width := ScaleX(169);
  end;

  with WizardForm.ProgressGauge do
  begin
    Left := ScaleX(8);
    Top := ScaleY(410);
    Width := ScaleX(697);
  end;

  with WizardForm.InfoAfterMemo do
  begin
    Width := ScaleX(713);
    Height := ScaleY(413);
  end;

  with WizardForm.MainPanel do
  begin
    Width := ScaleX(801);
  end;

  with WizardForm.WizardSmallBitmapImage do
  begin
    Left := ScaleX(744);
    Top := ScaleY(0);
  end;

  with WizardForm.PageDescriptionLabel do
  begin
    Width := ScaleX(701);
  end;

  with WizardForm.WizardBitmapImage2 do
  begin
    Width := ScaleX(798);
    Height := ScaleY(538);
  end;

  with WizardForm.RunList do
  begin
    Top := ScaleY(414);
    Width := ScaleX(613);
    Height := ScaleY(60);
  end;

  with WizardForm.NoRadio do
  begin
    Top := ScaleY(444);
  end;

  with WizardForm.YesRadio do
  begin
    Top := ScaleY(422);
  end;

  with WizardForm.FinishedLabel do
  begin
    Left := ScaleX(168);
    Top := ScaleY(319);
    Width := ScaleX(621);
  end;

  with WizardForm.FinishedHeadingLabel do
  begin
    Left := ScaleX(168);
    Top := ScaleY(272);
    Width := ScaleX(621);
    Height := ScaleY(39);
  end;
end;

procedure TasksListClick(Sender: TObject);
begin

end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;



Цитата:

Цитата detiedyatosla
и в него вставить картинку на все страницы »

Вот пример из справки:
читать дальше »
Код:

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


[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

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

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Flags : ignoreversion

[Run]
FileName: {app}\MyProg.exe; Description: Запустить My Program?; Flags: postinstall nowait skipifsilent

[Icons]
Name: "{group}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{cm:UninstallProgram,My Program}"; Filename: "{uninstallexe}"; Tasks: desktopicon


[ Code]
var
pnl: TPanel;

///////////////////////WelcomePage//////////////////////////////////////
procedure WelcomePage;
begin
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm. WelcomeLabel1.AutoSize;
SetBounds(WizardForm.WelcomeLabel1.Left,WizardForm.WelcomeLabel1.Top,
WizardForm.WelcomeLabel1.Width,WizardForm.WelcomeLabel1.Height);
WordWrap:= WizardForm.WelcomeLabel1.WordWrap;
Caption:= WizardForm.WelcomeLabel1.Caption;
with Font do
begin
Color:= WizardForm.WelcomeLabel1.Font.Color;
Style:= WizardForm.WelcomeLabel1.Font.Style;
Name:= WizardForm.WelcomeLabel1.Font.Name;
Size:= WizardForm.WelcomeLabel1.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.WelcomeLabel2.AutoSize;
SetBounds(WizardForm.WelcomeLabel2.Left,WizardForm.WelcomeLabel2.Top,
WizardForm.WelcomeLabel2.Width,WizardForm.WelcomeLabel2.Height);
WordWrap:= WizardForm.WelcomeLabel2.WordWrap;
Caption:= WizardForm.WelcomeLabel2.Caption;
with Font do
begin
Color:= WizardForm.WelcomeLabel2.Font.Color;
Style:= WizardForm.WelcomeLabel2.Font.Style;
Name:= WizardForm.WelcomeLabel2.Font.Name;
Size:= WizardForm.WelcomeLabel2.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;
/////////////////////////////////////////////////////////////////

///////////////////////SelectDirPage//////////////////////////////////////
procedure SelectDirPage;
begin
with WizardForm do
begin
with DirEdit do
begin
Left:= 40;
Top:= 137;
Parent:= pnl;
end;
with DirBrowseButton do
begin
Left:= WizardForm.DirEdit.Left + WizardForm.DirEdit.Width + 10;
Top:= WizardForm.DirEdit.Top - 1;
Parent:= pnl;
end;
with SelectDirBitmapImage do
begin
Left:= WizardForm.DirEdit.Left;
Top:= WizardForm.DirEdit.Top - 62;
Stretch:= True;
Parent:= pnl;
end;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.SelectDirBrowseLabel.AutoSize;
SetBounds(WizardForm.DirEdit.Left,WizardForm.DirEdit.Top - 30,
WizardForm.SelectDirBrowseLabel.Width, WizardForm.SelectDirBrowseLabel.Height);
WordWrap:= WizardForm.SelectDirBrowseLabel.WordWrap;
Caption:= WizardForm.SelectDirBrowseLabel.Caption;
with Font do
begin
Color:= WizardForm.SelectDirBrowseLabel.Font.Color;
Style:= WizardForm.SelectDirBrowseLabel.Font.Style;
Name:= WizardForm. SelectDirBrowseLabel.Font.Name;
Size:= WizardForm.SelectDirBrowseLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.SelectDirLabel.AutoSize;
SetBounds(WizardForm.SelectDirBitmapImage.Left + 50,WizardForm.SelectDirBitmapImage.Top + 10,
WizardForm.SelectDirLabel.Width,WizardForm.SelectDirLabel.Height);
WordWrap:= WizardForm.SelectDirLabel.WordWrap;
Caption:= WizardForm.SelectDirLabel.Caption;
with Font do
begin
Color:= WizardForm.SelectDirLabel.Font.Color;
Style:= WizardForm.SelectDirLabel.Font.Style;
Name:= WizardForm.SelectDirLabel.Font.Name;
Size:= WizardForm.SelectDirLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.DiskSpaceLabel.AutoSize;
SetBounds(WizardForm.DirEdit.Left,WizardForm.Bevel.Top - 25,
WizardForm.DiskSpaceLabel.Width,WizardForm.DiskSpaceLabel.Height);
WordWrap:= WizardForm.DiskSpaceLabel.WordWrap;
Caption:= WizardForm.DiskSpaceLabel.Caption;
with Font do
begin
Color:= WizardForm.DiskSpaceLabel.Font.Color;
Style:= WizardForm.DiskSpaceLabel.Font.Style;
Name:= WizardForm.DiskSpaceLabel.Font.Name;
Size:= WizardForm.DiskSpaceLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;
/////////////////////////////////////////////////////////////////

///////////////////////ReadyPage/////////////////////////////////
procedure ReadyPage;
var
ready_str: string;
begin
ready_str:= WizardForm.ReadyMemo.Text;
with TLabel.Create(pnl) do
begin
SetBounds(45,115,WizardForm.ReadyMemo.Width, WizardForm.ReadyMemo.Height);
Caption:= ready_str;
with Font do
begin
Color:= WizardForm.ReadyLabel.Font.Color;
Style:= WizardForm.ReadyLabel.Font.Style;
Name:= WizardForm.ReadyLabel.Font.Name;
Size:= WizardForm.ReadyLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TBevel.Create(WizardForm) do
begin
SetBounds(40,110, WizardForm.ReadyMemo.Width, WizardForm.ReadyMemo.Height);
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.ReadyLabel.AutoSize;
SetBounds(40,70, WizardForm.ReadyLabel.Width, WizardForm.ReadyLabel.Height);
WordWrap:= WizardForm.ReadyLabel.WordWrap;
Caption:= WizardForm.ReadyLabel.Caption;
with Font do
begin
Color:= WizardForm.ReadyLabel.Font.Color;
Style:= WizardForm.ReadyLabel.Font.Style;
Name:= WizardForm.ReadyLabel.Font.Name;
Size:= WizardForm.ReadyLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;
/////////////////////////////////////////////////////////////////

///////////////////////InstallingPage////////////////////////////
procedure InstallingPage;
begin
with WizardForm.ProgressGauge do
begin
Left:= 40;
Top:= 115;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.FileNameLabel.AutoSize;
SetBounds(WizardForm.ProgressGauge.Left,WizardForm.ProgressGauge.Top-20,
WizardForm.FileNameLabel.Width,WizardForm.FileNameLabel.Height);
WordWrap:= WizardForm.FileNameLabel.WordWrap;
Caption:= WizardForm.FileNameLabel.Caption;
with Font do
begin
Color:= WizardForm.FileNameLabel.Font.Color;
Style:= WizardForm.FileNameLabel.Font.Style;
Name:= WizardForm.FileNameLabel.Font.Name;
Size:= WizardForm.FileNameLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.StatusLabel.AutoSize;
SetBounds(WizardForm.StatusLabel.Left,WizardForm.StatusLabel.Top,
WizardForm.StatusLabel.Width,WizardForm.StatusLabel.Height);
WordWrap:= WizardForm.StatusLabel.WordWrap;
Caption:= WizardForm.StatusLabel.Caption;
with Font do
begin
Color:= WizardForm.StatusLabel.Font.Color;
Style:= WizardForm.StatusLabel.Font.Style;
Name:= WizardForm.StatusLabel.Font.Name;
Size:= WizardForm.StatusLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;
/////////////////////////////////////////////////////////////////

///////////////////////FinishedPage//////////////////////////////
var
CheckBox: array of TNewCheckBox;

procedure CheckBoxClick( Sender: TObject);
begin
if TNewCheckBox(Sender).Checked then
WizardForm.RunList.Checked[TNewCheckBox(Sender).Tag]:= True
else WizardForm.RunList.Checked[TNewCheckBox(Sender).Tag]:= False;
end;

procedure LabelClick(Sender:TObject);
begin
if CheckBox[TLabel(Sender).Tag].Checked then
begin
WizardForm.RunList.Checked[TLabel(Sender).Tag]:= False;
CheckBox[TLabel( Sender).Tag].Checked:= False;
end
else
begin
WizardForm.RunList.Checked[TLabel( Sender).Tag]:= True;
CheckBox[TLabel(Sender).Tag].Checked:= True;
end;
end;

procedure HideRunList(Control: TWinControl);
var
i, t: Integer;
str: string;
begin
if WizardForm.RunList.Items.Count > 0 then
begin
WizardForm.RunList.Hide;
SetArrayLength(CheckBox, SizeOf(WizardForm.RunList.Items.Count));
for i:= 0 to WizardForm.RunList.Items.Count-1 do
begin
CheckBox[i]:= TNewCheckBox.Create(Control);
with CheckBox[i] do
begin
SetBounds(ScaleX(WizardForm.RunList.Left+2),ScaleY(WizardForm.RunList.Top+2+t),14,14);
Tag:= i;
Checked:= WizardForm.RunList.Checked[i];
Caption:= WizardForm.RunList.Items.Strings[i];
OnClick:= @CheckBoxClick;
Color:= clWhite;
Parent:= Control;
end;
str:= WizardForm.RunList.Items.Strings[i];
with TLabel.Create(WizardForm) do
begin
SetBounds(ScaleX(WizardForm.RunList.Left+20),ScaleY(WizardForm.RunList.Top+2+t),
WizardForm.RunList.Width,14);
Caption:= str;
Tag:= i;
OnClick:= @LabelClick;
Transparent:= True;
Parent:= Control;
end;
t:= t + 20;
end;
end;
end;

procedure FinishedPage;
begin
HideRunList(pnl);
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.FinishedHeadingLabel.AutoSize;
SetBounds(WizardForm.FinishedHeadingLabel.Left,WizardForm.FinishedHeadingLabel.Top,
WizardForm.FinishedHeadingLabel.Width,WizardForm.FinishedHeadingLabel.Height);
WordWrap:= WizardForm.FinishedHeadingLabel.WordWrap;
Caption:= WizardForm.FinishedHeadingLabel.Caption;
with Font do
begin
Color:= WizardForm.FinishedHeadingLabel.Font.Color;
Style:= WizardForm.FinishedHeadingLabel.Font.Style;
Name:= WizardForm.FinishedHeadingLabel.Font.Name;
Size:= WizardForm.FinishedHeadingLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.FinishedLabel.AutoSize;
SetBounds(WizardForm.FinishedLabel.Left,WizardForm.FinishedLabel.Top,
WizardForm.FinishedLabel.Width,WizardForm.FinishedLabel.Height);
WordWrap:= WizardForm.FinishedLabel.WordWrap;
Caption:= WizardForm.FinishedLabel.Caption;
with Font do
begin
Color:= WizardForm.FinishedLabel.Font.Color;
Style:= WizardForm.FinishedLabel.Font.Style;
Name:= WizardForm.FinishedLabel.Font.Name;
Size:= WizardForm.FinishedLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;
/////////////////////////////////////////////////////////////////

procedure CurPageChanged(CurPageID: Integer);
begin
pnl:= TPanel.Create(WizardForm);
with pnl do
begin
Align:= alClient;
Parent:= WizardForm;
end;
with WizardForm do
begin
with WizardBitmapImage do
begin
Align:= alClient;
Stretch:= True;
Parent:= pnl;
end;
NextButton.Parent:= pnl;
CancelButton.Parent:= pnl;
BackButton.Parent:= pnl ;
Bevel.Parent:= pnl;
pnl.Repaint;
end;

if (CurPageID > wpWelcome) and (CurPageID < wpFinished) then
begin
WizardForm.Bevel1.Parent:= pnl;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.PageNameLabel.AutoSize;
SetBounds(WizardForm.PageNameLabel.Left,WizardForm.PageNameLabel.Top,
WizardForm.PageNameLabel.Width,WizardForm.PageNameLabel.Height);
Caption:= WizardForm.PageNameLabel.Caption;
with Font do
begin
Color:= WizardForm.PageNameLabel.Font.Color;
Style:= WizardForm.PageNameLabel.Font.Style;
Name:= WizardForm.PageNameLabel.Font.Name;
Size:= WizardForm.PageNameLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
with TLabel.Create(pnl) do
begin
AutoSize:= WizardForm.PageNameLabel.AutoSize;
SetBounds(WizardForm.PageNameLabel.Left,WizardForm.PageNameLabel.Top,
WizardForm.PageNameLabel.Width,WizardForm.PageNameLabel.Height);
Caption:= WizardForm.PageNameLabel.Caption;
with Font do
begin
Color:= WizardForm.PageNameLabel.Font.Color;
Style:= WizardForm.PageNameLabel.Font.Style;
Name:= WizardForm.PageNameLabel.Font.Name;
Size:= WizardForm.PageNameLabel.Font.Size;
end;
Transparent:= True;
Parent:= pnl;
end;
pnl.Repaint;
end;

if CurPageID = wpWelcome then WelcomePage;
if CurPageID = wpSelectDir then SelectDirPage;
if CurPageID = wpReady then ReadyPage;
if CurPageID = wpInstalling then InstallingPage;
if CurPageID = wpFinished then FinishedPage;
end;



detiedyatosla, В то время Лександер уже давно любезно предоставил мануал по совмещению скриптов, т.е я думаю тебе этого бы хватило, чтоб хотя бы чуть чуть разобраться.

detiedyatosla 28-04-2012 21:12 1907491

Devils Night,спс
какраз то что нужно

Johny777 28-04-2012 23:22 1907560

Цитата:

Цитата Devils Night
о ты бы сделал бы себе подобное этому »

есть короче вариант по увеличению размера окна инсталятора и деинсталятора благодаря Лександру


читать дальше »
Код:

[Setup]
AppName=Name
AppVerName=Name
DefaultDirName={pf}\Name

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

[  Code]
procedure InitializeWizard();
var
  L: Integer;
begin
with WizardForm do begin
    L:=ScaleX(100); // На сколько надо увеличить длину инсталла
    ClientWidth := ClientWidth + L;
    OuterNotebook.Width := ClientWidth;
    InnerNotebook.Left := ClientWidth div 2 - InnerNotebook.Width div 2;
    Bevel.Width:= ClientWidth;
    Bevel1.Width:= ClientWidth;
    MainPanel.Width:= ClientWidth;
with WelcomeLabel1 do
    Left:= WelcomeLabel1.Left + L;
with WelcomeLabel2 do
    Left:= WelcomeLabel2.Left + L;
with FinishedLabel do
    Left:= FinishedLabel.Left + L;
with FinishedHeadingLabel do
    Left:= FinishedHeadingLabel.Left + L;
with WizardSmallBitmapImage do
    Left:= WizardSmallBitmapImage.Left + L;
  end;
end;

procedure InitializeUninstallProgressForm;
var
  L: Integer;
begin
with UninstallProgressForm do begin
    L:=ScaleX(50); // На сколько надо увеличить длину инсталла
    ClientWidth := ClientWidth + L;
    OuterNotebook.Width := ClientWidth;
    InnerNotebook.Left := ClientWidth div 2 - InnerNotebook.Width div 2;
    Bevel.Width:= ClientWidth;
    Bevel1.Width:= ClientWidth;
    MainPanel.Width:= ClientWidth;
with WizardSmallBitmapImage do
    Left:= WizardSmallBitmapImage.Left + L;
  end;
end;


.

Lancher 29-04-2012 11:25 1907687

Цитата:

Цитата Дэниэл Вайсс
Приветствую, существует рипаг Duke Nukem Forever (2011) [Action (Shooter) / 3D / 1st Person] Multi 2 / Rus {RePack от R.G.ReCoding​}. В нём есть переработанная страница компонентов. Наведя курсор на любой из компонентов, в правом окне, появляется описание этого компонента. Мне очень нужен такой скрипт установки или код. Заранее благодарен. »

Не очень понятно чего ты хочешь - можешь хотя бы скринов накидать?

Devils Night 29-04-2012 13:16 1907745

Возможно ли сделать так, чтобы в соответствии с выбранным диском менялся и цвет папки, т.е если выбран системный диск, то красная, если логический то синяя?
Вот скрипт.

Johny777 29-04-2012 14:50 1907780

Цитата:

Цитата Devils Night
если выбран системный диск, то красная, если логический то синяя »

вот
вроде работает,
пусть кто-нибудь проверит
*(только я не картинки взял, а панель создал. Её название и цвет меняются)

читать дальше »
Код:

[Setup]
AppName=Drive Checked
AppVerName=Drive Checked
DefaultDirName={pf}\Drive Checked

[  Code]
var
  Panel1: TPanel;

procedure DirEditOnChange(Sender: TObject);
var
  Sys_Drive, Path: string;
begin
  Sys_Drive := Copy('C:\', 0, 1);
  Path := Copy(WizardForm.DirEdit.Text, 2, Length(WizardForm.DirEdit.Text));

  if WizardForm.DirEdit.Text= Sys_Drive + Path
  then
    begin
      Panel1.Color := $6088e0;
      Panel1.Caption := 'Системный диск';
    end
  else
    begin
      Panel1.Color := $f1b53e;
      Panel1.Caption := 'Логичекий диск';
    end;
end;

procedure InitializeWizard;
begin
  Panel1 := TPanel.Create(WizardForm);
  with Panel1 do
  begin
    Name := 'Panel1';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(128);
    Top := ScaleY(120);
    Width := ScaleX(145);
    Height := ScaleY(25);
    Font.Color := clWhite;
    BevelOuter := bvLowered;
    Caption := 'Сиситемный диск';
    Color := $6088e0;
    ParentBackground := False;
  end;

  WizardForm.DirEdit.OnChange := @DirEditOnChange;
end;


напомню касательно цвета http://forum.oszone.net/showpost.php?p=1885463

detiedyatosla 29-04-2012 17:58 1907870

здраствуйте
скиньте плз как убрать разделитель

Devils Night 29-04-2012 18:01 1907876

Цитата:

Цитата detiedyatosla
скиньте плз как убрать разделитель »

Тебе какой, верхний или нижний?
Вот чтоб не гадать, скрыл оба:
читать дальше »
Код:

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

[ Code]
procedure RedesignWizardForm;
begin
  with WizardForm.Bevel do
  begin
    Visible := False;
  end;

  with WizardForm.Bevel1 do
  begin
    Visible := False;
  end;
end;

procedure InitializeWizard();
begin
  RedesignWizardForm;
end;


А вообще, можно всё сделать в Редакторе форм, в сборке от Лександер есть!

Johny777 29-04-2012 21:11 1907978

Скажите пожалуйста как переделать
Цитата:

Цитата El Sanchez
IsStringCyrillic.iss»

Код:

function IsStringCyrillic(Str: String): Boolean;
var
    objRegExp: Variant;
begin
    try
        objRegExp := CreateOleObject('VBScript.RegExp');
    except
        ShowExceptionMessage;
    end;

    if objRegExp.Test(Str) then
    begin
        objRegExp.Pattern := '[\u0400-\u04FF,\u0500-\u052F,\u2DE0-\u2DFF,\uA640-\uA69F]';
        Result := objRegExp.Execute(Str).Count = 1;
    end;
end;

под
Код:


[code]
procedure DirEditOnChange(Sender: TObject);
begin
    WizardForm.NextButton.Enabled := TEdit(Sender).Text <> '123';
end;

procedure InitializeWizard();
begin
    WizardForm.DirEdit.OnChange := @DirEditOnChange;
end;

другие 2 "запрета на русские символы в пути"
1. http://forum.ru-board.com/topic.cgi?...84&limit=1&m=2
2. http://forum.oszone.net/post-1891353-1362.html
через WizardForm.DirEdit.OnChange переделать под блокировку кнопки "далее" не получается :( (включая эту функцию)
Тяму не хватает!
Цель - заблокированная кнопка "Далее" и лейбл с надписью "Кириллица в пути не допустима. Это может привести к ошибкам запуска игры и неправильному отображению элементов интерфейса"
Думаю лейбл и блокировку кнопки я смогу сам потом добавить, а вот функцию...

valyok666 29-04-2012 23:03 1908042

detiedyatosla, я же отвечал на этот вопрос)))
можно короче)
читать дальше »

procedure InitializeWizard();
begin
with WizardForm do begin
Bevel.Hide;
Bevel1.Hide;
end;
end;

alert30 30-04-2012 06:33 1908101

Есть скрипт, в котором в начальном старте процессе установки, сделать окно по-компактнее (сделать мини)?

El Sanchez 30-04-2012 10:50 1908161

Цитата:

Цитата Johny777
Тяму не хватает!
Цель - заблокированная кнопка "Далее" и лейбл с надписью "Кириллица в пути не допустима. Это может привести к ошибкам запуска игры и неправильному отображению элементов интерфейса" »

Johny777, дык, смотри на прототип IsStringCyrillic. На входе строка, на выходе булево значение, другими словами если во входной строке будет хоть один кириллический символ, то функция вернет True. WizardForm.NextButton.Enabled тоже возвращает булев результат, т.е. сделаем, чтобы это свойство зависело от результата IsStringCyrillic.
Код:

procedure DirEditOnChange(Sender: TObject);
begin
    //как только IsStringCyrillic вернет False, т.е. кириллицей и не пахнет, то...
    WizardForm.NextButton.Enabled := not IsStringCyrillic(TEdit(Sender).Text);
    //с надписью "Кириллица в пути не бла-бла-бла" то же самое, только зависимость от Visible
    MyLabel.Visible := IsStringCyrillic(TEdit(Sender).Text); //либо, чтобы IsStringCyrillic не гонять по второму разу MyLabel.Visible := not WizardForm.NextButton.Enabled, т.е. показать надпись, если кнопка неактивна, а это будет происходить, когда найдена кириллица.
end;


Johny777 30-04-2012 12:05 1908205

Цитата:

Цитата El Sanchez
то функция вернет True »

Спасибо! :)
а ведь просто оказывается *(тк я понял)
MyLabel.Visible := IsStringCyrillic(TEdit(Sender).Text);
это в итоге MyLabel.Visible := true;
с кнопкой тоже самое, только enabled
У меня же таким макаром работет список компонентов на странице выбора компонентов

только ещё плюс .Checked:=true/false

alert30,
ты имеешь ввиду страницу установки (wpInstalling) ?
через процедуру CurPageChanged можно все окна сделать разными с
различным расположение кнопок, размерами и действиями на них!
Вот здесь под 43 номером 2 варианта http://innoultra.ru/?page_id=18

alert30 30-04-2012 12:10 1908207

Johny777, как же я сам не догадался, что у сайта Лександер'а полно FAQ-ов. :)

Gnom_aka_Lexander 30-04-2012 20:18 1908429

alert30, Тут в шапке их тоже полно. Я все брал отсюда и с борды. Все, что нужно - это как следует полазить по темам и архиву - все найдешь. На данный момент, по моему, уже нет ни одного вопроса, который уже не решен.

Johny777 02-05-2012 15:11 1909213

Извините, что не по теме спрашиваю!
Посоветуйте пожалуйста
насколько важен халфе 2 и эпизодам в купе с порталом (пираткам) бэкап достижений и сохранений?
( подозреваю не все знают, что статус достижений пишется в файл stats.bin в папке /bin где движок лежит. Сохранения соответственно находятся в папке SAVE )

R.i.m.s.k.y. 02-05-2012 15:17 1909217

Johny777, я тебе из своего опыта скажу: вот сделал я дистр проги нужной сугубо мне и раздал всем по сети для собственного удобства, никто и не заметил, кроме одного прошаренного человека который пришел с разборками "кто стер мои настройки в проге без бекапа?"
Так что если ты думаешь что никто не пользуется достижениями в пиратке ХЛ2, ты ошибаешься
Делай бекап!

А стирать не надо, это общий вопрос и ответ на него один: "не умничай и делай!" :)

Temyraz@fb 02-05-2012 15:43 1909231

всем привет. вот процесс удаления сделал
читать дальше »
Код:

#define MyAppName "Uninstall"


[Setup]
AppId=proto15
SourceDir=.
OutputDir=Setup
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
CreateAppDir=false
OutputBaseFilename={#MyAppName}
Uninstallable=false

ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage




[Languages]
Name: ru; MessagesFile: i18n\Russian.isl,i18n\sc_russian.isl
Name: ua; MessagesFile: i18n\Ukrainian-6-5.1.11.isl,i18n\sc_ukrainian.isl



[Files]
Source: {src}\files\*; DestDir: {code:SrcDir}\files\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: make_copy
Source: {src}\license\*; DestDir: {code:SrcDir}\license\; Flags: ignoreversion recursesubdirs createallsubdirs external; Check: make_copy
Source: dontcopy\check.bat; Flags: dontcopy
Source: dontcopy\checkdb.bat; Flags: dontcopy

[ Code]


////////////////////////////////////////////////////////////////////////
var
    AutoRun: TForm;
    ExitButton, UninstallButton: TButton;
    ResultCode: Integer;
    ISCustomPage1: TWizardPage;
  SuperBackupCheckBox: TNewCheckBox;
  Edit_1: TNewEdit;
  WhereButton: TNewButton;
 PasswordPage: TNewEdit;
  UserVarPass: String;
  filecontent: String;
        ReturnCode: Integer;
//////////////////////////////////////////////////


procedure make_copy_again(Sender: TObject); forward;
procedure ButtonOnClick(Sender: TObject); forward;
/////////////////////////////////////////////////////////////////////
function PUTT(filepath:string):string;
var
S: TArrayOfString;
i : Integer;
begin
if not FileExists(FilePath) then begin MsgBox('Ôàéë íå íàéäåí ' + FilePath, mbError, mb_Ok); Exit;end; // åñëè ôàéëà íåò, âûõîäèì
LoadStringsFromFile(FilePath, S); // çàãðóæàåì ôàéë
result := S[0];
end;

procedure Unstall(Sender: TObject);

begin
  begin
  UserVarPass := PasswordPage.Text;
        ExtractTemporaryFile('check.bat');
  Exec (ExpandConstant ('{tmp}\check.bat'), PasswordPage.Text + ' "' + PUTT(ExpandConstant('{src}\text.txt')) + '"', ExpandConstant ( '{tmp}' ), SW_HIDE, ewWaitUntilTerminated, ReturnCode );
  if ReturnCode = 0 then
                begin
                       
               
                       
                       
                       
                        begin

  begin
    if SuperBackupCheckBox.Checked = true then
      begin

          MsgBox(ExpandConstant('ntcn'), mbError, MB_OK);

      end
  end;


    begin
        MsgBox(ExpandConstant('qqq'), mbError, MB_OK);
                             
                       
                       
                end       
                end
    end
        else
                begin
                        MsgBox(ExpandConstant('{cm:msgIncorrectPassword}'), mbError, MB_OK);

                                  exit;               
                end;
        DeleteFile ( ExpandConstant ('{tmp}\check.bat') );
  end;


  AutoRun.Close;
end;


function make_copy: Boolean;
begin
    Result:=SuperBackupCheckBox.Checked;
end;




procedure make_copy_again (Sender: TObject);
begin
if SuperBackupCheckBox.Checked = false then
  begin
    Edit_1.Enabled:= false;
    Edit_1.visible:= false;
    WhereButton.Enabled:= false;
    WhereButton.visible:= false;
  end
else
  begin
    Edit_1.Enabled:= true;
    Edit_1.visible:= true;
    WhereButton.Enabled:= true;
    WhereButton.visible:= true;
  end;
end;

var
  DataDir: String;

function SrcDir(Param: String): String;
begin
  Result := DataDir;
end;

procedure ButtonOnClick(Sender: TObject);
var
  res: Boolean;
begin
  DataDir := ExpandConstant('{src}');
  res := BrowseForFolder('{cm:ButtonBrowse}', DataDir, True);
  if res then
    begin
      Edit_1.Text := DataDir;
    end;

end;

procedure CreateAutoRun();
begin
    //AutoRun
    AutoRun := TForm.Create(nil);
    with AutoRun do
    begin
        BorderIcons := [];
        Position := poScreenCenter;
        Caption := ExpandConstant('Uninstall');
        ClientWidth := ScaleX(250);
        ClientHeight := ScaleY(250);

    end;
 begin

begin
  PasswordPage := TNewEdit.Create(AutoRun);
  with PasswordPage do
    begin
    Name := 'PasswordPage';
  Parent := AutoRun;

  Left := ScaleX(16);
    Top := ScaleY(24);
    Width := ScaleX(200);
    Height := ScaleY(17);

  end;
    begin
        SuperBackupCheckBox := TNewCheckBox.Create(AutoRun);
  with SuperBackupCheckBox do
  begin
    Name := 'SuperBackupCheckBox';
    Parent := AutoRun;
    Left := ScaleX(16);
    Top := ScaleY(54);
    Width := ScaleX(169);
    Height := ScaleY(17);
    Hint := 'Ñîçäàòü áåêàï';
    Caption := 'Ñîçäàòü áåêàï';
    ShowHint := True;
    OnClick := @make_copy_again;
  end;

  { Edit_1 }
  Edit_1 := TNewEdit.Create(AutoRun);
  with Edit_1 do
  begin
    Name := 'Edit_1';
    Parent := AutoRun;
    Left := ScaleX(16);
    Top := ScaleY(76);
    Width := ScaleX(200);
    Height := ScaleY(21);

    Text := 'C:\';
  end;

  { WhereButton }
  WhereButton := TNewButton.Create(AutoRun);
  with WhereButton do
  begin
    Name := 'WhereButton';
    Parent := AutoRun;
    Left := ScaleX(168);
    Top := ScaleY(110);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := '{cm:ButtonBrowse}';
    OnClick := @ButtonOnClick;
  end;

  SuperBackupCheckBox.TabOrder := 0;
  Edit_1.TabOrder := 1;
  WhereButton.TabOrder := 2;

{ ReservationBegin }


{ ReservationEnd }

end;
Edit_1.visible:=false;
WhereButton.visible:=false;


  AutoRun.Repaint;

  UninstallButton := TButton.Create(AutoRun);
    with UninstallButton do
    begin
        Parent := AutoRun;
        Left := ScaleX(50);
        Top := ScaleY(190);
        Width := ScaleX(70);
        Height := ScaleY(40);
        Cursor := crHand;
        Caption := ExpandConstant('Uninstall');
        OnClick := @Unstall;
    end;

    ExitButton := TButton.Create(AutoRun);
    with ExitButton do
    begin
        Parent := AutoRun;
        Left := ScaleX(150);
        Top := ScaleY(190);
        Width := ScaleX(70);
        Height := ScaleY(40);
        Caption := ExpandConstant('Exit');
        Cursor := crHand;
        ModalResult := mrCancel;
    end;
 end;

  AutoRun.ShowModal;
end;
end;

function InitializeSetup(): Boolean;

begin
  CreateAutoRun();
  Result := False;

 end;



как сделать чтоб в начале был выбор языка? а так же в авторане брались значения перемен(текст.название) из файлов?

Johny777 02-05-2012 16:53 1909264

Цитата:

Цитата Temyraz@fb
OnClick := @make_copy_again; »

это убитый пример!(3-й раз говорю). Вот теперь не поленюсь вернуться на много страниц назад и стереть тот полурабочий пример.
(добавлено позже... Не поленился :). Смёл свой пост!)
Цитата:

Цитата Temyraz@fb
как сделать чтоб в начале был выбор языка? »

читай в справке (секция [Setup]) о:
ShowLanguageDialog=auto/no
LanguageDetectionMethod=uilanguage

Temyraz@fb 02-05-2012 16:57 1909269

ты не правильно понял, в procedure CreateAutoRun(); не вставляется значение которые я указываю из файла, что я не правильно делаю?

ivsatel 02-05-2012 21:04 1909409

Подскажите пожалуйста как скрыть инсталлятор до окончания функции. Хочу добиться следующего:
1) Проверена версия ОС,
2) Если не найдена запись в реестре о наличии "нетфреймворк" начинается закачка,
3) после закачки установка "фреймворка",
4) А после появляется окно инсталлятора.

Код:

[_code]
function InitializeSetup(): Boolean;
var
    NetFrameWorkInstalled : Boolean;
    Result1 : Boolean;
    begin
if ((GetWindowsVersion shr 24) = 5) and (((GetWindowsVersion shr 16) and $FF) = 1) then
begin NetFrameWorkInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\.NETFramework\policy\v2.0');
  if NetFrameWorkInstalled =true then
    begin
      Result := true;
    end;
  if NetFrameWorkInstalled = false then
    begin
      Result1 := MsgBox('Программе требуется наличие в системе .NET Framework. v2.0 Пожалуйста скачайте и установите .NET Framework после этого установка продолжится. Вы хотите скачать .NET Framework?', mbConfirmation, MB_YESNO) = idYes;
  if Result1 =false then
    begin
      Result:=false;
    end
    else
begin
      Result:=false;
      ShellExec('open', 'http://www.microsoft.com/downloads/info.aspx?na=41&SrcFamilyId=0856EACB-4362-4B0D-8EDD-AAB15C5E04F5&SrcDisplayLang=ru&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f5%2f6%2f7%2f567758a3-759e-473e-bf8f-52154438565a%2fdotnetfx.exe','','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
end;
end;
begin
if ((GetWindowsVersion shr 24) = 6) and (((GetWindowsVersion shr 16) and $FF) = 1) then
begin NetFrameWorkInstalled := RegKeyExists(HKLM,'SOFTWARE\Microsoft\.NETFramework\policy\v4.0');
  if NetFrameWorkInstalled =true then
    begin
      Result := true;
    end;
  if NetFrameWorkInstalled = false then
    begin
      Result1 := MsgBox('Программе требуется наличие в системе .NET Framework. v4.0 Пожалуйста скачайте и установите .NET Framework после этого установка продолжится. Вы хотите скачать .NET Framework?',
      mbConfirmation, MB_YESNO) = idYes;
  if Result1 =false then
    begin
      Result:=false;
    end
    else
begin
      Result:=false;
      ShellExec('open', 'http://www.microsoft.com/downloads/info.aspx?na=41&SrcFamilyId=0A391ABD-25C1-4FC0-919F-B21F31AB88B7&SrcDisplayLang=ru&u=http%3a%2f%2fdownload.microsoft.com%2fdownload%2f9%2f5%2fA%2f95A9616B-7A37-4AF6-BC36-D6EA96C8DAAE%2fdotNetFx40_Full_x86_x64.exe','','',SW_SHOWNORMAL,ewNoWait,ErrorCode);
end;
end;
end;
end;
end;
end;
[_/code]


Gnom_aka_Lexander 02-05-2012 21:12 1909416

Цитата:

Цитата ivsatel
function InitializeSetup(): Boolean; »

эта функция отрабатывает до начала работы процедуры InitializeWizard то-есть, Wizardform не будет показан до тех пор, пока работа функции InitializeSetup не закончится. То-есть, я чего хочу сказать - вопрос ни о чем...

ivsatel 02-05-2012 21:18 1909420

Почему то окно инсталлятора появляется во время скачивания фреймворка... Видимо функция завершается после начала скачки фреймворка.

Gnom_aka_Lexander 02-05-2012 21:25 1909424

ewNoWait это флаг говорит, что можно продолжать не ожидая результата. то-есть о чем это говорит - на каждой странице один и тот-же вопрос - ну почему так лениво открыть справку?

ivsatel 02-05-2012 21:40 1909432

Исправил флаги на ewWaitUntilTerminated, но визард все равно маячит(

Gnom_aka_Lexander 02-05-2012 21:43 1909434

ivsatel, есть еще флаг ewnoWait. и с общей логикой разберись, у тебя там по два раза одно и тоже.

ivsatel 02-05-2012 21:48 1909438

Лександер, нет, больше такого флага нет.

Gnom_aka_Lexander 02-05-2012 21:52 1909441

ivsatel, из справки, TExecWait = (ewNoWait, ewWaitUntilTerminated, ewWaitUntilIdle); ошибся чуток, но сути не меняет, в справку ты так и не посмотрел.

ivsatel 02-05-2012 23:16 1909503

Лександер, Спасибо большое! Разобрался чуток) Больше не выскакивает до полной отработки функции.

BlackInferno 03-05-2012 01:13 1909555

Добрый день!
Заранее извините за, наверное, очень частый вопрос (ответа на него я не нашел), но все же:
Как сделать что бы репак включал в себе доп.софт к игре (DirectX, GameSpy Arcade и т.д.) и устанавливался по желанию пользователя (отмечался галочками).
В справке нашел вот это:
Цитата:

1. Нужно определиться, сколько и каких компонентов должно содержаться:

[Components]
Name: main; Description: Программные файлы; Flags: fixed; Types: custom compact full
Name: Component1; Description: Факультатив 1; Flags: checkablealone; Types: full
Name: Component2; Description: Факультатив 2; Flags: checkablealone; Types: full

2. Нужно разложить исходные файлы по каталогам, в каждом из которых ты разместишь файлы того или иного компонента:

C:\temp\MyApp\main
C:\temp\MyApp\comp1
C:\temp\MyApp\comp2

3. Нужно прописать размещение исходных файлов в скрипте, указав для них привязку к тому или иному компоненту:

[Files]
Source: C:\temp\MyApp\main\*; DestDir: {app}; Flags: ignoreversion; Components: main
Source: C:\temp\MyApp\comp1\*; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: C:\temp\MyApp\comp2\*; DestDir: {app}; Flags: ignoreversion; Components: Component2
Из этого скрипта убрал вот это, т.к. у меня нету "фиксированного" софта, только софт "по желанию":
Цитата:

[Components]
Name: main; Description: Программные файлы; Flags: fixed; Types: custom compact full

[Files]
Source: C:\temp\MyApp\main\*; DestDir: {app}; Flags: ignoreversion; Components: main
Сделал все как тут написано, выбор компонентов есть, они устанавливаются в ту директрорию куда надо, т.е. они записываются в директорию с игрой, но не происходит дальнейший запуск этих компонентов (DirectX, GameSpy Arcade) установка. Что делать?

Вот мой скрипт:
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "World Championship Snooker 2003"
#define MyAppVersion "1.0"
#define MyAppPublisher "BlackInferno"
#define MyAppExeName "WCS Real 2003.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={{4642489A-D726-4D4B-AE92-7FDD3B50C666}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
LicenseFile=C:\Documents and Settings\Admin\Рабочий стол\Лицензия 2003.txt
OutputDir=D:\RePack's
OutputBaseFilename=World Championship Snooker 2003
SetupIconFile=C:\Documents and Settings\Admin\Рабочий стол\Значок 2003.ico
Compression=lzma
SolidCompression=yes

[Components]
Name: Component1; Description: DirectX; Flags: checkablealone; Types: full
Name: Component2; Description: GameSpy Arcade; Flags: checkablealone; Types: full

[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:\Program Files\WCS Real 2003\WCS Real 2003.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files\WCS Real 2003\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "D:\Downloads\Программы\DirectX.exe"; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: "D:\Downloads\Программы\GameSpy Arcade.exe"; DestDir: {app}; Flags: ignoreversion; Components: Component2

; 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

Очень расчитываю на помощь.
Заранее спасибо!

Johny777 03-05-2012 01:33 1909563

Цитата:

Цитата BlackInferno
Как сделать что бы репак включал в себе доп.софт к игре »

было 14 страниц назад
http://forum.oszone.net/post-1904226-1618.html
http://forum.oszone.net/post-1904228-1619.html

BlackInferno 03-05-2012 01:50 1909570

Спасибо. Но не понятно.
А можно, если не сложно, растолковать на моем скрипте?

R.i.m.s.k.y. 03-05-2012 08:08 1909615

BlackInferno, использовать секцию [Run]
Код:

[Run]
Filename: {app}\directx.exe; WorkingDir: {app}; Parameters: /Q ; Components: Component1; Flags: waituntilterminated;

Ключи тихого запуска надо смотреть для каждой проги, не у всех он /Q или /silent
Самые распространенные: /q, /Q, /quiet, /silent, /S
Бездумно их подставлять тоже не нужно, прога может ругнуться на незнакомый ключ и закрыться

Моветон класть доп.компоненты в папку программы, лучше их положить в подпапку, к примеру {app}\Redist

BloodDick 03-05-2012 08:58 1909630

Народ, помогите создать установочный файл, чтобы была якобы установка чего либо, а внутри выполнялись совсем другие действия. Допустим надо сделать так - установка идёт, потом резкий звук(Громкий) типо крика через 5 минут крика включается музыка, а после музыки ещё одна песенка, после заверешение последней песенки установка прекращается.

это реально?

R.i.m.s.k.y. 03-05-2012 09:05 1909634

Цитата:

Цитата BloodDick
Народ, помогите создать установочный файл, чтобы была якобы установка чего либо, а внутри выполнялись совсем другие действия. Допустим надо сделать так - установка идёт, потом резкий звук(Громкий) типо крика через 5 минут крика включается музыка, а после музыки ещё одна песенка, после заверешение последней песенки установка прекращается. »

Dick как он есть

BloodDick 03-05-2012 09:06 1909636

Цитата:

Цитата R.i.m.s.k.y.
Dick как он есть »

=)))) Реально помощь нужна.

BlackInferno 03-05-2012 09:19 1909638

R.i.m.s.k.y., большое спасибо! Все получилось, однако есть еще одна маленькая проблемка:
Как вы и сказали доп.софт (DirectX, GameSpy Arcade) я положил в папку "Redist" с игрой. Сделал репак, но после установки экзешники этого доп.софта дублируются еще раз в корневой папке с игрой. Что надо изменить в скрипте, что бы это избежать?
Вот скрипт:
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

#define MyAppName "World Championship Snooker 2003"
#define MyAppVersion "1.0"
#define MyAppPublisher "BlackInferno"
#define MyAppExeName "WCS Real 2003.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={{4642489A-D726-4D4B-AE92-7FDD3B50C666}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
;AppVerName={#MyAppName} {#MyAppVersion}
AppPublisher={#MyAppPublisher}
DefaultDirName={pf}\{#MyAppName}
DefaultGroupName={#MyAppName}
AllowNoIcons=yes
LicenseFile=C:\Documents and Settings\Admin\Рабочий стол\Лицензия 2003.txt
OutputDir=D:\RePack's
OutputBaseFilename=World Championship Snooker 2003
SetupIconFile=C:\Documents and Settings\Admin\Рабочий стол\Значок 2003.ico
Compression=lzma
SolidCompression=yes

[Components]
Name: Component1; Description: DirectX; Flags: checkablealone; Types: full
Name: Component2; Description: GameSpy Arcade; Flags: checkablealone; Types: full
                                             
[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:\Program Files\WCS Real 2003\WCS Real 2003.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "C:\Program Files\WCS Real 2003\*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs
Source: "C:\Program Files\WCS Real 2003\Redist\DirectX.exe"; DestDir: {app}; Flags: ignoreversion; Components: Component1
Source: "C:\Program Files\WCS Real 2003\Redist\GameSpy Arcade.exe"; DestDir: {app}; Flags: ignoreversion; Components: Component2
; 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
Filename: {app}\Redist\DirectX.exe; WorkingDir: {app}; Parameters: /Q ; Components: Component1; Flags: waituntilterminated
Filename: {app}\Redist\GameSpy Arcade.exe; WorkingDir: {app}; Parameters: /Q ; Components: Component2; Flags: waituntilterminated


R.i.m.s.k.y. 03-05-2012 09:30 1909644

BlackInferno, внимательно смотри на 3 и 4 строчку раздела [Files] параметр DestDir

Кстати а чегой-то у тебя нету секции реестра? потом ни патч не накатишь ничего официального не поставишь

И не забывай жмякать "Полезное сообщение" ;)

BloodDick 03-05-2012 09:39 1909646

Ответите мб?)

R.i.m.s.k.y. 03-05-2012 09:40 1909647

BlackInferno,
Source: "C:\Program Files\WCS Real 2003\Redist\DirectX.exe"; DestDir: {app}\Redist ; Flags: ignoreversion; Components: Component1
Source: "C:\Program Files\WCS Real 2003\Redist\GameSpy Arcade.exe"; DestDir: {app}\Redist ; Flags: ignoreversion; Components: Component2
Ну и конечно эти экзешники должны лежать в WCS Real 2003\Redist и не больжно быть в WCS Real 2003

В текущей реализации в этих двух строчках нет смысла, сначала вы копируете всё что есть независимо от выбора компонентов, а потом еще раз при выбранном компоненте
Надо вынести WCS Real 2003\Redist\* в другую папку

Кстати когда компонентов станет больше трех придет запоздалое понимание того что называть их Component1/2 было плохой идеей ;)
Можно любое слово, даже неприличное

BloodDick 03-05-2012 09:43 1909650

Цитата:

Цитата R.i.m.s.k.y.
R.i.m.s.k.y. »

Можешь пожалуйста по подробней расписать?)

BlackInferno 03-05-2012 09:45 1909651

Цитата:

Цитата R.i.m.s.k.y.
внимательно смотри на 3 и 4 строчку раздела [Files] параметр DestDir »

Как я понял параметр DestDir обязательный и идет с константой "{app}", по этому выкинуть я его не могу. Может после "{app}" дописать папку?
Что-то вроде этого:
Код:

DestDir: {app}\Redist;
Или может значние изментить в параметре Flags?
Цитата:

Цитата R.i.m.s.k.y.
Кстати а чегой-то у тебя нету секции реестра? потом ни патч не накатишь ничего официального не поставишь »

Игра просто колоссально допотопная там даже банального руссификатора не предвидится)
Цитата:

Цитата R.i.m.s.k.y.
И не забывай жмякать "Полезное сообщение" »

Ой, да, просто не знаком со структурой форума. Жмякнул)

R.i.m.s.k.y. 03-05-2012 09:47 1909652

BlackInferno, а куда подробнее
Твой скрипт самый простой, именно на таких и приходит понимание чего там внутри крутится
Слово Component1 замени на DirectXSetup, Component2 на GameSpySetup
Инсталлер работает по секциям сверху вниз, порядок выполнения секций ищи в справке по слову installation order
Так же искать в справке значения констант, {app} это папка в которую будет установлена прога, можно выкинуть и все будет поставлено в место где лежит дистр
Во флагах ничего менять не нужно, ignoreversion значит что все файлы в будут в {app} перезатерты без проверки (если есть)

Правильно держать Source папки не в одной как у тебя в \WCS Real 2003, а разделять их: одна папка именно для проги, вторая для компонентов, третья для рисунков инсталлера
Причем все эти папки не должны быть вложенными
Еще правильнее вообще для каждой задачи и компонента по независимой подпапке, так ничего не перепутается

BloodDick 03-05-2012 09:50 1909653

Спасибо)

R.i.m.s.k.y. 03-05-2012 10:18 1909663

BloodDick, а блин промахнулся, оба-два на Bl
не тебе не хелпну ибо а) это заподло и б) я не умею делать музыку и рисунки в Инно, видишь последнюю строчку в подписи? вотт

BloodDick 03-05-2012 10:20 1909667

=((((((((((((((((((

Народ помогитееее))))))

BlackInferno 03-05-2012 10:35 1909672

R.i.m.s.k.y., огромнейшее спасибо, человечеще! Все работает как надо!
Так на будущее, опиши как надо "правильно" вносить данные в реестр.
Вот нашел такую инфу, может дополнишь чем-нибудь, только попонятнее напиши)))
Цитата:

нажмите Win+R (или пуск->выполнить) - В строке пишите "regеdit" нажимаешь "Enter"
Таким образом мы попадаем в редактор реестра Windows... В реестре все значения и данные хранятся в виде ключей разных типов.
Откройте ветку HKEY_LOCAL_MACHINE -> SOFTWARE и найдите там свою игру которую вы установили.
Нашли? - подсвечиваем мышку к этой папке и нажимаем правую кнопку мыши (т.е. контекстное меню) -> "Экспортировать"
Дальше сохраняете этот файл (.reg - ключик реестра windows) для удобности себе на "Рабочий стол".
Потом создаёте инсталятор через Inno Setup.
Потом уж сохраняете этот скрипт.
Дальше зайдите в ISTool откройте в нём тот скрипт который сохранили.
Дальше с левой стороны выбираете секцию "Реестр" И справа от этих "секций" у тебя будет поле в клеточку. Вот на этом поле нажмите на правую кнопку мыши и выберите "Импортировать из файла"
Выберите тот файл "реестра" который вы сохранили.
Дальше выбирайте секцию "Скрипт"
Опускайтесь в самый низ и там будет вкладка "[Registry]"
В этой вкладке синим шрифтом написано "ValueData": и вот то-что после этой "ValueData" написано, сотрите.
И вставьте вот это:
Код:

{app}; Flags: uninsdeletekey
Дальше сохраняйте скрипт. Потом заходите опять в Inno Setup. Откройте этот скрипт и запустите чтобы он делал инсталятор.
Может что еще посоветуешь? Я просто ранее сталкивался с такой проблемой: после выполнения всего вышеперечисленного я открывал скрипт, что бы запустить его на создание репака, но выбивало ошибку, что мол есть синтаксичеческая ошибка. Типо кавычек создавалось дофига...

R.i.m.s.k.y. 03-05-2012 10:46 1909675

BlackInferno, советую использовать регшот, он дает готовый файл для имортирования его в скрипт, только потом надо поудалять лишний шум и поменять папки на переменные {app}

BloodDick 03-05-2012 10:48 1909676

на чём такое хоть сделать можно?))

R.i.m.s.k.y. 03-05-2012 10:56 1909677

BloodDick, на ассемблере точно

BlackInferno 03-05-2012 11:01 1909680

R.i.m.s.k.y., все-таки решил и в реестр внести информацию пусть будет репак грамотным.
Вот у меня образовался такой вот скрипт:
Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: ; ValueData:
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: Servername; ValueData: PC
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: Version; ValueData: 10.8
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: CD_KEY; ValueData: CD_KEY
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: InstallDir; ValueData: C:\Program Files\WCS Real 2003\
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: string; ValueName: ; ValueData:
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REQH; ValueData: e0 01 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REQW; ValueData: 80 02 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REQBPP; ValueData: 20 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SFX; ValueData: 01 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: MUSIC; ValueData: 01 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: TRIPLE; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: TEXEL; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: WINDOW; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SFOFF; ValueData: 01 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SAVELIST; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: INDEX; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: CHECKSUM; ValueData: e3 70 1a 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REFL; ValueData: 02 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: AAOFF; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: LOD; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REFRESHRATE; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SWVP; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SHADOWS; ValueData: 01 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: CROWD; ValueData: 01 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: EXTRAANIMS; ValueData: 02 00 00 00

Мне после всех "ValueData" нужно стирать и дописывать "{app}; Flags: uninsdeletekey"???

R.i.m.s.k.y. 03-05-2012 11:06 1909683

BlackInferno, нед
заменить C:\Program Files\WCS Real 2003\ на {app}, угадай зачем
Флаг uninsdeletekey, но пользуйся им осторожно, прочитай почему

BlackInferno 03-05-2012 11:16 1909688

Цитата:

Цитата R.i.m.s.k.y.
заменить C:\Program Files\WCS Real 2003\ на {app}, угадай зачем »

Ну это для того, если пользователь будет устанавливать прогу в место отличное от моего места, вроде так...
Цитата:

Цитата R.i.m.s.k.y.
Флаг uninsdeletekey, но пользуйся им осторожно, прочитай почему »

Да, прочитал, можно случайно удалить и виндосовские фалы.


Вообщем у меня скрипт секции реестра получился вот таким:
Код:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: ; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: Servername; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: Version; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: CD_KEY; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: InstallDir; ValueData: {app}
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: string; ValueName: ; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REQH; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REQW; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REQBPP; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SFX; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: MUSIC; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: TRIPLE; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: TEXEL; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: WINDOW; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SFOFF; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SAVELIST; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: INDEX; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: CHECKSUM; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REFL; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: AAOFF; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: LOD; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REFRESHRATE; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SWVP; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SHADOWS; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: CROWD; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: EXTRAANIMS; ValueData: {app}; Flags: uninsdeletekey

У меня при компиляции вышеуказанного срипта ошибка:

Как ее исправить?

R.i.m.s.k.y. 03-05-2012 11:20 1909690

BlackInferno, как говорил Весемир: "Бенджи тежко"
1. Ты зачем все поменял на {app}?
1.1. нет, {app} это папка установки, если у тебя в Files все кидается в {app} то и в реестре соответсвенно надо прописывать {app}
2. реестр и файл разные вещи, если с собачьим проблемы в шапке русская справка, флаги для секции [Files] не подходят для [Registry]
3. Ошибка потому что поменял бинарные значения на строковые. Я ж сказал только одно значение поменять, и на твой вопрос "менять ли все?" ответил "нет"

BlackInferno 03-05-2012 11:29 1909695

Понятно. Вроде сейчас компиляция иден нормально.
Код вот такой, заменил в нем только то, что ты и сказал "заменить C:\Program Files\WCS Real 2003\ на {app}".
Вот что получилось:
Цитата:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: ; ValueData:
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: Servername; ValueData: PC
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: Version; ValueData: 10.8
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: CD_KEY; ValueData: CD_KEY
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: InstallDir; ValueData: {app}
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: string; ValueName: ; ValueData:
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REQH; ValueData: e0 01 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REQW; ValueData: 80 02 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REQBPP; ValueData: 20 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SFX; ValueData: 01 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: MUSIC; ValueData: 01 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: TRIPLE; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: TEXEL; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: WINDOW; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SFOFF; ValueData: 01 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SAVELIST; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: INDEX; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: CHECKSUM; ValueData: e3 70 1a 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REFL; ValueData: 02 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: AAOFF; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: LOD; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: REFRESHRATE; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SWVP; ValueData: 00 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: SHADOWS; ValueData: 01 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: CROWD; ValueData: 01 00 00 00
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003\STARTUP; ValueType: binary; ValueName: EXTRAANIMS; ValueData: 02 00 00 00
А как мне тогда написать, что бы все реестровые данные после удаления программы тоже удалялись? Тут же полюбому нужен "Flags: uninsdeletekey". Куда его тогда ставить? На каждую строчку?

R.i.m.s.k.y. 03-05-2012 11:31 1909696

Цитата:

Цитата BlackInferno
Тут же полюбому нужен "Flags: uninsdeletekey". Куда его тогда ставить? На каждую строчку? »

Можно на одну корневую ветку, т.е к первой строчке прилепить флаг uninsdeletekey
Про осторожность выше ты угадал причину - чтобы не смахнуть вендовые ветки

Temyraz@fb 03-05-2012 11:38 1909700

ребята подскажите мне, как сделать следующее

при удалении запускается приложение

читать дальше »
Код:

[UninstallRun]
FileName: "{app}\Uninstalls.exe"



как сделать так что если в том приложении нажали на отмена, тут тоже отменилась удаление?

nik1967 03-05-2012 11:39 1909701

BlackInferno, R.i.m.s.k.y., ну и зачем городить такой огород? Запихивать в инсталлятор дистрибутив, распаковывать его в папку установки и только потом, оттуда, запускать? Не проще ли (да и быстрее по времени) расположить папку с дистрибутивом рядом с Setup.exe и запускать оттуда, не копируя файлы в {app}? Тогда и в директории установки не будут создаваться файлы дистрибутива. И ещё, обычно дополнительный софт располагают не на странице выбора компонентов, а на странице дополнительных задач.
Небольшой пример:
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application
SolidCompression=yes
Compression=lzma/ultra
ShowTasksTreeLines=true

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

[Tasks]
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\directx; Description: Обновить Microsoft DirectX;

[Run]
Filename: {src}\Redist\DirectX\DXSETUP.exe; WorkingDir: {src}\Redist\DirectX\; Parameters: /silent; StatusMsg: Идет обновление DirectX...  Пожалуйста, подождите.; Tasks: Redist\directx; Flags: skipifdoesntexist waituntilterminated


Папку Redist с вложенной в неё папкой DirectX располагаешь рядом с Setup.exe в папке Output по умолчанию. Ну и соответственно потом на диске установки (если будет создаваться) должна находиться папка Redist.

BlackInferno 03-05-2012 11:41 1909702

Цитата:

Цитата R.i.m.s.k.y.
Можно на одну корневую ветку, т.е к первой строчке прилепить флаг uninsdeletekey »

Ага, значит выглядеть должно так:
Цитата:

[Registry]
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: ; ValueData: ; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: Servername; ValueData: PC
Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; ValueName: Version; ValueData: 10.8
..........
..........
..........
Цитата:

Цитата R.i.m.s.k.y.
Про осторожность выше ты угадал причину - чтобы не смахнуть вендовые ветки »

А если я выдирал из реестра только игровую папку, т.е. взял папку из HKEY_LOCAL_MACHINE -> SOFTWARE -> World Championship Snooker 2003 могут ли как-то туда попасть случайно виндовые ветки реестра?

R.i.m.s.k.y. 03-05-2012 11:42 1909703

nik1967, некоторые уникумы удаляют лишнее лежащее в {src}, так что внутри инсталлера дирекс не помешает

BlackInferno, выдитрать правильно надо через регшот:
1. запустить регшот и сделать первый снимок
2. запустить оригинальный дистр игры и ничего параллельно не делать
3. сделать второй снимок
4. поудалять лишнее и импортировать в скрипт

Но если ты точно знаешь ключ реестра можно и так

HKLM\SOFTWARE\Codemasters это не вендовый ключ

Да, должно выглядеть так

BlackInferno 03-05-2012 11:50 1909709

Ясно.
А "Flags: uninsdeletekey" ставить только на первую строку? Потом, при удалении, точно удалится вся информация по игре из реестра?

nik1967 03-05-2012 11:51 1909710

R.i.m.s.k.y., ну да, ну да, если доп.софт весит более 100 мб., то утяжелять инсталлятор как то не кошерно. Но это, как говориться, моё ИМХО (да и не только моё).

Johny777 03-05-2012 11:56 1909711

R.i.m.s.k.y.,
на тему "во время установки" пример South
читать дальше »
Код:

[Setup]
AppName=MyProg
AppVerName=MyProg
DefaultDirName={pf}\MyProg
DefaultGroupName=MyProg
 
[Files]
Source: 1.dll; DestDir: {app}; AfterInstall: Patch()
Source: 2.dll; DestDir: {app}; AfterInstall: Patch()
 
[Code_]
procedure Patch;
var
  ResultCode: Integer;
begin
  case ExtractFileName(ExpandConstant(CurrentFileName)) of
    '1.dll': begin
              if Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
                MsgBox('Hello.', mbInformation, MB_OK);
              if ResultCode=0 then WizardForm.CancelButton.OnClick(nil);
            end;
    '2.dll': if Exec(ExpandConstant('{win}\notepad.exe'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then
              MsgBox('Hello 2.', mbInformation, MB_OK);
  end;
end;
 
procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm:=False;
end;


может кому пригодится :)

Цитата:

Цитата R.i.m.s.k.y.
некоторые уникумы удаляют лишнее лежащее в {src} »

Забей! "Против лома нет приёма!"

R.i.m.s.k.y. 03-05-2012 12:00 1909715

BlackInferno, точно-точно удалится, это же корневой ключ (сколько раз я уже написал это слово :) )
ну если хочешь чтобы наверняка все удалилось сделай Format d: :)

BlackInferno 03-05-2012 12:05 1909717

R.i.m.s.k.y., ну вот, пожалуй это все... большое спасибо за помошь!

R.i.m.s.k.y. 03-05-2012 12:07 1909719

BlackInferno, большое пожалуйста за вопросы!
Ты кричи если что :)

Johny777, а что это на тему "во время установки" пример South ?

nik1967 03-05-2012 12:13 1909722

BlackInferno, советую присмотреться к моему посту. По правилам хорошего тона дополнительный софт обычно располагают отдельно от инсталлятора (в репаках). Поверь моему опыту :) .

R.i.m.s.k.y. 03-05-2012 12:15 1909724

nik1967, очень умно давать цынк на ресур требующий регистрацию
Там написано что репаки надо делать с регшотом и без наворотов чтобы поставилось безо всяких "out of bounds?

Devils Night 03-05-2012 12:24 1909728

Цитата:

Цитата BlackInferno
Flags: uninsdeletekey »

Это значение называется: Удалить ключ при деинсталляции! В общем юзай ISTool, там всё вроде понятно, да и ты не только реестр и компоненты можешь, добавлять, редактировать, удалять, но и многое другое. Сам часто пользуюсь ISTool в подобных ситуациях, потому всего не упомнишь.

Ещё например в
Код:

Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; Flags: uninsdeletekey
можешь добавить Components: a, он позволит заносить ветку в реестр только в том случае если компонент выбран, т.е получится
Код:

Root: HKLM; SubKey: SOFTWARE\Codemasters\World Championship Snooker 2003; ValueType: string; Flags: uninsdeletekey; Components: a
Цитата:

Цитата nik1967
И ещё, обычно дополнительный софт располагают не на странице выбора компонентов, а на странице дополнительных задач. »

Всё верно, так и делают.

R.i.m.s.k.y. 03-05-2012 12:29 1909735

Devils Night BlackInferno, ISToolом хорошо править массово флаги, ну и для простеньки скриптов, как только лезешь в секцию кода сразу приходится переключаться на расширенный компилятор

nik1967 03-05-2012 12:30 1909738

Цитата:

Цитата R.i.m.s.k.y.
очень умно давать цынк на ресур требующий регистрацию »

Извиняюсь, дал ссылку на свой профиль в Р.Г. Каталист, не подумав, что для просмотра нужна регистрация.
Цитата:

Цитата R.i.m.s.k.y.
безо всяких "out of bounds? »

Это легко решаемо с помощью флага Flags: skipifdoesntexist.
А впрочем, я никому ничего не навязываю. Пусть будет, так, как будет. Пардон за :off:

BlackInferno 03-05-2012 12:35 1909742

Цитата:

Цитата Devils Night
И ещё, обычно дополнительный софт располагают не на странице выбора компонентов, а на странице дополнительных задач. »

А как указать это? Я так понимаю, что все что в [Components] нужно вырезать и вставить в [Tasks], а в секциях [Files] и [Run] оставить все без изменений?

Johny777 03-05-2012 12:39 1909744

R.i.m.s.k.y.,
Да там пацан спрашивал как во время установки музыку проиграть, потом закрыть инсталл. Я к тому что можно без ассемблера во время установки без всяких таймеров и считываний позиций прогресбара выполнять определённые действия. А способ при извлечении такого-то файла и действий после этого даёт доступ к определённым возможностям.

R.i.m.s.k.y. 03-05-2012 12:40 1909745

BlackInferno, в секция [Files] и [Run] тоже Components поменять на Tasks

Devils Night 03-05-2012 12:42 1909749

Цитата:

Цитата R.i.m.s.k.y.
ISToolом хорошо править массово флаги, ну и для простеньки скриптов»

Ну для новичка тоже, самое оно, так отредактировать по мелочи.

Цитата:

Цитата R.i.m.s.k.y.
как только лезешь в секцию кода сразу приходится переключаться на расширенный компилятор »

Я и не спорю.

Кстати, о коде, можно ли привязать к какому либо отдельному куску кода компонент например Components: a?

И ещё, возможно ли в секции [Setup], привязать к некоторым строкам Components: a, а точнее вот это:
Код:

[Setup]
Uninstallable=false
CreateUninstallRegKey=false
UpdateUninstallLogAppName=false

?

nik1967 03-05-2012 12:48 1909753

Цитата:

Цитата Devils Night
Кстати, о коде, можно ли привязать к какому либо отдельному куску кода компонент например Components: a? »

Из справки
Pascal Scripting: IsComponentSelected
Прототип:
function IsComponentSelected(const Components: String): Boolean;

Описание:
Возвращает True, если заданный компонент выделен. Несколько компонентов могут быть указаны в том же порядке с помощью параметра секции Components.

Например:
begin
if IsComponentSelected('helpfiles') then
// the 'helpfiles' component is selected
end;

Johny777 03-05-2012 12:49 1909756

Цитата:

Цитата Devils Night
привязать к какому либо отдельному куску кода компонент »

пример (при переходе на страницу wpReady цвет WizardForm становится чёрным)


читать дальше »
Код:

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


[Components]
Name: a; Description: a
Name: b; Description: b

[ code]
procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpReady then
  begin
    if IsComponentSelected('a') then
      WizardForm.Color:=clBlack;
  end;
end;


.

BlackInferno 03-05-2012 12:50 1909758

Цитата:

Цитата R.i.m.s.k.y.
в секция [Files] и [Run] тоже Components поменять на Tasks »

Ага спасибо, и вроде как Types: full тоже убрать надо, вроде как секция [Tasks] не читает этот тег.

Johny777 03-05-2012 12:54 1909762

BlackInferno,
Настоятельно советую прочитать русскую справку http://sendfile.su/570136 (все секции!)

BlackInferno 03-05-2012 13:07 1909768

Цитата:

Цитата Johny777
Настоятельно советую прочитать русскую справку http://sendfile.su/570136 (все секции!) »

Так я и прочитал. Вот и говорю, что сеция [Tasks] не держит теги Types.

Вообщем все получилось, но
И вот еще вопрос:
Как сделать так, чтобы на странице "Дополнительных задач" была написана дополнительная строчка: "Установка дополнительного ПО:", а потом уже шли мои компоненты? Точно так же как "Дополнительные значки:" и два флажка - у меня чуть ниже "Дополнительное ПО:" и два флажка.
А то как-то не очень красиво получается:

R.i.m.s.k.y. 03-05-2012 13:12 1909773

BlackInferno, да, таск на этот флаг должен ругнуться
давай свой код

Devils Night, nik1967, цимес в секции [Setup], это основная секция установщика для создания инсталлера, так что Components к ней применить нельзя

BlackInferno 03-05-2012 13:14 1909778

Вот в дополнение к моему предыдущему посту.
Хочу что бы было вот так:

Как это прописать?

nik1967 03-05-2012 13:16 1909779

Цитата:

Цитата R.i.m.s.k.y.
Devils Night, nik1967, цимес в секции [Setup], это основная секция установщика для создания инсталлера, так что Components к ней применить нельзя »

А при чём тут я? Я и так это знаю уже очень давно.

Johny777 03-05-2012 13:16 1909780

BlackInferno,
Справка --- Секция скриптов --- секция [Tasks] --- GroupDescription
Цитата:

Цитата BlackInferno
Так я и прочитал. »

:(
Цитата:

Цитата nik1967
А при чём тут я? »

Ты просто оказался не в том месте не в то время. Вот и загребли! :)

Devils Night 03-05-2012 13:38 1909799

Цитата:

Цитата BlackInferno
Как это прописать? »

Вот через ISTool сделал

Код:

[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
UninstallDisplayIcon={app}\MyProg.exe
OutputDir=.


[Tasks]
Name: a; Description: Компонент 1; GroupDescription: Описание группы
Name: b; Description: Компонент 2; GroupDescription: Описание группы


Name: c; Description: Компонент 1; GroupDescription: Описание группы 2
Name: d; Description: Компонент 2; GroupDescription: Описание группы 2



P.S Я жеж не зря за него заикнулся, а теперь 100 вопросов получайте!

nik1967, Johny777, Спасибо! По коду всё сложно, короче ладу не дам, хотел компонент прикрутить к #define, т.е
Код:

#define code; Components: a

#ifdef code
#endif

, в общем по видимому никак проще нельзя :(.

BlackInferno 03-05-2012 13:39 1909801

nik1967, вылазит галочка перед ПО:

Как ее убрать?
Вот скрипт:
Код:

[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
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Component1; Description: DirectX; Flags: checkablealone
Name: Component2; Description: GameSpy Arcade; Flags: checkablealone



Цитата:

Цитата nik1967
[Setup]
ShowTasksTreeLines=true »

А что это дает? Разницы не заметил.

R.i.m.s.k.y. 03-05-2012 13:41 1909803

BlackInferno,
у тебя же перед носом ответ в двух строчках выше
Код:

[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
Name: Component1; Description: DirectX; Flags: checkablealone; GroupDescription: Дополнительное программное обеспечение
Name: Component2; Description: GameSpy Arcade; Flags: checkablealone; GroupDescription: Дополнительное программное обеспечение


BlackInferno 03-05-2012 13:50 1909815

Попробую так:
Код:

[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
Name: Component1; Description: DirectX; GroupDescription: Дополнительное программное обеспечение:; Flags: checkablealone
Name: Component2; Description: GameSpy Arcade; GroupDescription: Дополнительное программное обеспечение:; Flags: checkablealone


Devils Night 03-05-2012 13:54 1909817

Цитата:

Цитата BlackInferno
А что это дает? Разницы не заметил. »

ShowTasksTreeLines - Это Показать линии дерева задач.

R.i.m.s.k.y. 03-05-2012 13:56 1909819

Цитата:

Цитата BlackInferno
ShowTasksTreeLines=true »
А что это дает? Разницы не заметил. »

тонкие линии на странице задач
видна при наличии дочерних и родительстких компонентов, у тебя их нет и линии тоже нет

checkablealone позволяет выбирать дочерний флажок без выбора родительского, справка рулит

BlackInferno 03-05-2012 14:05 1909821

Все, супер, наконец-то все отлично!
Всем спасибо за помощь!

Johny777 03-05-2012 18:36 1909983

Вопрос
у меня на странице 6 чекбоксов
как блокировать кнопку "далее" если ни один не отмечен?
WizardForm.SelectDirPage.OnChange разве есть?

R.i.m.s.k.y. 03-05-2012 18:41 1909985

Johny777, через NextButtonClick не пройдет?
Код:

function NextButtonClick(CurPageID:integer): Boolean;
begin
  Result:= True;
  if (CurPageID = твоя тсраница) then begin
      if (проверка чекбоксов) then  Result := False;
      end     
      else Result := True;
    end; //if (CurPageID = твоя тсраница)
end;

или делаешь чекалку кликов свой страницы и добавляешь в ней
WizardForm.NextButton.Enabled:= False else WizardForm.NextButton.Enabled:= True;
вот к примеру у меня на списке компонентов:
Код:

procedure ComponentOnClick(Sender: TObject);
begin
  if CheckComponents = '' then WizardForm.NextButton.Enabled:= False else WizardForm.NextButton.Enabled:= True;
  WizardForm.ComponentsList.Repaint;
end;

procedure InitializeWizard();
...
WizardForm.ComponentsList.OnClick := @ComponentOnClick;


Johny777 03-05-2012 20:14 1910023

R.i.m.s.k.y.,
сделал так
Код:

procedure Enable(Sender: TObject);
begin
  WizardForm.NextButton.Enabled := hl2_A_CheckBox.Checked or ep1_A_CheckBox.Checked or ep2_A_CheckBox.Checked or portal_A_CheckBox.Checked or hl2_SAVE_CheckBox.Checked or ep1_SAVE_CheckBox.Checked or ep2_SAVE_CheckBox.Checked or portal_SAVE_CheckBox.Checked;
end;

а каждому из 6 чекбоксов приписал OnClick :=@Enable;
Тк например ep2_SAVE_CheckBox.Checked всё равно что True, как и все остальные

кнопка далее упорно не хотела блокироваться в InitializeWizard, зато так работает:
Код:

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpSelectDir then
  begin
    WizardForm.NextButton.Enabled := false;
  end;
end;

хотя все страницы выключены(какие были - "приветствия" и "готовности"). То бишь это (wpSelectDir) первая страница.

R.i.m.s.k.y. 03-05-2012 20:16 1910025

Johny777, у тебя самолепные чекбоксы? я про них не знай, звиняй

Johny777 04-05-2012 04:05 1910244

Подскажите пожалуйста
после копирования идёт сжатие в самоизвлекающийся 7Zip.exe
читать дальше »
Код:

#define MyAppName "Backup"
#define Save_Folder "saved"


[Setup]
SourceDir=.
OutputDir=Source Engine 15\uninstall
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
DefaultDirName=C:\{#Save_Folder}
OutputBaseFilename={#MyAppName}
Uninstallable=false
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
DisableWelcomePage=yes
DisableReadyPage=yes


[Files]
Source: {src}\..\common\half-life 2\bin\stats.bin; DestDir: {app}\common\half-life 2\bin; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\half-life 2 episode one\bin\stats.bin; DestDir: {app}\common\half-life 2 episode one\bin; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\half-life 2 episode two\bin\stats.bin; DestDir: {app}\common\half-life 2 episode two\bin; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\portal\bin\stats.bin; DestDir: {app}\common\portal\bin; Flags: external ignoreversion recursesubdirs createallsubdirs;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Source: {src}\..\common\half-life 2\hl2\SAVE\*; DestDir: {app}\common\half-life 2\hl2\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\half-life 2 episode one\episodic\SAVE\*; DestDir: {app}\common\half-life 2 episode one\episodic\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\half-life 2 episode two\ep2\SAVE\*; DestDir: {app}\common\half-life 2 episode two\ep2\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\portal\portal\SAVE\*; DestDir: {app}\common\portal\portal\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs;


Source: 7za.exe; DestDir: {tmp}; Flags: dontcopy;
Source: 7z.sfx; DestDir: {tmp}; Flags: dontcopy;


[  Code]
procedure InitializeWizard;
begin
  with WizardForm do
  begin
    MainPanel.Visible := false;
    Bevel1.Visible := false;
    Bevel.Visible := false;
    InnerNotebook.Width := WizardForm.Width;
    InnerNotebook.Height := WizardForm.Height;
    OuterNotebook.Width := WizardForm.Width;
    OuterNotebook.Height := WizardForm.Height;
    CancelButton.BringToFront;
    NextButton.BringToFront;
    BackButton.BringToFront;
    SelectDirBitmapImage.Visible := False;
    DiskSpaceLabel.Visible := False;
    SelectDirBrowseLabel.Visible := False;
    Caption := '';
    SelectDirLabel.Visible := false;
    DirEdit.Top := ScaleY(220);
    DirBrowseButton.Top := WizardForm.DirEdit.Top;
  end;
  ExtractTemporaryFile('7za.exe');
  ExtractTemporaryFile('7z.sfx');
end;


function CreateBatFile(): boolean;
var
  StrArr: TArrayOfString;
begin
    Result := false;                               

    SetArrayLength(StrArr, 3);
   
    StrArr[0]:='7za a -sfx7z.sfx C:\saved.exe -mx9 C:\saved';
    StrArr[1]:='@echo off';
    StrArr[2]:='pause';

    if SaveStringsToFile(ExpandConstant('{tmp}\compressor.bat'), StrArr, False) then Result:=true;;
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: Integer;
 
begin
  if CurStep = ssPostInstall then
    begin
      // создаем BAT файл
      if not CreateBatFile() then MsgBox('BAT файл не записан', mbInformation, mb_OK)
      // запускаем BAT файл
      if not Exec(ExpandConstant('{tmp}\compressor.bat'), '', '', SW_SHOW, ewWaitUntilTerminated, ResultCode) then MsgBox('Проблема с запуском BAT файла', mbInformation, mb_OK)
    end;
end;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;


столкнулся с проблемой добавления текста из WizardForm.DirEdit (констант)
Т.е. батник должен паковать файлы из папки {app} в архив saved.exe
Это всё (код сверху, вложенный архив снизу) работает, но стоит мне начать добавлять '7za a -sfx7z.sfx'+ExpandConstant('{app}')+ '-mx9 C:\saved', то результат - ошибка параметров при запуске батника! :)
http://sendfile.su/585755 - архив со всем необходим
В общем дальше не знаю!
Есть у кого мысли?

Возможность паковать в sfx архив нужна в бэкапе для того чтобы в основном инсталле (посредством чекбокса например) восстановить все сохранения и достижения! :)

R.i.m.s.k.y. 04-05-2012 08:06 1910261

Johny777, не качая архив вижу что в '7za a -sfx7z.sfx' нет концевых пробелов, т.е. у тебя получается в батнике 7za a -sfx7z.sfxС:\Program Files\Proga
Но даже если добавишь пробелы '_7za a -sfx7z.sfx_' все равно будет ошибка - батник длинные пути с пробелами не понимает, если есть русские буквы в пути батник должен быть CP866, а инно пишет CP1251. Так что с русскими буквами даже не пытайся, переводи все в секцию кода
В общем вотттаг ' 7za a -sfx7z.sfx '+AddQuotes(ExpandConstant('{app}')) сделай, будет ошибка - покажешь ошибку
И в конце батника добавь pause чтобы видеть что он пишет

Кстати никогда не понимал батников в инно, нем же есть секция кода!

Johny777 04-05-2012 12:37 1910368

отказался от батника!
вот
перенёс
так работает :)
читать дальше »
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;

begin
  if CurStep = ssPostInstall then
    begin
      ExtractTemporaryFile('7za.exe');
      ExtractTemporaryFile('7z.sfx');
      Exec(ExpandConstant('{tmp}\7za.exe'), 'a -sfx7z.sfx -mx9 C:\saved.exe C:\saved', ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
    end;
end;


так нет :(
читать дальше »
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s1, s2, s3, s4, s5: string;
 
begin
  if CurStep = ssPostInstall then
    begin
    s1 := 'a -sfx7z.sfx -mx9';
    s2 := ExpandConstant('{userdesktop}\saved.exe');
    s3 := ExpandConstant('{app}');

   
      ExtractTemporaryFile('7za.exe');
      ExtractTemporaryFile('7z.sfx');
      Exec(ExpandConstant('{tmp}\7za.exe'), 's1 + s2 + s3', ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
    end;
end;


может с пробелами накосячил?

R.i.m.s.k.y. 04-05-2012 12:43 1910377

Johny777, ты вообще неправильно делаешь
1. Зачем ты переменные взял в кавыки? архиватору ты вместо путей передаешь переменные
2. пробелы
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s1, s2, s3, s4, s5: string;
 
begin
  if CurStep = ssPostInstall then
    begin
    s1 := 'a -sfx7z.sfx -mx9';
    s2 := Addquotes(ExpandConstant('{userdesktop}\saved.exe'));
    s3 := Addquotes(ExpandConstant('{app}'));

   
      ExtractTemporaryFile('7za.exe');
      ExtractTemporaryFile('7z.sfx');
      Exec(ExpandConstant('{tmp}\7za.exe'), s1 + ' ' + s2 + ' ' + s3, ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
    end;
end;


Johny777 04-05-2012 12:47 1910385

R.i.m.s.k.y.,
извиняюсь
не подумал
за основу взял "создание ярлыка"
читать дальше »
Код:

if CurStep = ssPostInstall then
begin
  s2_hl2:= hl2_Launch_Edit.Text;
  s1_hl2:= ExpandConstant('-steam -game hl2 -appid 220');
  begin
  if hl2_icon_Checkbox.Checked then
    CreateShellLink(ExpandConstant('{userdesktop}\Half-Life 2.lnk'), '',
    ExpandConstant('{app}\common\half-life 2\hl2.exe'),s1_hl2 + s2_hl2, ExpandConstant('{app}\common\half-life 2'), ExpandConstant('{app}\common\half-life 2\hl2.ico'), 0, SW_SHOWNORMAL);
  end;


Теперь всё супер! Буду знать
Касательно сжатия
Стоит ли предоставлять пользовател возможность выбирать уровень сжатия
на данный момент стоит -m9, при котором 60мб ужались до 600кб
у меня 4 гига оперативы. У кого-то может быть меньше и этот параметр не будет работать.
Как лучше?
Может сделать среднее сжатие и не мучиться?

R.i.m.s.k.y. 04-05-2012 13:15 1910407

Johny777, мне тут подсказали недавно хороший принцип KISS :)
делай простейшее сжатие, это быстро, рамы мало занимает, инсталлер не примерзает

Johny777 04-05-2012 16:42 1910535

R.i.m.s.k.y.,
а как прицепить название архива "saved.exe"?
(что то у меня с грамматикой совсем не лады)
так не получается (закомментировано)
без s4 сохраняет куда надо, но без названия. Например в диск C - .exe, а на рабочий стол - Desktop.exe :(
читать дальше »
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s1, s2, s3, s4, s5: string;

begin
  if CurStep = ssPostInstall then
    begin
    if Zip_CheckBox.Checked = true then
    begin
    s1 := 'a -sfx7z.sfx -mx9';
    s2 := Addquotes(Zip_Path_Edit.Text);
    s3 := Addquotes(ExpandConstant('{tmp}\{#Save_Folder}'));
   
    //s4 := 'saved';
    //s4 := AddBackslash('saved');
    //s4 := AddBackslash('saved.exe');


      ExtractTemporaryFile('7za.exe');
      ExtractTemporaryFile('7z.sfx');
      Exec(ExpandConstant('{tmp}\7za.exe'), s1 + ' ' + s2 + s4 + ' ' + s3, ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
    end;
    end;
end;


вот полный код (пришлось создать 2 эдита, тк 7Zip не умеет удалять после архивации сжимаемые файлы)
читать дальше »
Код:

#define MyAppName "Backup"
#define Save_Folder "saved"


[Setup]
SourceDir=.
OutputDir=Source Engine 15\uninstall
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
DefaultDirName={userdesktop}\{#Save_Folder}
OutputBaseFilename={#MyAppName}
Uninstallable=false
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage
DisableWelcomePage=yes
DisableReadyPage=yes


[Files]
Source: {src}\..\common\half-life 2\bin\stats.bin; DestDir: {app}\common\half-life 2\bin; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\half-life 2 episode one\bin\stats.bin; DestDir: {app}\common\half-life 2 episode one\bin; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\half-life 2 episode two\bin\stats.bin; DestDir: {app}\common\half-life 2 episode two\bin; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\portal\bin\stats.bin; DestDir: {app}\common\portal\bin; Flags: external ignoreversion recursesubdirs createallsubdirs;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Source: {src}\..\common\half-life 2\hl2\SAVE\*; DestDir: {app}\common\half-life 2\hl2\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\half-life 2 episode one\episodic\SAVE\*; DestDir: {app}\common\half-life 2 episode one\episodic\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\half-life 2 episode two\ep2\SAVE\*; DestDir: {app}\common\half-life 2 episode two\ep2\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs;
Source: {src}\..\common\portal\portal\SAVE\*; DestDir: {app}\common\portal\portal\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs;


Source: 7za.exe; DestDir: {tmp}; Flags: dontcopy;
Source: 7z.sfx; DestDir: {tmp}; Flags: dontcopy;


[  Code]
var
  Zip_CheckBox: TNewCheckBox;
  Zip_Path_Edit: TNewEdit;
  Zip_Path_Button: TNewButton;


function Make_Zip: Boolean;
  begin
    Result:=Zip_CheckBox.Checked;
    end;

procedure Hide(Sender: TObject);
begin
  if Zip_CheckBox.Checked = true then
    begin
      WizardForm.DirEdit.Enabled := not(Zip_CheckBox.Checked);
      WizardForm.DirBrowseButton.Enabled := not(Zip_CheckBox.Checked);
      WizardForm.DirEdit.Text := ExpandConstant('{tmp}\{#Save_Folder}');
 
      Zip_Path_Edit.Enabled := Zip_CheckBox.Checked;
      Zip_Path_Button.Enabled := Zip_CheckBox.Checked;
      Zip_Path_Edit.Text := ExpandConstant('{userdesktop}');
    end
  else
    begin
      WizardForm.DirEdit.Enabled := True;
      WizardForm.DirBrowseButton.Enabled := True;
      WizardForm.DirEdit.Text := ExpandConstant('{userdesktop}\{#Save_Folder}');

      Zip_Path_Edit.Enabled := false;
      Zip_Path_Button.Enabled := false;
      Zip_Path_Edit.Text := 'путь архива';
    end;
end;

procedure DirOnClick(Sender: TObject);
var
  DirEditString: String;
begin
  DirEditString := WizardForm.DirEdit.Text;
  if BrowseForFolder('Выберите папку из списка и нажмите «ОК»', DirEditString, True) then
    begin
      Zip_Path_Edit.Text := DirEditString;
      // WizardForm.NextButton.OnClick(WizardForm.NextButton)
    end;
end;

procedure InitializeWizard;
begin

  with WizardForm do
  begin
    MainPanel.Visible := false;
    Bevel1.Visible := false;
    Bevel.Visible := false;
    InnerNotebook.Width := WizardForm.Width;
    InnerNotebook.Height := WizardForm.Height;
    OuterNotebook.Width := WizardForm.Width;
    OuterNotebook.Height := WizardForm.Height;
    CancelButton.BringToFront;
    NextButton.BringToFront;
    BackButton.BringToFront;
    SelectDirBitmapImage.Visible := False;
    DiskSpaceLabel.Visible := False;
    SelectDirBrowseLabel.Visible := False;
    Caption := '';
    SelectDirLabel.Visible := false;
    DirEdit.Top := ScaleY(220);
    DirBrowseButton.Top := WizardForm.DirEdit.Top;
  end;

  { Zip_CheckBox }
  Zip_CheckBox := TNewCheckBox.Create(WizardForm);
  with Zip_CheckBox do
  begin
    Name := 'Zip_CheckBox';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(120);
    Top := ScaleY(112);
    Width := ScaleX(97);
    Height := ScaleY(17);
    Caption := 'сделать архив';
    OnClick := @Hide;
  end;

  { Zip_Path_Edit }
  Zip_Path_Edit := TNewEdit.Create(WizardForm);
  with Zip_Path_Edit do
  begin
    Name := 'Zip_Path_Edit';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(8);
    Top := ScaleY(152);
    Width := ScaleX(297);
    Height := ScaleY(21);
    Enabled := False;
    Text := 'путь архива';
  end;

  { Zip_Path_Button }
  Zip_Path_Button := TNewButton.Create(WizardForm);
  with Zip_Path_Button do
  begin
    Name := 'Zip_Path_Button';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(312);
    Top := ScaleY(152);
    Width := ScaleX(75);
    Height := ScaleY(25);
    Caption := 'обзор';
    Enabled := False;
    OnClick := @DirOnClick;
  end;

end;


procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s1, s2, s3, s4, s5: string;

begin
  if CurStep = ssPostInstall then
    begin
    if Zip_CheckBox.Checked = true then
    begin
    s1 := 'a -sfx7z.sfx -mx9';
    s2 := Addquotes(Zip_Path_Edit.Text);
    s3 := Addquotes(ExpandConstant('{tmp}\{#Save_Folder}'));


      ExtractTemporaryFile('7za.exe');
      ExtractTemporaryFile('7z.sfx');
      Exec(ExpandConstant('{tmp}\7za.exe'), s1 + ' ' + s2 + ' ' + s3, ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
    end;
    end;
end;




procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;



последняя версия
http://sendfile.su/586087

R.i.m.s.k.y. 04-05-2012 16:53 1910538

Johny777, вот ты чудак-человек, тёдиты умеешь страяпать а грамматику не знаешь :tongue:
я строго наоборот
1. у меня тут инно не стоит я не знаю как работает AddBackslash, в начало она добавлет \ или в конец
1.1 есть обратная функция, по памяти RemoveBackSlashUntilRoot, в справке глянь точно
2. предположу простое
Exec(ExpandConstant('{tmp}\7za.exe'), s1 + ' ' + s2 ' ' + s3 + +' saved.exe', ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
3. Не знаю что у тебя там в переменных но учти что кавычки AddQuotes нужны на полный путь вместе с именем файла, в середине строки их быть не должно
7z.exe "это запаковать" "вот сюда" параметры
4. мх9 это макс сжатие, долго, рамы жрет 1700метров (если склероз не изменяет), ставь mx1

Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s1, s2, s3, s4, s5: string;

begin
  if CurStep = ssPostInstall then
    begin
    if Zip_CheckBox.Checked = true then
    begin
    s1 := 'a -sfx7z.sfx -mx9';
    s2 := Addquotes(RemoveBackSlashUntilRoot(Zip_Path_Edit.Text)+'\saved.exe');
    s3 := Addquotes(ExpandConstant('{tmp}\{#Save_Folder}'));
   
    //s4 := 'saved';
    //s4 := AddBackslash('saved');
    //s4 := AddBackslash('saved.exe');


      ExtractTemporaryFile('7za.exe');
      ExtractTemporaryFile('7z.sfx');
      Exec(ExpandConstant('{tmp}\7za.exe'), s1 + ' ' + s2 + ' ' + s3, ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
    end;
    end;
end;


Johny777 04-05-2012 17:23 1910558

Цитата:

Цитата R.i.m.s.k.y.
7z.exe "это запаковать" "вот сюда" параметры »

изначально так
7za a -sfx7z.sfx C:\saved.exe -mx9 C:\saved
расширю строку:
7za a -sfx7z.sfx -mx9.......C:\saved.exe.............C:\saved
........параметры...............куда\во что...............откуда (файлы,папки)
в инно
Exec(ExpandConstant('{tmp}\7za.exe'), s1 + ' ' + s2 + ' ' + s3, ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
расширю для чтения:
Exec(ExpandConstant('{tmp}\7za.exe'),......s1.............................................s2........ .......................................................s3.................................ExpandCons tant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
.......................................запустить.......параметры...........текст другого эдита(куда архив).................{tmp}\saved (отсюда файлы)......
те логика такая
если отмечен чекбоск "создать архив", то родной Dir.Edit блокируется и всё папки/фалы бэкапа из секции [Files] копируются в папку {tmp}\saved
получаем
s3 := Addquotes(ExpandConstant('{tmp}\saved')) ......... (откуда)
s2 := Addquotes(Zip_Path_Edit.Text); ......(куда). Например на рабочий стол (уже архив.exe)
s1 := 'a -sfx7z.sfx -mx9';.............(параметры) Не меняется


Трогать s3 нельзя. Файлам прямая дорога только в папку темпа, которая после успешной установки удалится.
s1 - параметры
Т.е. всё крутится вокруг s2, который может быть любым путём + название архива
на данный момент только это получается (пример из строки в начале)
вместо
C:\saved.exe --получаем-- C:\.exe
те вместо saved.exe --получаем-- .exe

так тоже не получается
s2 := Addquotes(RemoveBackslashUnlessRoot(Zip_Path_Edit.Text)+'saved.exe';
и так
s2 := Addquotes(RemoveBackslashUnlessRoot(Zip_Path_Edit.Text)+'\saved.exe';
проблема с \во что
Цитата:

Цитата R.i.m.s.k.y.
RemoveBackSlashUntilRoot »

да опечатался малость :)
вот
RemoveBackslashUnlessRoot
Цитата:

Цитата R.i.m.s.k.y.
ставь mx1 »

ok
( в планах есть комбобокс с выботом "среднее(), лёгкое(mx1), сильное (много меньше mx9)" )

R.i.m.s.k.y. 04-05-2012 18:16 1910597

Johny777, не получается? добавь в конец MSGBOX (твоя проблемная строка)
вслепую сложно догадываться, надо хрустальный шар полировать

Johny777 04-05-2012 18:32 1910607

R.i.m.s.k.y.,
истина где-то рядом
вот почти заработало
при
s2 := Addquotes(RemoveBackslashUnlessRoot(Zip_Path_Edit.Text)+'\saved.exe');
в пути где в конце нет обратного слэша \ всё в порядке
C:\test
в пути, где в конце он есть
C:\
архив не создаётся
Насчёт месседжбокса даже не знаю куда его прикрутить
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
очень интересные результаты сжатия

думаю оставлю выбор на mx3 и mx5, ведь лишних 200 метров оперативки найдёт каждый!

R.i.m.s.k.y. 04-05-2012 19:05 1910627

Johny777, MsgBox('тут кроется лажа' + #13#10 + ExpandConstant('{tmp}\7za.exe'), s1 + ' ' + s2 + ' ' + s3, mbInformation, MB_OK);
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s1, s2, s3, s4, s5: string;

begin
  if CurStep = ssPostInstall then
    begin
    if Zip_CheckBox.Checked = true then
    begin
    s1 := 'a -sfx7z.sfx -mx9';
    s2 := Addquotes(RemoveBackSlashUntilRoot(Zip_Path_Edit.Text)+'\saved.exe');
    s3 := Addquotes(ExpandConstant('{tmp}\{#Save_Folder}'));
    MsgBox('тут кроется лажа' + #13#10 + ExpandConstant('{tmp}\7za.exe'), s1 + ' ' + s2 + ' ' + s3, mbInformation, MB_OK);
 
    //s4 := 'saved';
    //s4 := AddBackslash('saved');
    //s4 := AddBackslash('saved.exe');


      ExtractTemporaryFile('7za.exe');
      ExtractTemporaryFile('7z.sfx');
      Exec(ExpandConstant('{tmp}\7za.exe'), s1 + ' ' + s2 + ' ' + s3, ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
    end;
    end;
end;


Johny777 04-05-2012 20:01 1910654

R.i.m.s.k.y.,
сделал (месседж бокс, упростил и изменил немного логику)
и без меммедж бокса понятно в чём проблема
Вот две строки. При той что не закоментирована всё отлично

if not (FileCopy(ExpandConstant('{tmp}\saved.exe'), ExpandConstant('{userdesktop}\saved.exe'), True)) then
//if not (FileCopy(ExpandConstant('{tmp}\saved.exe'), 'C:\saved.exe', True)) then
MsgBox('Обломись!', mbInformation, MB_OK);

целиком
читать дальше »
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s3, s2: string;

begin
  if CurStep = ssPostInstall then
    begin
      if Zip_CheckBox.Checked = true then
        begin
          s2 := Addquotes(ExpandConstant('{tmp}\saved.exe'));
          s3 := Addquotes(ExpandConstant('{tmp}\{#Save_Folder}'));

          ExtractTemporaryFile('7za.exe');
          ExtractTemporaryFile('7z.sfx');

          Exec(ExpandConstant('{tmp}\7za.exe'), 'a -sfx7z.sfx -mx3' + ' ' + s2 + ' ' + s3, ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
          if not (FileCopy(ExpandConstant('{tmp}\saved.exe'), ExpandConstant('{userdesktop}\saved.exe'), True)) then
        //if not (FileCopy(ExpandConstant('{tmp}\saved.exe'), 'C:\saved.exe', True)) then
          MsgBox('Обломись!', mbInformation, MB_OK);
        end;
    end;
end;



при той что закоментирована появляется сообщение
бред какой-то

http://sendfile.su/586233

R.i.m.s.k.y. 04-05-2012 20:16 1910661

Johny777, балин, камрад, я дал тебе готовую строчку чтобы увидеть что ты там склеиваешь, нафига мне твое обломись?

Johny777 05-05-2012 02:14 1910800

R.i.m.s.k.y.,
Ты "секретные материалы" (Малдеры, Скали всякие) смотрел?
вот две строки
if not (FileCopy(ExpandConstant('{tmp}\saved.exe'), ExpandConstant('{userdesktop}\saved.exe'), True)) then
//if not (FileCopy(ExpandConstant('{tmp}\saved.exe'),'C:\saved.exe', True)) then
при первой архив копируется на рабочий стол, а при второй в C:\ нет (констант нет. Прямой путь)
Как это понимать?
Самое натуральная аномалия. Скрипт живёт своей жизнью! :)


Касательно твоего месседж бокса.Хотел с ним потестить. С ошибкой синтаксиса вылетает (исправить не смог).
Пока что тупик как не крути.

R.i.m.s.k.y. 05-05-2012 09:28 1910863

Johny777,
тебя ничего не смущает?

Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s1, s2, s3, s4, s5: string;

begin
  if CurStep = ssPostInstall then
    begin
    if Zip_CheckBox.Checked = true then
    begin

    s2 := Addquotes(Zip_Path_Edit.Text);
    //s2 := Addquotes(ExpandConstant('{tmp}\saved.exe'));
    s3 := Addquotes(ExpandConstant('{tmp}\{#Save_Folder}'));
    MsgBox('Пути архивации' + #13#10 + 'a -sfx7z.sfx -mx3' + ' ' + s2 + ' ' + s3, mbInformation, MB_OK);
   
        //s3 := Addquotes(RemoveBackslashUnlessRoot(ExpandConstant('{tmp}\{#Save_Folder}')))+'saved.exe';
      ExtractTemporaryFile('7za.exe');
      ExtractTemporaryFile('7z.sfx');
      Exec(ExpandConstant('{tmp}\7za.exe'), 'a -sfx7z.sfx -mx3' + ' ' + s2 + ' ' + s3, ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
      if not (FileCopy(ExpandConstant('{tmp}\saved.exe'), ExpandConstant('{userdesktop}\saved.exe'), True)) then
      //if not (FileCopy(ExpandConstant('{tmp}\saved.exe'), 'C:\saved.exe', True)) then
      MsgBox('тут кроется лажа, тк не копируется', mbInformation, MB_OK);
    end;
    end;
end;

второе: для копирования лучше использовать не встроенные функции инно а комстроку
Код:

procedure copy1file(fromfile, tofile:string);
begin
  Exec('cmd.exe', ' /c copy /Y /V /B ' + AddQuotes(fromfile) + ' ' + AddQuotes(tofile),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

Вот сейчас твой архив saved.exe скопировался на рабочий стол но инсталлер написал что нет

Johny777 05-05-2012 12:57 1910937

R.i.m.s.k.y.,
спасибо за помощь добрый человек!

всё работает:
читать дальше »
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s1, s2, s3, s4, s5: string;

begin
  if CurStep = ssPostInstall then
    begin
      if Zip_CheckBox.Checked = true then
        begin
          s2 := Addquotes(ExpandConstant('{tmp}\saved'));  /// вот здесь и была лажа,
          s3 := Addquotes(ExpandConstant('{tmp}\{#Save_Folder}'));
          MsgBox('Пути архивации' + #13#10 + 'a -sfx7z.sfx -mx3' + ' ' + s2 + ' ' + s3, mbInformation, MB_OK);
         
          ExtractTemporaryFile('7za.exe');
          ExtractTemporaryFile('7z.sfx');
          Exec(ExpandConstant('{tmp}\7za.exe'), 'a -sfx7z.sfx -mx3' + ' ' + s2 + ' ' + s3, ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);

          Exec('cmd.exe', ' /c copy /Y /V /B ' + AddQuotes(ExpandConstant('{tmp}\saved.exe')) + ' ' + Addquotes(Zip_Path_Edit.Text),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
        end;
    end;
end;



сохраняет куда надо и как надо

R.i.m.s.k.y. 05-05-2012 13:07 1910945

Цитата:

Цитата Johny777
спасибо за помощь добрый человек!
сохраняет куда надо и как надо »

пжлста
Выпей за мое богатство! :)

El Sanchez 05-05-2012 13:11 1910948

Цитата:

Цитата R.i.m.s.k.y.
тебя ничего не смущает? »

R.i.m.s.k.y., а тебя не смущает, что после AddQuotes переменные s2, s3 должны быть уже закавыченными, а MsgBox говорит обратное? У части пользователей ОС >= Vista и у всех пользователей ОС <= XP вызов 7za.exe приведет к ошибке из-за незакавыченных путей. Нужно отказаться от корявой AddQuotes и писать все ручками, и второе - незачем архив сохранять в темпе, а потом героически копировать в другое место (Рабочий стол), создавай сразу там.

Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s3, s2: string;

begin
  if CurStep = ssPostInstall then
    begin
      if Zip_CheckBox.Checked then
        begin
          s2 := ExpandConstant('{userdesktop}\saved.exe'); //разумеется, сюда можно включать необходимые кавычки и отделяющие пробелы
          s3 := ExpandConstant('{tmp}\{#Save_Folder}'); //... и сюда, но напишем их в Exec

          ExtractTemporaryFile('7za.exe');
          ExtractTemporaryFile('7z.sfx');

          Exec(ExpandConstant('{tmp}\7za.exe'), 'a -sfx7z.sfx -mx3 "' + s2 + '" "' + s3 + '"', ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
        end;
    end;
end


R.i.m.s.k.y. 05-05-2012 13:16 1910950

El Sanchez Johny777, смутило но я подумал что это особенность msgbox
Спасибо что сказал, переделаю и у себя (хотя никто не жалился еще)
Проще сделать AddQuotes2, а то об эти кавыки в Ехес глаза пообломаешь
Код:

function AddQuotes2(www : string) : string;
begin
Result := '"' + www + '"';
end;


procedure CurStepChanged(CurStep: TSetupStep);
var
  Res: Integer;
  s3, s2: string;

begin
  if CurStep = ssPostInstall then
    begin
      if Zip_CheckBox.Checked then
        begin
          s2 := ExpandConstant('{userdesktop}\saved.exe'); //разумеется, сюда можно включать необходимые кавычки и отделяющие пробелы
          s3 := ExpandConstant('{tmp}\{#Save_Folder}'); //... и сюда, но напишем их в Exec

          ExtractTemporaryFile('7za.exe');
          ExtractTemporaryFile('7z.sfx');

          Exec(ExpandConstant('{tmp}\7za.exe'), 'a -sfx7z.sfx -mx3' + ' ' + AddQuotes2(s2) + ' ' + AddQuotes2(s3), ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
        end;
    end;
end


El Sanchez 05-05-2012 13:28 1910957

Цитата:

Цитата R.i.m.s.k.y.
я подумал что это особенность msgbox »

Нет, скорей уж это особенность AddQuotes, принимающей строку от ExpandConstant.
Цитата:

Цитата R.i.m.s.k.y.
Проще сделать AddQuotes2 »

Чего уж проще, захламить код ненужными функциями :)

R.i.m.s.k.y. 05-05-2012 13:38 1910963

Цитата:

Цитата El Sanchez
Чего уж проще, захламить код ненужными функциями »

намного проще снизить читабельность кода ;)

Johny777 05-05-2012 16:33 1911053

Цитата:

Цитата R.i.m.s.k.y.
пжлста
Выпей за мое богатство! »

нажрусь до поросячьего визга по возможности и тебя вспомню добрым словом, но не сейчас! :)
El Sanchez,
спасибо, что пришёл и поправил!
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
у меня вопрос
с архивацией всё отлично
Вот код на сами сохранения (поиск по расширению в отдельных папках и сравнения размеров файлов - всё работает), но меня смущает, то что без этого инсталл не запускается
Код:

function InitializeSetup(): Boolean;
begin
 Result:=True; /// вот этого
end;

Также если рядом есть файлы которые он ищет, то окно появляется тут же, а если нет, то с тормозами через пару секунд
Скажите пожалуйста где я опять накосячил при укорачивании и адаптации под свои нужды "поиск по расширению" их шапки?
читать дальше »
Код:

#define MyAppName "Backup"
#define Save_Folder "saved"

[Setup]
SourceDir=.
OutputDir=Source Engine 15\uninstall
AppName={#MyAppName}
AppVerName={#MyAppName}
AppVersion={#MyAppName}
//CreateAppDir=false
DefaultDirName={userdesktop}\{#Save_Folder}
OutputBaseFilename={#MyAppName}
Uninstallable=false
ShowLanguageDialog=auto
LanguageDetectionMethod=uilanguage

DisableWelcomePage=yes
DisableReadyPage=yes


[Files]
Source: {src}\..\common\half-life 2\bin\stats.bin; DestDir: {app}\common\half-life 2\bin; Flags: external ignoreversion recursesubdirs createallsubdirs; Check: save_A_hl2
Source: {src}\..\common\half-life 2 episode one\bin\stats.bin; DestDir: {app}\common\half-life 2 episode one\bin; Flags: external ignoreversion recursesubdirs createallsubdirs; Check: save_A_ep1
Source: {src}\..\common\half-life 2 episode two\bin\stats.bin; DestDir: {app}\common\half-life 2 episode two\bin; Flags: external ignoreversion recursesubdirs createallsubdirs; Check: save_A_ep2
Source: {src}\..\common\portal\bin\stats.bin; DestDir: {app}\common\portal\bin; Flags: external ignoreversion recursesubdirs createallsubdirs; Check: save_A_portal
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Source: {src}\..\common\half-life 2\hl2\SAVE\*; DestDir: {app}\common\half-life 2\hl2\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs; Check: save_SAVES_hl2
Source: {src}\..\common\half-life 2 episode one\episodic\SAVE\*; DestDir: {app}\common\half-life 2 episode one\episodic\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs; Check: save_SAVES_ep1
Source: {src}\..\common\half-life 2 episode two\ep2\SAVE\*; DestDir: {app}\common\half-life 2 episode two\ep2\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs; Check: save_SAVES_ep2
Source: {src}\..\common\portal\portal\SAVE\*; DestDir: {app}\common\portal\portal\SAVE; Flags: external ignoreversion recursesubdirs createallsubdirs; Check: save_SAVES_portal


[  Code]
/////////////////////////////////////////
var
  hl2_A_CheckBox: TNewCheckBox;
  ep1_A_CheckBox: TNewCheckBox;
  ep2_A_CheckBox: TNewCheckBox;
  portal_A_CheckBox: TNewCheckBox;
 
  hl2_SAVE_CheckBox: TNewCheckBox;
  ep1_SAVE_CheckBox: TNewCheckBox;
  ep2_SAVE_CheckBox: TNewCheckBox;
  portal_SAVE_CheckBox: TNewCheckBox;
/////////////////////////////////////////
function save_A_hl2: Boolean;
  begin
    Result:=hl2_A_CheckBox.Checked;
    end;
   
function save_A_ep1: Boolean;
  begin
    Result:=ep1_A_CheckBox.Checked;
    end;
   
function save_A_ep2: Boolean;
  begin
    Result:=ep2_A_CheckBox.Checked;
    end;
   
function save_A_portal: Boolean;
  begin
    Result:=portal_A_CheckBox.Checked;
    end;
///////////////////////////////////////
function save_SAVES_hl2: Boolean;
  begin
    Result:=hl2_SAVE_CheckBox.Checked;
    end;
   
function save_SAVES_ep1: Boolean;
  begin
    Result:=ep1_SAVE_CheckBox.Checked;
    end;
   
function save_SAVES_ep2: Boolean;
  begin
    Result:=ep2_SAVE_CheckBox.Checked;
    end;
   
function save_SAVES_portal: Boolean;
  begin
    Result:=portal_SAVE_CheckBox.Checked;
    end;

 
////////////////////////// поиск фала по маске  //// начало
var
  // задаём переменную глобально, для всего скрипта
  Mask: string;


function FindFile(Path: string): Boolean;
var
  FSR: TFindRec;
  FindResult: Boolean;

begin
  Result:= False;
  if Path[Length(Path)] <> '\' then Path:= Path + '\';
  FindResult:= FindFirst(Path + Mask, FSR);
  try
    while FindResult do
      begin
        if FSR.Attributes and FILE_ATTRIBUTE_DIRECTORY = 0 then
          begin
            Result:= True;
            Exit;
          end;
        FindResult:= FindNext(FSR);
      end;
  finally
    FindClose(FSR);
  end;
end;

function InitializeSetup(): Boolean;
begin
 Result:=True;
end;
/////////  конец


procedure Enable(Sender: TObject);
begin
  WizardForm.NextButton.Enabled := hl2_A_CheckBox.Checked or ep1_A_CheckBox.Checked or ep2_A_CheckBox.Checked or portal_A_CheckBox.Checked or hl2_SAVE_CheckBox.Checked or ep1_SAVE_CheckBox.Checked or ep2_SAVE_CheckBox.Checked or portal_SAVE_CheckBox.Checked;
end;



procedure InitializeWizard;
var
  Size: Integer;
  i: Integer;
  ArrayOfMask: TArrayOfString;
  StartFolder, StartFolder2, StartFolder3, StartFolder4: string;
 
begin
  with WizardForm do
  begin
    MainPanel.Visible := false;
    Bevel1.Visible := false;
    Bevel.Visible := false;
    InnerNotebook.Width := WizardForm.Width;
    InnerNotebook.Height := WizardForm.Height;
    OuterNotebook.Width := WizardForm.Width;
    OuterNotebook.Height := WizardForm.Height;
    CancelButton.BringToFront;
    NextButton.BringToFront;
    BackButton.BringToFront;
    SelectDirBitmapImage.Visible := False;
    DiskSpaceLabel.Visible := False;
    SelectDirBrowseLabel.Visible := False;
    Caption := '';
    SelectDirLabel.Visible := false;
    DirEdit.Top := ScaleY(220);
    DirBrowseButton.Top := WizardForm.DirEdit.Top;
  end;
  //////////////////////////////////////////////////  чекбоксы достижений
  hl2_A_CheckBox := TNewCheckBox.Create(WizardForm);
    with hl2_A_CheckBox do
      begin
        Name := 'hl2_A_CheckBox';
        Parent := WizardForm.SelectDirPage;
        Left := ScaleX(150);
        Top := ScaleY(132);
        Width := ScaleX(97);
        Height := ScaleY(17);
        Caption := 'достижения hl2';
        Enabled := False;
        OnClick :=@Enable;
      end;
        if FileSize(ExpandConstant('{src}\..\common\half-life 2\bin\stats.bin'), size) then
          if Size > 1078 then
            hl2_A_Checkbox.Enabled:=true;

  ep1_A_CheckBox := TNewCheckBox.Create(WizardForm);
    with ep1_A_CheckBox do
      begin
        Name := 'ep1_A_CheckBox';
        Parent := WizardForm.SelectDirPage;
        Left := ScaleX(150);
        Top := ScaleY(70);
        Width := ScaleX(97);
        Height := ScaleY(17);
        Caption := 'достижения ep1';
        Enabled := False;
        OnClick :=@Enable;
      end;
        if FileSize(ExpandConstant('{src}\..\common\half-life 2 episode one\bin\stats.bin'), size) then
          if Size > 517 then
            ep1_A_CheckBox.Enabled:=true;
           
  ep2_A_CheckBox := TNewCheckBox.Create(WizardForm);
    with ep2_A_CheckBox do
      begin
        Name := 'ep2_A_CheckBox';
        Parent := WizardForm.SelectDirPage;
        Left := ScaleX(150);
        Top := ScaleY(40);
        Width := ScaleX(97);
        Height := ScaleY(17);
        Caption := 'достижения ep2';
        Enabled := False;
        OnClick :=@Enable;
      end;
        if FileSize(ExpandConstant('{src}\..\common\half-life 2 episode two\bin\stats.bin'), size) then
          if Size > 759 then
            ep2_A_CheckBox.Enabled:=true;
           
  portal_A_CheckBox := TNewCheckBox.Create(WizardForm);
    with portal_A_CheckBox do
      begin
        Name := 'portal_A_CheckBox';
        Parent := WizardForm.SelectDirPage;
        Left := ScaleX(150);
        Top := ScaleY(10);
        Width := ScaleX(97);
        Height := ScaleY(17);
        Caption := 'достижения portal';
        Enabled := False;
        OnClick :=@Enable;
      end;
        if FileSize(ExpandConstant('{src}\..\common\portal\bin\stats.bin'), size) then
          if Size > 550 then
            portal_A_CheckBox.Enabled:=true;
  ////////////////////////////////////////////////////  чекбоксы сохранений
  hl2_SAVE_CheckBox := TNewCheckBox.Create(WizardForm);
    with hl2_SAVE_CheckBox do
      begin
        Name := 'hl2_SAVE_CheckBox';
        Parent := WizardForm.SelectDirPage;
        Left := ScaleX(8);
        Top := ScaleY(132);
        Width := ScaleX(97);
        Height := ScaleY(17);
        Caption := 'сохранения hl2';
        Enabled := False;
        OnClick :=@Enable;
      end;
  ep1_SAVE_CheckBox := TNewCheckBox.Create(WizardForm);
    with ep1_SAVE_CheckBox do
      begin
        Name := 'ep1_SAVE_CheckBox';
        Parent := WizardForm.SelectDirPage;
        Left := ScaleX(8);
        Top := ScaleY(70);
        Width := ScaleX(97);
        Height := ScaleY(17);
        Caption := 'сохранения ep1';
        Enabled := False;
        OnClick :=@Enable;
      end;
  ep2_SAVE_CheckBox := TNewCheckBox.Create(WizardForm);
    with ep2_SAVE_CheckBox do
      begin
        Name := 'ep2_SAVE_CheckBox';
        Parent := WizardForm.SelectDirPage;
        Left := ScaleX(8);
        Top := ScaleY(40);
        Width := ScaleX(97);
        Height := ScaleY(17);
        Caption := 'сохранения ep2';
        Enabled := False;
        OnClick :=@Enable;
      end;
  portal_SAVE_CheckBox := TNewCheckBox.Create(WizardForm);
    with portal_SAVE_CheckBox do
      begin
        Name := 'portal_SAVE_CheckBox';
        Parent := WizardForm.SelectDirPage;
        Left := ScaleX(8);
        Top := ScaleY(10);
        Width := ScaleX(97);
        Height := ScaleY(17);
        Caption := 'сохранения portal';
        Enabled := False;
        OnClick :=@Enable;
      end;
  /////////////////////////////////////////////
  StartFolder:= ExpandConstant('{src}\..\common\half-life 2\hl2\SAVE'); // задаём папку откуда начинать поиск
  StartFolder2:= ExpandConstant('{src}\..\common\half-life 2 episode one\episodic\SAVE'); // задаём папку откуда начинать поиск
  StartFolder3:= ExpandConstant('{src}\..\common\half-life 2 episode two\ep2\SAVE'); // задаём папку откуда начинать поиск
  StartFolder4:= ExpandConstant('{src}\..\common\portal\portal\SAVE'); // задаём папку откуда начинать поиск
  ArrayOfMask:= ['*.sav']; // заполняем массив масок для поиска
  for i:= 0 to GetArrayLength(ArrayOfMask)-1 do // перебираем весь масив масок
    begin
      Mask:= ArrayOfMask[i];
      if FindFile(StartFolder) then hl2_SAVE_Checkbox.Enabled := true;
      if FindFile(StartFolder2) then ep1_SAVE_CheckBox.Enabled := true;
      if FindFile(StartFolder3) then ep2_SAVE_CheckBox.Enabled := true;
      if FindFile(StartFolder4) then portal_SAVE_CheckBox.Enabled := true;
    end;
   


end;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpSelectDir then
  begin
    WizardForm.NextButton.Enabled := false;
  end;
end;



или архив с файлами
http://sendfile.su/586804

R.i.m.s.k.y. 05-05-2012 16:45 1911058

Johny777,
1. либо ставь Тру либо удали блок
Код:

function InitializeSetup(): Boolean;
begin
 Result:=True;
end;

Если InitializeSetup возвращает Фолсе инсталлер закрывается и не пискнет, а булевая функция возвращает Фолсе по-умолчанию если не задано иное.

2. Никак, в твоем архиве много мелких файлов, пока все переберет...
Но вот почему тупит когда файлов нет так это потому что у тебя цикл for i:= 0 to GetArrayLength(ArrayOfMask)-1 гоняется вхолостую
добавь перед ним условие "если есть твои папки тогда уже искать"
Он вообще у тебя коряво сделан, зачем ты в цикле перебираешь когда достаточно и без цикла просто
Код:

  StartFolder:= ExpandConstant('{src}\..\common\half-life 2\hl2\SAVE'); // задаём папку откуда начинать поиск
  StartFolder2:= ExpandConstant('{src}\..\common\half-life 2 episode one\episodic\SAVE'); // задаём папку откуда начинать поиск
  StartFolder3:= ExpandConstant('{src}\..\common\half-life 2 episode two\ep2\SAVE'); // задаём папку откуда начинать поиск
  StartFolder4:= ExpandConstant('{src}\..\common\portal\portal\SAVE'); // задаём папку откуда начинать поиск
  Mask:= '*.sav'; if FindFile(StartFolder) then hl2_SAVE_Checkbox.Enabled := true;
  Mask:= '*.sav'; if FindFile(StartFolder2) then ep1_SAVE_CheckBox.Enabled := true;
  Mask:= '*.sav'; if FindFile(StartFolder3) then ep2_SAVE_CheckBox.Enabled := true;
  Mask:= '*.sav'; if FindFile(StartFolder4) then portal_SAVE_CheckBox.Enabled := true;

кстати я смотрю ты халфу собираешь? у тебя нет случаем HD текстур пака? раньше видел но не удосужился скачать, теперь хочу но не могу найти

Johny777 05-05-2012 18:21 1911099

Цитата:

Цитата R.i.m.s.k.y.
у тебя нет случаем HD текстур пака? »

читать дальше »

если ты о cinematicmod, то нету и не юзаю, тк считаю жуткой отсебятиной и надругательством над халфой
зеркал полно на http://cinematicmod.com/cm_11.php
других не знаю. Раньше они просто текстуры правили мелкими паками (если ты это имеешь в виду), а потом пошло поехало.
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Моя версия
Protocol version 15
Exe version 1.0.0.0 (hl2)
Exe build: 13:30:53 May 24 2010 (4216) (420)
вспомни они перенесли весь орандж бокс на сурс 15 протокола в свяpи с портом стима на Мак,
эти версии мы сейчас имеем
У меня чуть старее чем сейчас (ничего существенного после не обновляли зато вернули ави вместо бик видео в интро, а это плохо),
+ добавил это (правит баги после порта валве на обновлённый двиг и добавляем модели из эпизода 2 + HDR) (на что тебе и советую обратить внимание).
http://forums.steampowered.com/forum....php?t=1093025
вот скринов шлёпнул
читать дальше »


+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++


ну и мелкие фиксы меню игр, воронки эпизода 1 (этот фикс там же по ссылке на форумы стима).
После этого все 3 игры выглядят одинаково и на данный момент на уровень выше релизного эпизода 2

R.i.m.s.k.y. 05-05-2012 18:54 1911119

Johny777, ну тогда сжимай получше, у меня канал тонкий :)

Johny777 05-05-2012 19:00 1911127

R.i.m.s.k.y.,
будет прохладным летним вечером! :)

insombia 06-05-2012 14:28 1911445

Всем привет,меня долго здесь не было по этому не знаю,выходили ли какие то новые версии iswin7 и isdone?

alert30 06-05-2012 14:30 1911446

insombia, нет.

Johny777 07-05-2012 03:36 1911741

намутил пример (под свои нужды, но думаю кому-то пригодится :))
имеем чекбокс отвечающий за установку например директа.
Если во внешней папке директ есть, то он (чекбокс) активен.
В противном случае не активен
Но тут проблема.
Что если инсталл на диске, а директа рядом нет?
тогда добавляется кнопка "показать"
Указываем и если по указанному пути директ есть, то пути передаются директории "откуда ставить" и "рабочей папке"

читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program 1.5
DefaultDirName={pf}\My Program
DirExistsWarning=no
DisableWelcomePage=yes

[  Code]
var
  NewButton1: TNewButton;
  QuickLaunchIcon: TCheckBox;
  Res: Integer;
  S: string;

function MakeQuickLaunchIcon: Boolean;
begin
  Result:=QuickLaunchIcon.Checked;
end;

procedure DirOnClick(Sender: TObject);
var
  DirEditString: String;
 
begin
  DirEditString := WizardForm.DirEdit.Text;
  if BrowseForFolder('Выберите папку из списка и нажмите «ОК»', S, True) then
    begin
      If FileExists(S+'\DXSETUP.exe') then QuickLaunchIcon.Enabled := true;
    end;
end;

procedure InitializeWizard();
begin

  WizardForm.OuterNotebook.Visible := false;
  WizardForm.Color := clWhite;
  WizardForm.Bevel.Visible := false;
  WizardForm.Caption:= 'DirectX Search Test';

  QuickLaunchIcon := TCheckBox.Create(WizardForm);
    with QuickLaunchIcon do
      begin
        Parent := WizardForm;
        Caption := 'Установить директ';
        Left := ScaleX(100);
        Top := ScaleY(160);
        Width := ScaleX(130);
        Height := ScaleY(25);
        TabOrder := 0;
        Checked := False;
        Enabled := False;
      end;
     
  NewButton1 := TNewButton.Create(WizardForm);
    with NewButton1 do
      begin
        Name := 'NewButton1';
        Parent := WizardForm;
        Left := QuickLaunchIcon.Left + QuickLaunchIcon.Width + ScaleX(10);
        Top := QuickLaunchIcon.Top;
        Width := ScaleX(160);
        Height := ScaleY(20);
        Caption := 'указать путь к DXSETUP.exe';
        OnClick := @DirOnClick;
      end;
     
  If FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) then QuickLaunchIcon.Enabled := true;
 
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID=wpReady then
    begin
      If FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) and (QuickLaunchIcon.Checked = true) then                            ///// эти две строки имеют приоритет выше, тк идут первыми.
      Exec(ExpandConstant('{src}\DirectX\DXSETUP.exe'), '', ExpandConstant('{src}\DirectX'), SW_SHOW, ewWaitUntilTerminated, Res);  /// Если пользователь считает, что лучше взять не тот что в комплекте то нижние 2 поменять с этими двумя,
    end
  else  /// добавил, тк если снаружи видит и в пути есть устанавливал бы 2 раза
    begin
      If FileExists(S+'\DXSETUP.exe') and (QuickLaunchIcon.Checked = true) then
      Exec(S+'\DXSETUP.exe', '', S, SW_SHOW, ewWaitUntilTerminated, Res);
    end;
end;


procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  Confirm := False;
end;


El Sanchez 07-05-2012 15:38 1911950

Цитата:

Цитата Johny777
намутил пример (под свои нужды, но думаю кому-то пригодится »

Johny777, пара замечаний. Начнем сверху вниз:
  • Процедура DirOnClick. Кликаем кнопку, выбираем папку с директом, видим, что чекбокс стал активным, радуемся, кликаем еще раз, выбираем папку, где нет директа, видим, что чекбокс все равно активен, печалимся и меняем:
    Код:

    If FileExists(S+'\DXSETUP.exe') then QuickLaunchIcon.Enabled := true;
    на
    QuickLaunchIcon.Enabled := FileExists(S+'\DXSETUP.exe');

  • Процедура InitializeWizard. При создании чекбокса свойство Enabled напиши как
    Код:

    Enabled := FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe'));
    ...
    , а строку If FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) then QuickLaunchIcon.Enabled := true удалить

    У тебя это не ошибка, но строчкой кода меньше.
  • Процедура CurPageChanged. Удалить полностью. На wpReady {src}-овый директ будет запущен, хотя на wpReady ничего не должно запускаться. Вернись на страницу назад и снова на wpReady, снова пойдет установка. На остальных страницах при наличии директа в S тоже начнется установка. Сколько там страниц у Inno? И на каждой пойдет установка директа, поэтому CurPageChanged не годится. Запуск директа должен быть не раньше, чем пользователь нажмет кнопку Установить. Это либо использовать NextButtonClick (CurPageID = wpReady), либо CurStepChanged (CurStep=ssInstall).
    читать дальше »

    Код:

    function NextButtonClick(CurPageID: Integer): Boolean;
    begin
      Result := True;
      case CurPageID of
        wpReady: begin
          if QuickLaunchIcon.Checked then
          begin
            if FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) then
              Exec(ExpandConstant('{src}\DirectX\DXSETUP.exe'), '', ExpandConstant('{src}\DirectX'), SW_SHOW, ewWaitUntilTerminated, Res)
            else if FileExists(S+'\DXSETUP.exe') then
              Exec(S+'\DXSETUP.exe', '', S, SW_SHOW, ewWaitUntilTerminated, Res);
          end;
        end;
      end;
    end;

    //либо
    procedure CurStepChanged(CurStep: TSetupStep);
    begin
      case CurStep of
        ssInstall: begin
          if QuickLaunchIcon.Checked then
          begin
            if FileExists(ExpandConstant('{src}\DirectX\DXSETUP.exe')) then
              Exec(ExpandConstant('{src}\DirectX\DXSETUP.exe'), '', ExpandConstant('{src}\DirectX'), SW_SHOW, ewWaitUntilTerminated, Res)
            else if FileExists(S+'\DXSETUP.exe') then
              Exec(S+'\DXSETUP.exe', '', S, SW_SHOW, ewWaitUntilTerminated, Res);
          end;
        end;
      end;
    end;


Johny777 07-05-2012 15:48 1911962

El Sanchez,
Спасибо за исправления!
Стало ещё проще и удобнее.
Цитата:

Цитата El Sanchez
поэтому CurPageChanged не годится »

И не думал использовать. Только для демонстрации, чтоб инсталл не перезапускать
В скрипте халфы всё это выполняется на шаге ssPostInstall

вот так (пока ещё поиск директа и прочего не добавлял)
читать дальше »
Код:

procedure CurStepChanged(CurStep: TSetupStep);
var
  res: integer;
begin
/// проценты установки /// часть 2 из 4 /// начало
if CurStep = ssInstall then
begin
  PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));
end;
/// конец
if CurStep = ssPostInstall then
begin
  s2_hl2:= hl2_Launch_Edit.Text;
  s1_hl2:= ExpandConstant('-steam -game hl2 -appid 220');
  if CurStep = ssPostInstall then
  begin
  if hl2_icon_Checkbox.Checked then
    CreateShellLink(ExpandConstant('{commondesktop}\Half-Life 2.lnk'), '',
    ExpandConstant('{app}\common\half-life 2\hl2.exe'),s1_hl2 + s2_hl2, ExpandConstant('{app}\common\half-life 2'), ExpandConstant('{app}\common\half-life 2\hl2.ico'), 0, SW_SHOWNORMAL);
  end;
  s2_ep1:= ep1_Launch_Edit.Text;
  s1_ep1:= ExpandConstant('-steam -game episodic -appid 380');
  begin
  if hl2_ep1_icon_Checkbox.Checked then
    CreateShellLink(ExpandConstant('{commondesktop}\Half-Life 2 Episode One.lnk'), '',
    ExpandConstant('{app}\common\half-life 2 episode one\hl2.exe'),s1_ep1 + s2_ep1, ExpandConstant('{app}\common\half-life 2 episode one'), ExpandConstant('{app}\common\half-life 2 episode one\hl2.ico'), 0, SW_SHOWNORMAL);
  end;
  s2_ep2:= ep2_Launch_Edit.Text;
  s1_ep2:= ExpandConstant('-steam -game ep2 -appid 420');
  begin
  if hl2_ep2_Icon_CheckBox.Checked then
    CreateShellLink(ExpandConstant('{commondesktop}\Half-Life 2 Episode Two.lnk'), '',
    ExpandConstant('{app}\common\half-life 2 episode two\hl2.exe'),s1_ep2 + s2_ep2, ExpandConstant('{app}\common\half-life 2 episode two'), ExpandConstant('{app}\common\half-life 2 episode two\hl2.ico'), 0, SW_SHOWNORMAL);
  end;
  s2_portal:= portal_Launch_Edit.Text;
  s1_portal:= ExpandConstant('-steam -game portal -appid 400');
  begin
  if portal_Icon_CheckBox.Checked then
    CreateShellLink(ExpandConstant('{commondesktop}\Portal.lnk'), '',
    ExpandConstant('{app}\common\portal\hl2.exe'),s1_portal + s2_portal, ExpandConstant('{app}\common\portal'), ExpandConstant('{app}\common\portal\portal.ico'), 0, SW_SHOWNORMAL);
  end;
  /// задачи
  If hl2_borealis_CheckBox.Checked then  /// Aurora Borealis
  begin
    ExtractTemporaryFile('Aurora_Borealis.exe');
    Exec(ExpandConstant('{tmp}\Aurora_Borealis.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, Res);
  end;
  /// обновления
  If hl2_update_Checkbox.Checked then
  begin
    FilesMemo.Lines.Add('/// Half-Life 2 ///');
    Exec(ExpandConstant('{src}\outer\update\hl2_update.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, Res);
  end;
  If ep1_update_Checkbox.Checked then
  begin
    FilesMemo.Lines.Add('/// Half-Life 2 Episode One ///');
    Exec(ExpandConstant('{src}\outer\update\hl2_ep1_update.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, Res);
  end;
  If ep2_update_Checkbox.Checked then
  begin
    FilesMemo.Lines.Add('/// Half-Life 2 Episode Two ///');
    Exec(ExpandConstant('{src}\outer\update\hl2_ep2_update.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, Res);
  end;
  If portal_update_Checkbox.Checked then
  begin
    FilesMemo.Lines.Add('/// Portal ///');
    Exec(ExpandConstant('{src}\outer\update\portal_update.exe'), '', ExpandConstant('{app}'), SW_SHOW, ewWaitUntilTerminated, Res);
  end;
  /// директ и прочее
  If DirectX_Checkbox.Checked then
  begin
    FilesMemo.Lines.Add('/// Устанавливается DirectX ///');
    Exec(ExpandConstant('{src}\outer\DirectX\DXSETUP.exe'), '/silent', ExpandConstant('{src}\outer\DirectX'), SW_SHOW, ewWaitUntilTerminated, Res);
  end;
  If VisualC_Checkbox.Checked then
  begin
    FilesMemo.Lines.Add('/// Устанавливается VisualC++ ///');
    Exec(ExpandConstant('{src}\outer\VCRedist\vcredist_x86.exe'), '/q', ExpandConstant('{src}\outer\VCRedist'), SW_SHOW, ewWaitUntilTerminated, Res);
  end;
 
  If Font_Checkbox.Checked then
  begin
    FilesMemo.Lines.Add('/// Извлекаются шрифты ///');
   
    ExtractTemporaryFile('BOXROCKET.ttf');
    ExtractTemporaryFile('fontinst.exe');
    ExtractTemporaryFile('fontinst.inf');
    ExtractTemporaryFile('HALFLIFE2.ttf');
    ExtractTemporaryFile('HL2crosshairs.ttf');
    ExtractTemporaryFile('HL2EP2.ttf');
    ExtractTemporaryFile('marlett.ttf');
   
    FilesMemo.Lines.Add('/// Устанавливаются шрифты ///');
    Exec(ExpandConstant('{tmp}\fontinst.exe'), '/q', ExpandConstant('{tmp}'), SW_SHOW, ewWaitUntilTerminated, Res);
  end;
end;
end;



где FilesMemo это мемо со списоком извлекаемых файлов на странице установки

wertulll 07-05-2012 18:15 1912080

ребятушки подскажите пожалуйста как правильно текстурировать кнопку отмена на деинсталяторе
читать дальше »

[Setup]
SetupIconFile=1.ico
Diskspanning=yes
AppName=S.T.A.L.K.E.R. Зов Припяти.
AppVerName=S.T.A.L.K.E.R. Зов Припяти.
DefaultDirName={pf}\S.T.A.L.K.E.R. Зов Припяти.
DefaultGroupName=S.T.A.L.K.E.R. Зов Припяти.
DirExistsWarning=no
AppVersion=1.0
OutputBaseFilename=setup
OutputDir=.
VersionInfoCopyright=Me
AppPublisher=Square Enix
WizardImageFile=Files\WizardImage.bmp
WizardSmallImageFile=Files\WizardSmallImage.bmp
UninstallDisplayIcon=1.ico
ShowTasksTreeLines=true

[UninstallDelete]
Type: filesandordirs; Name: {app}


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

[Tasks]
Name: desktopicon; Description: Создать значок на Рабочем столе; GroupDescription: Дополнительные значки:
Name: Redist; Description: Дополнительное программное обеспечение:
Name: Redist\DirectXCheck; Description: Обновить Microsoft DirectX; Flags: unchecked
Name: Redist\VCCheck; Description: Установить Microsoft Visual C++ Redist; Flags: unchecked


[Files]
Source: Files\button.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\papka.bmp; DestDir: {tmp}; Flags: dontcopy
Source: Files\Finishe.bmp; DestDir: {tmp}; Flags: dontcopy
Source: "Files\WizardSmallImage.bmp"; DestDir: "{app}"; Attribs: hidden system;



[Icons]
Name: "{group}\Запустить"; Filename: "{app}\MyProg.exe"
Name: "{group}\{cm:UninstallProgram}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\My Program"; Filename: "{app}\MyProg.exe"; Tasks: desktopicon


[Run]
Filename: {src}\Redist\DirectX\DXSETUP.exe; StatusMsg: Обновление компонентов DirectX...; Tasks: Redist\DirectXCheck; Flags: waituntilterminated; Parameters: "/silent";
Filename: "{src}\Redist\vcredist_x86.exe"; StatusMsg: "Установка Microsoft Visual C++ Redist..."; Tasks: Redist\VCCheck; Flags: waituntilterminated; Parameters: "/Q";


[Registry]
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; Flags: uninsdeletekeyifempty
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "InstallPath"; ValueType: String; ValueData: "{app}";
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "Version"; ValueType: String; ValueData: "1.0";
Root: HKLM; Subkey: "SOFTWARE\Deus Ex Human Revolution"; ValueName: "Language"; ValueType: String; ValueData: "Russian";



[code]
const
ButtonWidth = 80;
ButtonHeight = 23;
Color = clblack;

bidBack = 0;
bidNext = 1;
bidCancel = 2;
bidDirBrowse = 3;
bidGroupBrowse = 4;
bidbtnCancelUnpacking = 5;

var
WizardLabel: TLabel;
ButtonPanel: array of TPanel;
ButtonImage: array of TBitmapImage;
ButtonLabel: array of TLabel;
UsedButtons: array of TButton;
ButtonsCount: Integer;
NeedSize:Integer;
FreeMB, TotalMB: Cardinal;
NeedSpaceLabel,FreeSpaceLabel: TLabel;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure GetFreeSpaceCaption(Sender: TObject);
var
Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
if FreeMB > 1024 then
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ FloatToStr(round(FreeMB/1024*100)/100) + ' Гб' else
FreeSpaceLabel.Caption := 'Доступно места на диске: '+ IntToStr(FreeMB)+ ' MB';
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled := False else
WizardForm.NextButton.Enabled := True; end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ FloatToStr(round(NeedSize/1024*100)/100) + ' Гб' else
NeedSpaceLabel.Caption := 'Требуется места на диске: '+ IntToStr(NeedSize)+ ' MB';end;


procedure InitializeWizard1();
begin
NeedSize := 8610;
WizardForm.DiskSpaceLabel.Hide;

NeedSpaceLabel := TLabel.Create(WizardForm);
with NeedSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(202);
Width := ScaleX(209);
Height := ScaleY(13);
end;

FreeSpaceLabel := TLabel.Create(WizardForm);
with FreeSpaceLabel do
begin
Parent := WizardForm.SelectDirPage;
Left := ScaleX(0);
Top := ScaleY(220);
Width := ScaleX(209);
Height := ScaleY(13);
end;

WizardForm.DirEdit.OnChange := @GetFreeSpaceCaption;
WizardForm.DirEdit.Text := WizardForm.DirEdit.Text + #0;
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure ButtonLabelClick(Sender: TObject);
var Button: TButton; n, i: Integer;
begin
i:= TLabel(Sender).Tag; ButtonImage[i].Left:= 0
for n:=0 to (ButtonsCount-1) do begin
if i = n then Button:= UsedButtons[n];
end;
Button.OnClick(Button)
end;

procedure ButtonLabelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=-ButtonWidth*2
end;

procedure ButtonLabelMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
if ButtonLabel[TLabel(Sender).Tag].Enabled then ButtonImage[TLabel(Sender).Tag].Left:=0
end;

procedure ButtonLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n, I: Integer;
begin
I:=TLabel(Sender).Tag;
for n:=0 to (ButtonsCount-1) do begin if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2)and(I<>N) then ButtonImage[n].Left:= 0; end;
if (ButtonLabel[i].Enabled)and(ButtonImage[i].Left <> -ButtonWidth*2) then begin ButtonImage[i].Left:= -ButtonWidth; end;
end;

procedure WizardLabelMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
var n: Integer;
begin
for n:=0 to (ButtonsCount-1) do if (ButtonLabel[n].Enabled)and(ButtonImage[n].Left <> -ButtonWidth*2) then begin ButtonImage[n].Left:= 0; end;
end;

procedure LoadButtonImage(AButton: TButton);
var n: Integer;
begin
n:=ButtonsCount; SetArrayLength(ButtonPanel, n+1);
SetArrayLength(ButtonImage, n+1); SetArrayLength(ButtonLabel, n+1);
SetArrayLength(UsedButtons, n+1); UsedButtons[n]:= AButton;
ButtonPanel[n]:=TPanel.Create(WizardForm)
ButtonPanel[n].SetBounds(AButton.Left, AButton.Top, AButton.Width, AButton.Height)
ButtonPanel[n].Tag:= n
ButtonPanel[n].Enabled:= AButton.Enabled
ButtonPanel[n].Parent:=AButton.Parent
ButtonImage[n]:=TBitmapImage.Create(WizardForm)
ButtonImage[n].SetBounds(ScaleX(0), ScaleY(0), ScaleX(320), ScaleY(23))
ButtonImage[n].Enabled:=False
ButtonImage[n].Bitmap.LoadFromFile(ExpandConstant('{tmp}\Button.bmp'))
ButtonImage[n].Parent:=ButtonPanel[n]
with TLabel.Create(WizardForm) do begin
Tag:=n
Parent:=ButtonPanel[n]
Width:=AButton.Width
Height:=AButton.Height
Transparent:=True
OnClick:=@ButtonLabelClick
OnDblClick:=@ButtonLabelClick
OnMouseMove:=@ButtonLabelMove
OnMouseDown:=@ButtonLabelMouseDown
OnMouseUp:=@ButtonLabelMouseUp
end;

ButtonLabel[n]:=TLabel.Create(WizardForm)
ButtonLabel[n].Autosize:=True
ButtonLabel[n].Alignment:=taCenter
ButtonLabel[n].Tag:=n
ButtonLabel[n].Enabled:= AButton.Enabled
ButtonLabel[n].Transparent:=True
ButtonLabel[n].Font.Color:=clWhite
ButtonLabel[n].Caption:=AButton.Caption
ButtonLabel[n].OnClick:=@ButtonLabelClick
ButtonLabel[n].OnDblClick:=@ButtonLabelClick
ButtonLabel[n].OnMouseMove:=@ButtonLabelMove
ButtonLabel[n].OnMouseDown:=@ButtonLabelMouseDown
ButtonLabel[n].OnMouseUp:=@ButtonLabelMouseUp
ButtonLabel[n].Parent:=ButtonPanel[n]
ButtonsCount:= ButtonsCount+1
end;

procedure UpdateButtons();
var n: Integer;
begin
for n:=0 to ButtonsCount-1 do begin
ButtonLabel[n].Caption:=UsedButtons[n].Caption
ButtonPanel[n].Visible:=UsedButtons[n].Visible
if (UsedButtons[n].Enabled = False) then ButtonImage[n].Left:= -ButtonWidth*3 else ButtonImage[n].Left:= 0;
ButtonLabel[n].Enabled:= UsedButtons[n].Enabled;
ButtonPanel[n].Enabled:= UsedButtons[n].Enabled;
ButtonLabel[n].Left:= ButtonPanel[n].Width div 2 - ButtonLabel[n].Width div 2;
ButtonLabel[n].Top:= ButtonPanel[n].Height div 2 - ButtonLabel[n].Height div 2;
end;
end;

procedure LicenceAcceptedRadioOnClick(Sender: TObject);
begin
WizardForm.NextButton.Enabled:= True;
UpdateButtons();
end;

procedure LicenceNotAcceptedRadioOnClick(Sender: TObject);
begin
WizardForm.NextButton.Enabled:= False;
UpdateButtons()
end;

procedure ButtonTextures();
begin
WizardLabel:= TLabel.Create(WizardForm)
WizardLabel.SetBounds(ScaleX(0), ScaleY(0), ScaleX(WizardForm.Width), ScaleY(WizardForm.Height))
WizardLabel.Transparent:= True;
WizardLabel.AutoSize:=false;
WizardLabel.OnMouseMove:=@WizardLabelMove
WizardLabel.Parent:= WizardForm;

WizardForm.BackButton.Width:= ButtonWidth
WizardForm.BackButton.Height:= ButtonHeight

WizardForm.NextButton.Width:= ButtonWidth
WizardForm.NextButton.Height:= ButtonHeight

WizardForm.CancelButton.Width:=ButtonWidth
WizardForm.CancelButton.Height:= ButtonHeight

WizardForm.DirBrowseButton.Left:=ScaleX(337)
WizardForm.DirBrowseButton.Width:= ButtonWidth
WizardForm.DirBrowseButton.Height:=ButtonHeight

WizardForm.GroupBrowseButton.Left:=ScaleX(337)
WizardForm.GroupBrowseButton.Width:= ButtonWidth
WizardForm.GroupBrowseButton.Height:=ButtonHeight

WizardForm.LicenseAcceptedRadio.OnClick:=@LicenceAcceptedRadioOnClick
WizardForm.LicenseNotAcceptedRadio.OnClick:=@LicenceNotAcceptedRadioOnClick

ExtractTemporaryFile('button.bmp')
LoadButtonImage(WizardForm.BackButton)
LoadButtonImage(WizardForm.NextButton)
LoadButtonImage(WizardForm.CancelButton)
LoadButtonImage(WizardForm.DirBrowseButton)
LoadButtonImage(WizardForm.GroupBrowseButton)

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure InitializeWizard2();
begin
WizardForm.Font.Color:=clWhite;
WizardForm.Color:=Color;
WizardForm.WelcomePage.Color:=Color;
WizardForm.InnerPage.Color:=Color;
WizardForm.FinishedPage.Color:=Color;
WizardForm.LicensePage.Color:=Color;
WizardForm.PasswordPage.Color:=Color;
WizardForm.InfoBeforePage.Color:=Color;
WizardForm.UserInfoPage.Color:=Color;
WizardForm.SelectDirPage.Color:=Color;
WizardForm.SelectComponentsPage.Color:=Color;
WizardForm.SelectProgramGroupPage.Color:=Color;
WizardForm.SelectTasksPage.Color:=Color;
WizardForm.ReadyPage.Color:=Color;
WizardForm.PreparingPage.Color:=Color;
WizardForm.InstallingPage.Color:=Color;
WizardForm.InfoAfterPage.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.DiskSpaceLabel.Color:=Color;
WizardForm.DirEdit.Color:=Color;
WizardForm.GroupEdit.Color:=Color;
WizardForm.PasswordLabel.Color:=Color;
WizardForm.PasswordEdit.Color:=Color;
WizardForm.PasswordEditLabel.Color:=Color;
WizardForm.ReadyMemo.Color:=Color;
WizardForm.TypesCombo.Color:=Color;
WizardForm.WelcomeLabel1.Color:=Color;
WizardForm.InfoBeforeClickLabel.Color:=Color;
WizardForm.MainPanel.Color:=Color;
WizardForm.PageDescriptionLabel.Color:=Color;
WizardForm.ReadyLabel.Color:=Color;
WizardForm.YesRadio.Color:=Color;
WizardForm.NoRadio.Color:=Color;
WizardForm.WelcomeLabel2.Color:=Color;
WizardForm.LicenseLabel1.Color:=Color;
WizardForm.InfoAfterClickLabel.Color:=Color;
WizardForm.ComponentsList.Color:=Color;
WizardForm.ComponentsDiskSpaceLabel.Color:=Color;
WizardForm.BeveledLabel.Color:=Color;
WizardForm.StatusLabel.Color:=Color;
WizardForm.FilenameLabel.Color:=Color;
WizardForm.SelectDirLabel.Color:=Color;
WizardForm.SelectStartMenuFolderLabel.Color:=Color;
WizardForm.SelectComponentsLabel.Color:=Color;
WizardForm.SelectTasksLabel.Color:=Color;
WizardForm.LicenseAcceptedRadio.Color:=Color;
WizardForm.LicenseNotAcceptedRadio.Color:=Color;
WizardForm.UserInfoNameLabel.Color:=Color;
WizardForm.UserInfoNameEdit.Color:=Color;
WizardForm.UserInfoOrgLabel.Color:=Color;
WizardForm.UserInfoOrgEdit.Color:=Color;
WizardForm.PreparingLabel.Color:=Color;
WizardForm.UserInfoSerialLabel.Color:=Color;
WizardForm.UserInfoSerialEdit.Color:=Color;
WizardForm.TasksList.Color:=Color;
WizardForm.RunList.Color:=Color;
WizardForm.SelectDirBrowseLabel.Color:=Color;
WizardForm.SelectStartMenuFolderBrowseLabel.Color:=Color;
end;

var
WelcomeLabel1, WelcomeLabel2, FinishedLabel, FinishedHeadingLabel: TLabel;
PageNameLabel: TLabel;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:=True;
end;

procedure Labels();
begin
WelcomeLabel1:= TLabel.Create(WizardForm);
WelcomeLabel1.AutoSize:= False;
with WizardForm.WelcomeLabel1 do
WelcomeLabel1.SetBounds(Left, Top, Width, Height);
WelcomeLabel1.Left:=240
WelcomeLabel1.Top
WelcomeLabel1.Width:=230
WelcomeLabel1.Height:=200
WelcomeLabel1.Font:= WizardForm.WelcomeLabel1.Font
WelcomeLabel1.Font.Color:= clWhite;
WelcomeLabel1.Transparent:= True;
WelcomeLabel1.WordWrap:= true;
WelcomeLabel1.Caption:= WizardForm.WelcomeLabel1.Caption;
WelcomeLabel1.Parent:= WizardForm.WelcomePage

WelcomeLabel2:= TLabel.Create(WizardForm);
WelcomeLabel2.AutoSize:= False;
with WizardForm.WelcomeLabel2 do
WelcomeLabel2.SetBounds(Left, Top, Width, Height);
WelcomeLabel2.Left:=240
WelcomeLabel2.Top:=100
WelcomeLabel2.Width:=230 //СЖИМАЕТ ТЕКСТ
WelcomeLabel2.Height
WelcomeLabel2.Font:= WizardForm.WelcomeLabel2.Font
WelcomeLabel2.Font.Color:= clWhite;
WelcomeLabel2.Transparent:= True;
WelcomeLabel2.WordWrap:= true;
WelcomeLabel2.Caption:= WizardForm.WelcomeLabel2.Caption;
WelcomeLabel2.Parent:= WizardForm.WelcomePage

WizardForm.WizardSmallBitmapImage.SetBounds(ScaleX(0), ScaleY(0), WizardForm.MainPanel.Width, WizardForm.MainPanel.Height);

PageNameLabel:= TLabel.Create(WizardForm)
with WizardForm.PageNameLabel do
PageNameLabel.SetBounds(Left, Top, Width, Height);
PageNameLabel.Transparent:= True;
PageNameLabel.Font:= WizardForm.PageNameLabel.Font;
PageNameLabel.Font.Color:= clWhite; //цвет надписи
PageNameLabel.Parent:= WizardForm.MainPanel;


FinishedHeadingLabel:= TLabel.Create(WizardForm);
FinishedHeadingLabel.AutoSize:= False;
with WizardForm.FinishedHeadingLabel do
FinishedHeadingLabel.SetBounds(ScaleX(30), ScaleY(20), ScaleX(200), ScaleY(220));
FinishedHeadingLabel.Left:=240
FinishedHeadingLabel.Top
FinishedHeadingLabel.Width:=230
FinishedHeadingLabel.Height:=200
FinishedHeadingLabel.Font:= WizardForm.FinishedHeadingLabel.Font
FinishedHeadingLabel.Font.Color:= clWhite;
FinishedHeadingLabel.Transparent:= True;
FinishedHeadingLabel.WordWrap:= true;
FinishedHeadingLabel.Parent:= WizardForm.FinishedPage

FinishedLabel:= TLabel.Create(WizardForm);
FinishedLabel.AutoSize:= False;
with WizardForm.FinishedLabel do
FinishedLabel.SetBounds(ScaleX(30), ScaleY(120), ScaleX(130), ScaleY(220));
FinishedLabel.Left:=240
FinishedLabel.Top:=100
FinishedLabel.Width:=230 //СЖИМАЕТ ТЕКСТ
FinishedLabel.Height
FinishedLabel.Font:= WizardForm.FinishedLabel.Font
FinishedLabel.Font.Color:= clWhite;
FinishedLabel.Transparent:= True;
FinishedLabel.WordWrap:= true;
FinishedLabel.Parent:= WizardForm.FinishedPage

WizardForm.PageNameLabel.Hide;
WizardForm.PageDescriptionLabel.Hide;
WizardForm.FilenameLabel.Hide;
WizardForm.WelcomeLabel1.Hide;
WizardForm.WelcomeLabel2.Hide;
WizardForm.FinishedLabel.Hide;
WizardForm.FinishedHeadingLabel.Hide;
end;

procedure InitializeWizard3();
Begin
ButtonTextures();
Labels();
ExtractTemporaryFile('Finishe.bmp');
WizardForm.WizardBitmapImage.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Width:= ScaleX(497);
WizardForm.WizardBitmapImage2.Bitmap.LoadFromFile(ExpandConstant('{tmp}\Finishe.bmp'));
ExtractTemporaryFile('papka.bmp');
WizardForm.SelectDirBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectDirBitmapImage.AutoSize:=true;
WizardForm.SelectGroupBitmapImage.Bitmap.LoadFromFile(ExpandConstant('{tmp}\papka.bmp'));
WizardForm.SelectGroupBitmapImage.AutoSize:=true;
end;
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Procedure CurPageChanged2(CurPageID: Integer);
Begin
UpdateButtons();
PageNameLabel.Caption:= WizardForm.PageNameLabel.Caption;
FinishedLabel.Caption:= WizardForm.FinishedLabel.Caption;
FinishedHeadingLabel.Caption:= WizardForm.FinishedHeadingLabel.Caption;
begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
begin
WizardForm.NextButton.Enabled := False;
ButtonLabel[bidNext].Enabled := False;
ButtonPanel[bidNext].Enabled := False;
end;
end;
end;

procedure InitializeUninstallProgressForm;
begin
FileCopy(ExpandConstant('{app}\WizardSmallImage.bmp'), ExpandConstant('{tmp}\WizardSmallImage.bmp'), False);
UninstallProgressForm.Color:=Color;
UninstallProgressForm.InnerPage.Color:=Color;
UninstallProgressForm.MainPanel.Color:=Color;
UninstallProgressForm.PageNameLabel.Color:=Color;
UninstallProgressForm.PageDescriptionLabel.Hide;
UninstallProgressForm.PageNameLabel.Font.Color:=clWhite;
UninstallProgressForm.PageNameLabel.Width:=ScaleX(300);
UninstallProgressForm.StatusLabel.Color:=Color;
UninstallProgressForm.StatusLabel.Font.Color:=clWhite;


with UninstallProgressForm.WizardSmallBitmapImage do
begin
Bitmap.LoadFromFile(ExpandConstant('{tmp}\WizardSmallImage.bmp'));
SetBounds(ScaleX(335), ScaleY(2), ScaleX(160), ScaleY(50));
end;
end;

procedure InitializeWizard();
begin
InitializeWizard1();
InitializeWizard2();
InitializeWizard3();
end;

procedure CurPageChanged(CurPageID: Integer);
begin
CurPageChanged2(CurPageID);
if CurPageID=wpSelectDir then
begin
GetNeedSpaceCaption;
if FreeMB < NeedSize then
WizardForm.NextButton.Enabled:=False
end;
end;

Johny777 07-05-2012 18:45 1912107

wertulll,
попробуй так
(по двум секциям раскидай)
Код:

[Files]
Source: Files\button.bmp; DestDir: {app}; Attribs: hidden system;  /// копируем текстуру помимо как в темп(оттуда всё сотрётся после установки) ещё и в директорию установки и скрываем

[ code]
procedure InitializeUninstallProgressForm;
begin
  FileCopy(ExpandConstant('{app}\button.bmp'), ExpandConstant('{tmp}\button.bmp'), False); /// принцип такой же как и у тебя, только не с картинкой для деинсталятора а с текстурой кнопки
  LoadButtonImage(UninstallProgressForm.CancelButton) /// грузим текстуру для кнопки "отмены" окна удаления
end;


wertulll 07-05-2012 19:35 1912129

Johny777,
ошибка при удалении

Johny777 07-05-2012 23:49 1912271

wertulll,
там ведь кнопка только заблокирована?
если да, то не проще ли просто создать картинку, а кнопку скрыть?

bear! 08-05-2012 03:13 1912300

Интересует такой вопрос — какие константы путей использовать, чтобы инсталлятор находил определенный файл или директорию у пользователя, и устанавливал туда нужные файлы?
Нужно для русификатора. Часто кстати видел, когда инсталлятор (русификатор или патч, к примеру) указывал путь, который я сам ранее назначал, ну или к примеру диск с этими файлами.

alert30 08-05-2012 04:39 1912305

bear!, файлы русификации не просто, а вот если русификаторы засунуто в инсталлятор PatchWise Free; то смогу положить код.

bear! 08-05-2012 06:20 1912308

Ну в смысле не просто? Эверест что ли покорить нужно. Видел я подобное и на Inno Setup.
Это все ради удобства, пользователь и сам может указать директорию, куда нужно установить, но просто так эффектней и удобней наверное. Поэтому если есть возможность рассказать подробней об этом, то было бы отлично.

wertulll 08-05-2012 07:42 1912314

Johny777, последовал вашему совету :yes:

wertulll 08-05-2012 07:47 1912315

подскажите код для отображения этого

Johny777 08-05-2012 10:51 1912361

Цитата:

Цитата wertulll
подскажите код для отображения этого »

насчёт лейбла с отображением прошедшего времени не знаю
а вот с процентами и оставшимся временем дела обстоят хорошо!

читать дальше »
Код:


[Setup]
AppName=ProgressBar + TimeLeft v2 by South.Tver
AppVerName=ProgressBar + TimeLeft v2 by South.Tver
DefaultDirName={pf}\ProgressBar + TimeLeft v2
OutputBaseFilename=setup

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

Source: CallbackCtrl.dll; Flags: dontcopy
Source: InnoCallback.dll; Flags: dontcopy


[  Code]
type
  TPBProc = function (h:hWnd;Msg,wParam,lParam:Longint):Longint;
  TTimerProc = procedure(HandleW, Msg, idEvent, TimeSys: LongWord);  /// проценты

var
  TimeLeftLabel : TLabel;

  PBOldProc    : Longint;
  WFCaption    : string;
  eTime, sTime  : DWORD;
///////////////////////////////// проценты /// начало
  PercentsTimer: LongWord;
  PercentsLabel: TLabel;

function WrapTimerProc(callback: TTimerProc; Paramcount: Integer): longword; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): longword; external 'SetTimer@user32';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32 stdcall delayload';
/////////////////////////////////////////// конец
function SetWindowLong(hWnd: HWND; nIndex: Integer; dwNewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function CallBackProc(P:TPBProc;ParamCount:integer):LongWord; external 'wrapcallbackaddr@files:CallbackCtrl.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall';

///////////////////////////////// проценты /// начало
Function NumToStr(Float: Extended): String;
begin
  Result:= Format('%.1n', [Float]); StringChange(Result, ',', '.');
  while ((Result[Length(Result)] = '0') or (Result[Length(Result)] = '.')) and (Pos('.', Result) > 0) do
  SetLength(Result, Length(Result)-1);
End;

Procedure PercentsProc(h, msg, idevent, dwTime: Longword);
Begin
  with WizardForm.ProgressGauge do
  begin
    PercentsLabel.Caption:= 'Выполнено ' + NumToStr((Position*100)/Max) + ' %';
  end;
End;
//////// конец



function LongintToStringTime(t:Longint):string;
var
  h,m,s:integer;
begin
  h:=t div 3600;
  t:=t-h*3600;
  m:=t div 60;
  s:=t-m*60;
  Result:='';
  if h>0 then Result:=Result+IntToStr(h)+' ч. ';
  if (m>0) or (h>0) then Result:=Result+IntToStr(m)+' мин. ';
  if (m>0) or (h>0) or (s>0) then Result:=Result+IntToStr(s)+' сек.';
end;

function PBProc(h:hWnd;Msg,wParam,lParam:Longint):Longint;
var
  lt:Longint;
  dt,at,pr,i1,i2:Extended;
  p:string;
  tc:DWORD;
begin
  Result:=CallWindowProc(PBOldProc,h,Msg,wParam,lParam);
  if (Msg=$402) and (WizardForm.ProgressGauge.Position>WizardForm.ProgressGauge.Min) then begin
    i1:=WizardForm.ProgressGauge.Position-WizardForm.ProgressGauge.Min;
    i2:=WizardForm.ProgressGauge.Max-WizardForm.ProgressGauge.Min;

    tc:=GetTickCount;
    if (tc-eTime)>=1000 then begin //пересчитывем время оставшееся до конца установки не чаще, чем раз в 1 секунду
      dt:=(tc-sTime)/1000;
      at:=i2*dt/i1;
      lt:=Round(at-dt)
      TimeLeftLabel.Caption:='Осталось - '+LongintToStringTime(lt);
      eTime:=tc;
    end;

    pr:=i1*100/i2;
    p:=' - ['+Format('%f',[pr])+'%]';
    StringChange(p,',','.');
  end;
end;

procedure AllCancel;
begin
  SetWindowLong(WizardForm.ProgressGauge.Handle,-4,PBOldProc);
  TimeLeftLabel.Free;
  PercentsLabel.Free; /// проценты
end;

function InitializeSetup:boolean;
begin
  if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
  Result:=True;
end;

procedure CurStepChanged(CurStep: TSetupStep);
begin
  case CurStep of
    ssInstall: begin
   
      MsgBox('Чтобы продлить время установки будут скопированы шрифты и справки',mbInformation,MB_OK); /// чтоб не пугались
   
      PercentsTimer:= SetTimer(0, 0, 100, WrapTimerProc(@PercentsProc, 4));  /// проценты
   
      TimeLeftLabel:=TLabel.Create(nil);
      with TimeLeftLabel do begin
        Parent:=WizardForm.InstallingPage;
        AutoSize:=True;
        SetBounds(WizardForm.ProgressGauge.Left + ScaleX(250),WizardForm.ProgressGauge.Top + ScaleY(30),ScaleY(80),ScaleY(21));
      end;

      ///////////////////// проценты /// начало
      PercentsLabel:= TLabel.Create(nil);
      with PercentsLabel do
      begin
        SetBounds(WizardForm.ProgressGauge.Left + ScaleX(30), WizardForm.ProgressGauge.Top + WizardForm.ProgressGauge.Height + ScaleY(10), WizardForm.StatusLabel.Width, WizardForm.StatusLabel.Height);
        AutoSize:= True;
        Transparent := True;
        Parent:= WizardForm.InstallingPage;
      end;
      /// конец


      sTime:=GetTickCount;
      eTime:=sTime;

      PBOldProc:=SetWindowLong(WizardForm.ProgressGauge.Handle,-4,CallBackProc(@PBProc,4));
    end;
    ssPostInstall: AllCancel;
  end;
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if CurPageID=wpInstalling then begin
    Confirm:=False;
    Cancel:=ExitSetupMsgBox;
    if Cancel then AllCancel;
  end;
end;

/////// проценты /// начало
procedure DeinitializeSetup();
begin
  KillTimer(0, PercentsTimer);
end;
///////// конец


сделал так что ты можешь стереть проценты и оставить только время установки
немного изменил сами "проценты" (скопипастил создание лейбла у того же примера с которым совмещал :))

1. пример процентов из InnoSetup FAQ
2. "оставшееся время" - это пример ProgressBar + TimeLeft v2 by South.Tver (....\Inno Setup 5\Modules\South\botva2_example\progressbar+TimeLeft.iss), но без ботвы

*(перед тем как выложить проверил)

архив с библиотеками

wertulll 08-05-2012 12:32 1912424

Johny777, спасибо !!!решил вопрос через ISDone :)

Devils Night 08-05-2012 13:01 1912440

Такой вопрос: насчёт #define AppID, я что-то пробовал вставить AppId={{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24} вместо AppId=TheBestAppIdEverMade, компилится нормально, но выдаёт ошибку: Exception Internal error: Failed to pause "reg" constant, где грабли?
Вообще расчитываю на #define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}"
В общем вот:
читать дальше »
Код:

#define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}"
#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "unins000.exe"

[Setup]
AppId={{#AppID}
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}


[Files]
Source: hl2.exe; DestDir: {app}\common\half-life 2; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname


[  Code]
var
  Run_Button: TNewButton;
  Del_Button: TNewButton;
  AppPath, UninsPath: string;
  ResultCode: Integer;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
  if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
  Confirm:= False;
end;

procedure UninstallButtonClick(Sender: TObject);
begin
  Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);         
end;

procedure RunButtonClick(Sender: TObject);
begin
  Exec(AppPath + '\common\half-life 2\hl2.exe', '', '', SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure InitializeWizard;
begin
  AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}'));
  UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}'));
    { Run_Button }
      Run_Button := TNewButton.Create(WizardForm);
      with Run_Button do
      begin
        Name := 'Run_Button';
        Parent := WizardForm;
        Left := ScaleX(240);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption := 'Запустить';
        OnClick := @RunButtonClick;
        Enabled := FileExists(AppPath + '\common\half-life 2\hl2.exe');
      end;

    { Del_Button }
      Del_Button := TNewButton.Create(WizardForm);
      with Del_Button do
      begin
        Name := 'Del_Button';
        Parent := WizardForm;
        Left := ScaleX(153);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption := 'Удалить';
        OnClick := @UninstallButtonClick;
      end;

    if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') then
    MsgBox('Программа {#AppName} уже установлена',mbError,MB_OK);

end;

procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1') and (CurPageId=wpWelcome)
  then
    begin
      Run_Button.Visible := True;
      Del_Button.Visible := True;
      WizardForm.NextButton.Caption := 'Продолжить';
    end
  else
    begin
      Run_Button.Visible := false;
      Del_Button.Visible := false;
    end;
end;

P.S Компилится нормально, но инсталлятор не запускается.

El Sanchez 08-05-2012 14:41 1912503

Devils Night, при раскрытии константы {#SetupSetting("AppID")} значение завершается фигурной скобкой и компилятор считает, что константа {reg} завершена на этой скобке и синтаксис рушится. Экранируй как в справке сказано:
Код:

[Setup]
AppID={{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24%7d


Devils Night 08-05-2012 19:40 1912684

Цитата:

Цитата El Sanchez
Экранируй как в справке сказано »

Так не пойдёт AppID={{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24%7d, т.к в реестре так и записывается {D8E8ADA9-2E6C-49E7-924B-A32B89C23A24%7d_is1 а нужно именно AppID={{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}, потому что устройство проверяет именно этот ключ, да и с учётом скобок {}, если там другой набор, то устройство запускает свою программу.

El Sanchez 08-05-2012 21:10 1912724

Devils Night, спасибо, ясно. Замена закрывающей фигурной скобки для препроцессорных констант на какой-нибудь другой символ ничего не дал, режим С-style препроцессора тоже. Придется использовать RegQueryStringValue.

Devils Night 08-05-2012 21:43 1912749

El Sanchez, Если без вариантов с тем кодом, то может есть ещё какой вариант? Размер окна не имеет значения, и не обязательно чтоб был маленький, можно и стандарт.
В общем код в три кнопки, такого содержания:
читать дальше »
Код:

#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define UnExe "unins000.exe"

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}

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

[Messages]
rus.SetupWindowTitle={#AppName}

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "C:\Program Files\Inno Setup 5\Examples\MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion nocompression;

[Icons]
Name: "{group}\{#AppName}"; Filename: "{app}\{#AppExeName}"
Name: "{group}\{cm:UninstallProgram,{#AppName}}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\{#AppName}"; Filename: "{app}\{#AppExeName}"; Tasks: desktopicon

[Run]
Filename: "{app}\{#AppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(AppName, "&", "&&")}}"; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKLM; Subkey: "SOFTWARE\{#AppName}"; Flags: uninsdeletekey
Root: HKLM; Subkey: "SOFTWARE\{#AppName}"; ValueName: "Path"; ValueType: String; ValueData: "{app}\"; Flags: uninsdeletekey

[UninstallDelete]
Type: filesandordirs; Name: {app};

[ Code]
//Три кнопки - Начало скрипта
var
AppDir, unins, run: string;
ResultCode: Integer;
UninsButton, RunButton: TButton;
MyLabel: TLabel;

procedure ReadEntries;
begin
RegQueryStringValue(HKLM, 'SOFTWARE\{#AppName}', 'Path', AppDir);
end;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;

procedure Uninstall(Sender: TObject);
begin
unins:='{#UnExe}';
ReadEntries;
if not (FileExists(AddBackslash(AppDir) + unins)) then
MsgBox('Невозможно запустить деинсталляцию программы ' + ExpandConstant('{#AppName}') + ', т.к. исполняемый файл деинсталляции unins000.exe не найден.', mbCriticalError, MB_OK or MB_DEFBUTTON1)
else
Exec(AddBackslash(AppDir) + unins, '', ExtractFilePath(AddBackslash(AppDir) + unins), SW_SHOW, ewNoWait, ResultCode);
WizardForm.Close;
end;

procedure RunProgramm(Sender: TObject);
begin
run:='{#AppExeName}';
ReadEntries;
if (FileExists(AddBackslash(AppDir) + run)) then
Exec(AddBackslash(AppDir) + run, '', ExtractFilePath(AddBackslash(AppDir) + run), SW_SHOW, ewNoWait, ResultCode);
WizardForm.Close;
end;

procedure NewForm;
begin
ReadEntries;
if (RegValueExists(HKLM, 'SOFTWARE\{#AppName}', 'Path')) and (FileExists(ExpandConstant(AppDir)+'\{#AppExeName}')) then begin
with WizardForm do
begin
ClientWidth := ScaleX(395);
ClientHeight := ScaleY(120);
Bevel.Hide;
InnerNotebook.Hide;
OuterNotebook.Hide;
BorderStyle:= bsDialog;
Center;
with CancelButton do
begin
Left := WizardForm.CancelButton.Left -100;
Top := WizardForm.ClientHeight - CancelButton.Height - ScaleY(10);
BringToFront;
end;
UninsButton:= TButton.Create(WizardForm);
with UninsButton do
begin
Left := WizardForm.NextButton.Left -100;
Top := WizardForm.ClientHeight - NextButton.Height - ScaleY(10);
Width:= WizardForm.NextButton.Width;
Parent:= WizardForm;
Caption:= 'Удалить';
OnClick := @Uninstall;
BringToFront;
end;
RunButton:= TButton.Create(WizardForm);
with RunButton do
begin
Left := WizardForm.BackButton.Left -110;
Top := WizardForm.ClientHeight - BackButton.Height - ScaleY(10);
Width:= WizardForm.BackButton.Width;
Parent:= WizardForm;
Caption:= 'Запустить';
OnClick := @RunProgramm;
BringToFront;
end;
MyLabel:= TLabel.Create(WizardForm);
with MyLabel do
begin
SetBounds(10,10,380,80);
AutoSize:=False;
WordWrap:=True;
//Font.Color:=$000000;
//Font.Style:=[fsBold];
//Font.Size:=10;
Parent:=WizardForm;
Transparent:=True;
Caption:= 'Программа ' + ExpandConstant('{#AppName}') + ' уже установлена на Ваш компьютер.' +#13#13+ 'Выберите нужное действие.';
end;
end;
end;
end;

procedure InitializeWizard;
begin
NewForm;
end;
//Три кнопки - Конец скрипта



Задача: Добавить ещё одну кнопку Изменить.
Может посоветуешь какой ещё вариант?

El Sanchez 08-05-2012 22:30 1912785

Цитата:

Цитата Devils Night
Если без вариантов с тем кодом, то может есть ещё какой вариант? Размер окна не имеет значения, и не обязательно чтоб был маленький, можно и стандарт. »

Devils Night, я в скрипт не вникал, я лишь указал на проблему в строках при GUID-ном AppID:
Код:

AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}'));
UninsPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,UninstallString|}'));

..., которую можно решить, заменив раскрытие константы {reg} на функцию RegQueryStringValue:
Код:

if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'InstallLocation', AppPath) then
  AppPath := RemoveQuotes(AppPath);
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'UninstallString', UninsPath) then
  UninsPath := RemoveQuotes(UninsPath);

Цитата:

Цитата Devils Night
Добавить ещё одну кнопку Изменить. »

Кнопка должна знать где будет находиться дистрибутив во время нажатия на нее. Посмотри как реализовано в Example_Uninstall_3.iss (кнопка UModifyButton) от Restools. Плюс прикрутить AppModifyPath для понту.

Johny777 08-05-2012 23:32 1912824

El Sanchez, R.i.m.s.k.y.,
можно пожалуйста общий вопрос?
читать дальше »

вот 2 маленьких примера
1.
читать дальше »
Код:

var
  RichEditViewer1: TRichEditViewer;  /// глобально
 
procedure InitializeWizard();
begin
  { RichEditViewer1 }
  RichEditViewer1 := TRichEditViewer.Create(WizardForm);
  with RichEditViewer1 do
  begin
    Name := 'RichEditViewer1';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(112);
    Top := ScaleY(112);
    Width := ScaleX(185);
    Height := ScaleY(89);
    Text := '';
  end;
end;


2.
читать дальше »
Код:

procedure InitializeWizard();
var
  RichEditViewer1: TRichEditViewer;  /// локально
 
begin
  { RichEditViewer1 }
  RichEditViewer1 := TRichEditViewer.Create(WizardForm);
  with RichEditViewer1 do
  begin
    Name := 'RichEditViewer1';
    Parent := WizardForm.SelectDirPage;
    Left := ScaleX(112);
    Top := ScaleY(112);
    Width := ScaleX(185);
    Height := ScaleY(89);
    Text := '';
  end;
end;



в первом примере
var
RichEditViewer1: TRichEditViewer; объявлен глобально
а во втором локально в InitializeWizard-е;
читал, что после выполнения процедуры переменная освобождается
Освобождаются ли переменные после инициализации (по окончании работы InitializeWizard) ?
если да, то действительно ли это влияет на производительность
.................................................................................................... ......................................
вот глянь у меня в одном RedesignWizardForm; на данный момент количество переменных
читать дальше »
Код:

var
  Mr_Valve_Label: TLabel;
  Valve_Label: TLabel;
  Welcome_Label_1: TLabel;
  Welcome_hl2series_Label: TLabel;
  BitmapImage6: TBitmapImage;
  Welcome_Label_2: TLabel;
  BitmapImage10: TBitmapImage;
  BitmapImage11: TBitmapImage;
  Part1_ScrollBox: TScrollBox;
  Intro_BitmapImage1: TBitmapImage;
  BitmapImage1: TBitmapImage;
  BitmapImage3: TBitmapImage;
  BitmapImage8: TBitmapImage;
  BitmapImage7: TBitmapImage;
  BitmapImage12: TBitmapImage;
  BitmapImage13: TBitmapImage;
  BitmapImage14: TBitmapImage;
  BitmapImage15: TBitmapImage;
  BitmapImage16: TBitmapImage;
  BitmapImage17: TBitmapImage;
  BitmapImage18: TBitmapImage;
  BitmapImage19: TBitmapImage;
  BitmapImage20: TBitmapImage;
  BitmapImage21: TBitmapImage;
  BitmapImage22: TBitmapImage;
  BitmapImage23: TBitmapImage;
  BitmapImage24: TBitmapImage;
  BitmapImage25: TBitmapImage;
  BitmapImage26: TBitmapImage;
  BitmapImage27: TBitmapImage;
  BitmapImage28: TBitmapImage;
  BitmapImage29: TBitmapImage;
  BitmapImage30: TBitmapImage;
  BitmapImage31: TBitmapImage;
  BitmapImage32: TBitmapImage;
  BitmapImage33: TBitmapImage;
  BitmapImage34: TBitmapImage;
  BitmapImage35: TBitmapImage;
  BitmapImage36: TBitmapImage;
  BitmapImage37: TBitmapImage;
  Label_Lambda: TLabel;
  BitmapImage38: TBitmapImage;
  BitmapImage39: TBitmapImage;
  BitmapImage40: TBitmapImage;
  BitmapImage41: TBitmapImage;
  BitmapImage42: TBitmapImage;
  BitmapImage43: TBitmapImage;
  BitmapImage44: TBitmapImage;
  BitmapImage45: TBitmapImage;
  BitmapImage46: TBitmapImage;
  BitmapImage47: TBitmapImage;
  BitmapImage48: TBitmapImage;
  BitmapImage49: TBitmapImage;
  BitmapImage50: TBitmapImage;
  BitmapImage51: TBitmapImage;
  BitmapImage52: TBitmapImage;
  BitmapImage53: TBitmapImage;
  BitmapImage55: TBitmapImage;
  BitmapImage54: TBitmapImage;
  BitmapImage56: TBitmapImage;
  BitmapImage57: TBitmapImage;
  BitmapImage58: TBitmapImage;
  BitmapImage59: TBitmapImage;
  BitmapImage60: TBitmapImage;
  BitmapImage61: TBitmapImage;
  BitmapImage62: TBitmapImage;
  BitmapImage63: TBitmapImage;
  BitmapImage64: TBitmapImage;
  BitmapImage65: TBitmapImage;
  BitmapImage66: TBitmapImage;
  BitmapImage67: TBitmapImage;
  BitmapImage68: TBitmapImage;
  BitmapImage69: TBitmapImage;
  BitmapImage2: TBitmapImage;
  BitmapImage70: TBitmapImage;
  BitmapImage71: TBitmapImage;
  BitmapImage72: TBitmapImage;
  BitmapImage73: TBitmapImage;
  BitmapImage74: TBitmapImage;
  BitmapImage75: TBitmapImage;
  BitmapImage76: TBitmapImage;
  BitmapImage77: TBitmapImage;
  BitmapImage78: TBitmapImage;
  Label1: TLabel;
  Label2: TLabel;
  Label3: TLabel;
  RichEditViewer10: TRichEditViewer;
  hl2_universe_Panel: TPanel;
  L1: TLabel;
  Intro_hl2_Label: TLabel;
  RichEditViewer1: TRichEditViewer;
  RichEditViewer3: TRichEditViewer;
  RichEditViewer2: TRichEditViewer;
  RichEditViewer6: TRichEditViewer;
  RichEditViewer7: TRichEditViewer;
  RichEditViewer8: TRichEditViewer;
  RichEditViewer9: TRichEditViewer;
  RichEditViewer11: TRichEditViewer;
  RichEditViewer12: TRichEditViewer;
  RichEditViewer13: TRichEditViewer;
  RichEditViewer14: TRichEditViewer;
  RichEditViewer15: TRichEditViewer;
  RichEditViewer16: TRichEditViewer;
  RichEditViewer17: TRichEditViewer;
  RichEditViewer18: TRichEditViewer;
  RichEditViewer19: TRichEditViewer;
  RichEditViewer20: TRichEditViewer;
  RichEditViewer21: TRichEditViewer;
  RichEditViewer22: TRichEditViewer;
  RichEditViewer23: TRichEditViewer;
  RichEditViewer24: TRichEditViewer;
  RichEditViewer25: TRichEditViewer;
  RichEditViewer26: TRichEditViewer;
  RichEditViewer27: TRichEditViewer;
  RichEditViewer28: TRichEditViewer;
  RichEditViewer29: TRichEditViewer;
  RichEditViewer30: TRichEditViewer;
  RichEditViewer31: TRichEditViewer;
  RichEditViewer32: TRichEditViewer;
  RichEditViewer33: TRichEditViewer;
  RichEditViewer34: TRichEditViewer;
  RichEditViewer35: TRichEditViewer;
  RichEditViewer36: TRichEditViewer;
  RichEditViewer37: TRichEditViewer;
  RichEditViewer38: TRichEditViewer;
  RichEditViewer39: TRichEditViewer;
  RichEditViewer40: TRichEditViewer;
  RichEditViewer41: TRichEditViewer;
  RichEditViewer42: TRichEditViewer;
  RichEditViewer43: TRichEditViewer;
  RichEditViewer44: TRichEditViewer;
  RichEditViewer45: TRichEditViewer;
  RichEditViewer46: TRichEditViewer;
  RichEditViewer47: TRichEditViewer;
  RichEditViewer48: TRichEditViewer;
  RichEditViewer49: TRichEditViewer;
  RichEditViewer50: TRichEditViewer;
  RichEditViewer51: TRichEditViewer;
  RichEditViewer52: TRichEditViewer;
  RichEditViewer53: TRichEditViewer;
  RichEditViewer54: TRichEditViewer;
  RichEditViewer55: TRichEditViewer;
  RichEditViewer56: TRichEditViewer;
  RichEditViewer57: TRichEditViewer;
  RichEditViewer58: TRichEditViewer;
  RichEditViewer59: TRichEditViewer;
  RichEditViewer60: TRichEditViewer;
  RichEditViewer61: TRichEditViewer;
  RichEditViewer62: TRichEditViewer;
  RichEditViewer63: TRichEditViewer;
  RichEditViewer64: TRichEditViewer;
  RichEditViewer65: TRichEditViewer;
  RichEditViewer66: TRichEditViewer;
  RichEditViewer67: TRichEditViewer;
  RichEditViewer68: TRichEditViewer;
  RichEditViewer69: TRichEditViewer;
  RichEditViewer70: TRichEditViewer;
  RichEditViewer71: TRichEditViewer;
  RichEditViewer72: TRichEditViewer;
  RichEditViewer73: TRichEditViewer;
  RichEditViewer74: TRichEditViewer;
  RichEditViewer75: TRichEditViewer;
  RichEditViewer76: TRichEditViewer;
  RichEditViewer77: TRichEditViewer;
  RichEditViewer78: TRichEditViewer;
  RichEditViewer4: TRichEditViewer;
  BitmapImage5: TBitmapImage;
  Trinagle_bmp: TBitmapImage;
  IsCyrillicLabel: TLabel;
  ListBox: TNewListBox;
  hl2_ScrollBox: TScrollBox;
  hl2_screens_Image: TBitmapImage;
  hl2_ep1_ScrollBox: TScrollBox;
  hl2_ep1_screens_Image: TBitmapImage;
  hl2_ep2_ScrollBox: TScrollBox;
  hl2_ep2_screens_Image: TBitmapImage;
  portal_ScrollBox: TScrollBox;
  portal_screens_Image: TBitmapImage;
  ComponentsPage: TWizardPage;
  hl2_MainLable: TLabel;
  ep1_MainLable: TLabel;
  ep2_MainLabel: TLabel;
  BitmapImage4: TBitmapImage;
  PortalC_Image: TBitmapImage;
  hl2_panel: TPanel;
  hl2_CheckBox: TNewCheckBox;
  hl2_borealis_CheckBox: TNewCheckBox;
  hl2_icon_CheckBox: TNewCheckBox;
  hl2_ru_en_RadioButton: TNewRadioButton;
  hl2_en_RadioButton: TNewRadioButton;
  hl2_ru_RadioButton: TNewRadioButton;
  hl2_buka_CheckBox: TNewCheckBox;
  hl2_launch_Edit: TNewEdit;
  hl2_main_CheckBox: TNewCheckBox;
  hl2_ep1_panel: TPanel;
  hl2_ep1_CheckBox: TNewCheckBox;
  hl2_ep1_ru_en_RadioButton: TNewRadioButton;
  hl2_ep1_en_RadioButton: TNewRadioButton;
  hl2_ep1_ru_RadioButton: TNewRadioButton;
  hl2_ep1_Icon_CheckBox: TNewCheckBox;
  ep1_Launch_Edit: TNewEdit;
  ep2_panel: TPanel;
  hl2_ep2_CheckBox: TNewCheckBox;
  hl2_ep2_ru_en_RadioButton: TNewRadioButton;
  hl2_ep2_en_Radiobutton: TNewRadioButton;
  hl2_ep2_ru_RadioButton: TNewRadioButton;
  hl2_ep2_Icon_CheckBox: TNewCheckBox;
  ep2_Launch_Edit: TNewEdit;
  portal_panel: TPanel;
  portal_CheckBox: TNewCheckBox;
  portal_ru_en_RadioButton: TNewRadioButton;
  portal_en_RadioButton: TNewRadioButton;
  portal_ru_RadioButton: TNewRadioButton;
  portal_Icon_CheckBox: TNewCheckBox;
  portal_Launch_Edit: TNewEdit;
  hl2_ep2_main_CheckBox: TNewCheckBox;
  hl2_ep1_main_CheckBox: TNewCheckBox;
  portal_main_CheckBox: TNewCheckBox;
  SpeedBtnPanel: TPanel;
  SpeedBtn: TNewSpeedButton;
  TypeComboBox: TNewComboBox;
  ClearButton: TNewButton;
  SettingPanel: TPanel;
  BitmapImage9: TBitmapImage;


а ниже ещё есть целая пачка :)
(перед компиляцией, когда время придёт, собираюсь перенести всё из этого дубликатора в InitializeWizard) и все переменные по местам (локально/глобально)
А также есть ли разница после написания
так
var
Mr_Valve_Label: TLabel;
Valve_Label: TLabel;

или так (кажется правильнее)

var
Mr_Valve_Label, Valve_Label: TLabel;

Devils Night 09-05-2012 05:45 1912895

El Sanchez, Спасибо! Всё получилось как надо , вот что вышло:
читать дальше »
Код:

// Скрипт 4 кнопки (Запустить|Удалить|Продолжить|Отмена|)
// Частично состоит из авторана El Sanchez (http://forum.oszone.net/member.php?userid=132675) для HL
// Модифицировал скрипт под 4 кнопки: Johny777 (http://forum.oszone.net/member.php?userid=324607)
// Поправил: El Sanchez (http://forum.oszone.net/member.php?userid=132675)

#define AppID "{D8E8ADA9-2E6C-49E7-924B-A32B89C23A24}"
#define AppName "My Program"
#define AppExeName "MyProg.exe"
#define InExe "setup.exe"
#define UnExe "{uninstallexe}"

[Setup]
AppName={#AppName}
AppVerName={#AppName}
DefaultDirName={pf}\{#AppName}
DefaultGroupName={#AppName}
AppId={{#AppID}

[CustomMessages]
english.Uninstall=&Uninstall
english.Run=&Run
english.Proceed=&Proceed
english.Cancel=&Cancel
english.Alreadyinstalled=The program {#AppName} is already installed
Russian.Uninstall=&Удалить
Russian.Run=&Запустить
Russian.Proceed=&Продолжить
Russian.Cancel=&Отмена
Russian.Alreadyinstalled=Программа {#AppName} уже установлена

[Languages]
Name: Russian; MessagesFile: compiler:Languages\Russian.isl
Name: "english"; MessagesFile: "compiler:Languages\English.isl"

[Files]
Source:compiler:Examples\MyProg.exe; DestDir: {app}; Flags: ignoreversion sortfilesbyname

[ Code]
var
  Run_Button: TNewButton;
  Del_Button: TNewButton;
  AppPath, UninsPath: string;
  ResultCode: Integer;

procedure CancelButtonClick(CurPageID: Integer; var Cancel, Confirm: Boolean);
begin
Confirm:= False;
end;

procedure UninstallButtonClick(Sender: TObject);
begin
  Exec(UninsPath, '', '' , SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure RunButtonClick(Sender: TObject);
begin
  Exec(AppPath + '{#AppExeName}', '', '', SW_SHOW, ewNoWait, ResultCode);
  SendMessage(WizardForm.CancelButton.Handle, $00F5, 0, 0);
end;

procedure InitializeWizard;
begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1', 'InstallLocation', AppPath) then
  AppPath := RemoveQuotes(AppPath);
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1', 'UninstallString', UninsPath) then
  UninsPath := RemoveQuotes(UninsPath);
    begin
    { Run_Button }
      Run_Button := TNewButton.Create(WizardForm);
      with Run_Button do
      begin
        Name := 'Run_Button';
        Parent := WizardForm;
        Left := ScaleX(240);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption:= ExpandConstant('{cm:Run}');
        OnClick := @RunButtonClick;
      end;

    { Del_Button }
      Del_Button := TNewButton.Create(WizardForm);
      with Del_Button do
      begin
        Name := 'Del_Button';
        Parent := WizardForm;
        Left := ScaleX(153);
        Top := ScaleY(327);
        Width := ScaleX(75);
        Height := ScaleY(23);
        Caption:= ExpandConstant('{cm:Uninstall}');
        OnClick := @UninstallButtonClick;
      end;

    if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1') then
    MsgBox(ExpandConstant('{cm:Alreadyinstalled}'),mbError,MB_OK);
   
    if FileExists(AppPath + '{#AppExeName}') then
    begin
      Run_Button.Enabled:=true;
    end
    else
      Run_Button.Enabled:=false;
    end;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#AppID}_is1') and (CurPageId=wpWelcome)
  then
    begin
      Run_Button.Visible := True;
      Del_Button.Visible := True;
      WizardForm.NextButton.Caption:= ExpandConstant('{cm:Proceed}');
    end
  else
    begin
      Run_Button.Visible := false;
      Del_Button.Visible := false;
//      WizardForm.Caption := ExpandConstant(SetupMessage(msgButtonNext));
    end;
end;


El Sanchez 09-05-2012 11:34 1912962

Цитата:

Цитата Johny777
Освобождаются ли переменные после инициализации (по окончании работы InitializeWizard) ? »

Johny777, видимо да, раз обратиться к локальной переменной извне нельзя.
Цитата:

Цитата Johny777
А также есть ли разница после написания
так
var
Mr_Valve_Label: TLabel;
Valve_Label: TLabel;
или так (кажется правильнее)
var
Mr_Valve_Label, Valve_Label: TLabel; »

Johny777, а без разницы, простое объявление переменных, но второе предпочтительней, т.к. ведет к краткости кода.

alert30 09-05-2012 12:03 1912976

wertulll, если хочешь вот такой инсталлятор, найди "главного врача" (setup.exe <-> install.exe), распакуй сторонним программом (Universal Extractor) и там найдешь реальный скрипт install_script.iss.

R.i.m.s.k.y. 09-05-2012 12:22 1912988

Цитата:

Цитата alert30
wertulll, если хочешь вот такой инсталлятор, найди "главного врача" (setup.exe <-> install.exe), распакуй сторонним программом (Universal Extractor) и там найдешь реальный скрипт install_script.iss. »

При такой распаковке не будет секции кода, а ведь именно в ней весь цимес, так что ценность распаковки околонулевая

Johny777 09-05-2012 12:30 1912996

Цитата:

Цитата R.i.m.s.k.y.
При такой распаковке не будет секции кода, »

а если на расширенной компилировали, то и о распаковки речи быть не может
wertulll
я ж выложил 2 страницы назад код, где только не хватает прошедшего времени
уверен его реализовать не сложно в отличии от процентов и оставшегося времени
используй его
в шапке есть отображение размера файла
ещё можно мемо добавить со списком извлекаемых файлов
будет лучше чем на скрине

habib2302 10-05-2012 14:01 1913415

доброе время суток.короче.я хочу сделать установочник игры,а игра сама весить 1.5 гб.так вот,как сделать так чтобы был .exe и сама игра и доп софт в .bin файлах

R.i.m.s.k.y. 10-05-2012 14:13 1913422

habib2302, да точно так же как и саму прогу
примеров в шапке тьма

habib2302 10-05-2012 14:26 1913427

Цитата:

Цитата R.i.m.s.k.y.
да точно так же как и саму прогу
примеров в шапке тьма »

так как сделать?

R.i.m.s.k.y. 10-05-2012 14:29 1913430

habib2302, если с Инно на "вы и шепотом" - используй InnoIDE

habib2302 10-05-2012 14:32 1913431

Цитата:

Цитата R.i.m.s.k.y.
если с Инно на "вы и шепотом" - используй InnoIDE »

это именно в рразделение смотреть надо

R.i.m.s.k.y. 10-05-2012 14:39 1913436

habib2302, ептыть, тебе разделить? тогда freearc
я с ним не работаю

alert30 10-05-2012 17:33 1913553

habib2302, раз хочешь проБИНичить, галочи "Использовать загрузчик". А потом разбирайся.

Эх, если было бы влепено в шапке "Как разделить гиговые файлы на BIN", то я бы кричал на ура!

Johny777 10-05-2012 18:18 1913570

Цитата:

Цитата alert30
"Как разделить гиговые файлы на BIN" »

Не улавливаю смысл, если честно
поподробнее скажи!

alert30 10-05-2012 18:22 1913571

Johny777, каждые репакеры перепаковывают 6 гиговую папку на каждые 2 Гб (включая опцию "Загрузчик") типа: setup-1.bin, setup-2.bin, setup-3.bin и т.д. А setup.exe это просто генерация скриптов и распаковки файлов. Вот просто бы захотелось вписывать шапку для новичков.

Devils Night 10-05-2012 19:15 1913595

Цитата:

Цитата habib2302
,как сделать так чтобы был .exe и сама игра и доп софт в .bin файлах »

[Setup]
DiskSpanning=true
DiskSliceSize=2000000
Этого я думаю хватит.

R.i.m.s.k.y. 10-05-2012 19:16 1913596

Devils Night, я так понял что ему нужно чтобы игра была в одних бинах, а допсофт - в других
Это уже через исдоне/фриарк

Devils Night 10-05-2012 19:42 1913613

Цитата:

Цитата R.i.m.s.k.y.
ак понял что ему нужно чтобы игра была в одних бинах, а допсофт - в других »

Значит просто он не в тему, исдон и фриарк здесь не обсуждают, а я ему дал ответ как раз по теме.

Johny777 10-05-2012 19:44 1913614

Цитата:

Цитата Devils Night
чтобы был .exe и сама игра и доп софт в .bin файлах »

а что
я понял
экзешник, и .bin файлы
доп софт извлекается вместе с игрой (только непонятно куда. В темп или в директорию установки. Если последнее, то должен ли он удалиться после установки) и устанавливается оттуда
как в лиц играх для стима. Там тоже доп. -е лежит вместе с игрой и перед первым запуском устанавливается из директории установки
Это не сложно
даже в код лезть не надо
в Files(папке/файлу) и в RUN присвоить одну и туже задачу или компонент
и папке в Files с тем же директом приписать (опционально) флаг deleteafterinstall
:)
читать дальше »
Код:

[Setup]
AppName=Name
AppVerName=Name
DefaultDirName={pf}\Name
compression=none

[Files]
Source: DirectX\*; DestDir: {app}\DirectX; Flags: ignoreversion recursesubdirs createallsubdirs; Tasks: direct_x;

[Tasks]
Name: direct_x; Description: установть/обновить DirectX;

[Run]
Filename: {app}\DirectX\DXSETUP.exe; Parameters: /silent; WorkingDir: {app}\DirectX; StatusMsg: установка директа; Flags: waituntilterminated; Tasks: direct_x;


leshcat 12-05-2012 01:19 1914322

Парни, подскажите:

Если выбрана компонента, хочу добавить только ключ в реестр (HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers\TdrLevel DWORD 0 ) - больше ничего. Как это реализовать?

Johny777 12-05-2012 01:36 1914325

leshcat,
ты можешь присваивать строке в любой секции (кроме секций [Types] [CustomMessages] [Messages] [Setup]) компонент, язык и задачу или всё сразу
при активном английском задача или секция файлов или та же строка для записи в реестр не будет задействована если ей/им присвоен ... ;Language: russian
прмер-ответ к твоему вопросу
читать дальше »
Код:

[Setup]
AppName=Name
AppVerName=Name
DefaultDirName={pf}\Name

[Components]
Name: TheBestComponentsName; Description: The Elder Scrolls V - Skyrim; Types: full custom; Flags: disablenouninstallwarning checkablealone

[Registry]
Root: HKCU; Subkey: "Software\Valve"; ValueType: String; Flags: uninsdeletevalue uninsdeletekeyifempty; Components: TheBestComponentsName


leshcat 12-05-2012 01:51 1914331

Johny777,

Как всегда, все гениальное - просто. Большое вам спасибо за оперативность :)

LinkOFF 12-05-2012 20:28 1914764

Здравствуйте. Знаю что вопрос не по теме, но как сжимать freearc-архивы с выделением памяти 4гб?У меня 16гб, а выделяется только 2.
Примерно так:

Devils Night 12-05-2012 23:35 1914864

Цитата:

Цитата LinkOFF
Знаю что вопрос не по теме, но как сжимать freearc-архивы с выделением памяти 4гб? »

Да, видимо кому-то всё таки придётся создать тему на этом форуме, а то что-то прям зачастили сюда задавать вопросы про пережатие, компрессию и.т.д.

LinkOFF 13-05-2012 00:27 1914896

Цитата:

Цитата Devils Night
Да, видимо кому-то всё таки придётся создать тему на этом форуме, а то что-то прям зачастили сюда задавать вопросы про пережатие, компрессию и.т.д. »

Да, было бы хорошо.

volk1234 13-05-2012 12:41 1915042

А надо ли ? Из за пары вопросов по пережатию?

Ivan_009 13-05-2012 13:46 1915067

Как сделать,чтобы в этом окне вместо времени просто было написано установка... :unsure:

alert30 13-05-2012 14:25 1915089

Ivan_009, скриншот полностью, таймеры наляпано в секции кода.

Ivan_009 13-05-2012 14:58 1915106

Возможно ли вместо точки поставить {app} :unsure:

Gnom_aka_Lexander 13-05-2012 15:06 1915112

Цитата:

Цитата volk1234
А надо ли ? Из за пары вопросов по пережатию? »

Скажу так. Поскольку тут я не видел человека, действительно владеющего темой настолько, что был-бы способен консультировать людей на должном уровне - не нужно это. На борде тема скорее мертва, чем жива, тут тоже быстро загнется. но это только мое мнение, доводы приводить не буду, дабы не разматывать портянку на половину страницы.

Цитата:

Цитата Ivan_009
Возможно ли вместо точки поставить »

в кавычки попробуй убрать, очень часто помогает.

Ivan_009 13-05-2012 15:22 1915122

Так: ValueData: {.}\frontline.mbcfg{break}{break}; :drug:

Gnom_aka_Lexander 13-05-2012 15:31 1915126

Ivan_009, а так: ValueData: ".\frontline.mbcfg" не катит?
Стоп.
Цитата:

Цитата Ivan_009
Возможно ли вместо точки поставить {app} »

Конечно.
"{app}\frontline.mbcfg"

bugmenotagain 13-05-2012 16:21 1915157

Я перепаковать хочу программу, и чтобы ее файлы находились в установщике.exe а по умолчанию они в Bin файл суются и лежат рядом.

Johny777 13-05-2012 16:23 1915159

bugmenotagain,
тогда
[Setup]
DiskSpanning=false
и тебе придётся уместить всю свою программу в 2 гига

bugmenotagain 13-05-2012 16:28 1915163

Johny777, программа весит ~10мегабайт. пожать до 2 мегабайт.

bugmenotagain 13-05-2012 18:20 1915215

Inno*Setup*Preprocessor
Please*specify*whether*Inno*Setup*Preprocessor*should*be*used.




(ISPP)*and*can*therefore*use*#define*compiler*directives*to*simplify*your*script.*
Although*this*is*not*necessary,*it*will*make*it*easier*to*manually*change*the*script*later.

Do*you*want*the*Inno*Setup*Script*Wizard*to*use*#define*compiler*directives?

Yes,*use*#define*compiler*directives



оставить галочку или убрать?

Johny777 13-05-2012 18:25 1915220

Цитата:

Цитата bugmenotagain
программа весит ~10мегабайт. пожать до 2 мегабайт. »

это вопрос или цель?
Цитата:

Цитата bugmenotagain
Inno*Setup*Preprocessor ... оставить галочку или убрать? »

оставь
лишним не будет

bugmenotagain 13-05-2012 18:37 1915229

Johny777, к чему вы сказали что 2 гига будет весить программа? кстати, раньше файл bin создавался. а теперь все в exe. Я ничего не менял в настройках.

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

AppVersion как оставить пустым?

R.i.m.s.k.y. 13-05-2012 18:43 1915234

Цитата:

Цитата bugmenotagain
раньше файл bin создавался. а теперь все в exe. »

от этого мир перевернулся?
Цитата:

Цитата bugmenotagain
где можно найти подробный мануал где показано, как изменить фон в установщике »

в шапке
Цитата:

Цитата bugmenotagain
ассоциацию файлов сделать »

в ИсТул в разделе реестра - ПКМ - создать связи
Цитата:

Цитата bugmenotagain
описание изменить, »

смотря где, по обстоятельствам
Цитата:

Цитата bugmenotagain
чекбоксы на одну страницу поместить. »

в шапке
Цитата:

Цитата bugmenotagain
ще слышал из реестра надо откапывать ключ »

RegShot

Цитата:

Цитата bugmenotagain
AppVersion как оставить пустым? »

если не задан AppVerName то AppVersion является обязательным

bugmenotagain 13-05-2012 19:07 1915244

Цитата:

Цитата R.i.m.s.k.y.
RegShot »

RegShot - маленькая утилита, позволяющая быстро сделать снимки рееста и сравнить их. Все изменения в реестре можно сохранить в файле. Удобно, если вы хотите знать, какие изменения в реестр вносить новая программа при инсталяции . как она связана с нами?

Я могу кому нибудь позадавать глупые вопросы в личку? тут не удобно

Johny777 13-05-2012 19:12 1915249

Цитата:

Цитата bugmenotagain
к чему вы сказали что 2 гига будет весить программа? »

к тому что ты хотел один экзешник без бин файлов
для этого я дал тебе настройку, но с этой настройкой размер инсталла-экзешника в сжатом виде не должен превышать двух гигов, иначе вылетит с ошибкой при компиляции
откуда ж я должен был знать, что твоя программа всего 10 метров?
Вот и предупредил заранее

bugmenotagain 13-05-2012 19:21 1915256

Johny777, там автоматом ставится в exe. а если будет 20 гигов она разделится на составные части?

Johny777 13-05-2012 19:41 1915267

bugmenotagain,
почему бы тебе не прочитать русскую справку http://sendfile.su/570136

bugmenotagain 13-05-2012 20:37 1915289

ну хорошо. а как создать отдельную страницу и там поставить радиофлажек установка / распаковка. в установщике лежит еще и portable версия

Johny777 13-05-2012 21:20 1915317

Цитата:

Цитата bugmenotagain
как создать отдельную страницу »

очень просто
скачай расширенную версию инно http://forum.oszone.net/showthread.p...99#post1201499 и установи ANSI версию
добавь страницу вот таким макаром

Цитата:

Цитата bugmenotagain
и там поставить радиофлажек установка / распаковка »

там же в дизайнере добвляешь чебоксы и прочее
насчёт того, что должно происходить и когда если он (чекбокс) отмечен нужен с твоей строны самый конкретный вопрос на основе предоставленного тобой скрипта или куска кода
тк "установка / распаковка" звучит немного размыто
А на уроках телепатии я на последней парте в морской бой играл :)

bugmenotagain 13-05-2012 21:39 1915336

что такое изменения Enviroment в Inno Script Generator

Цитата:

Цитата Johny777
ANSI »

чем отличается анси от юникода? у меня юникод.

Цитата:

Цитата Johny777
А на уроках телепатии я на последней парте в морской бой играл »

Смотри флаг стоит на позиции "Установить" - устанавливается обычная программа со всеми прибамбасами.
если позиция флага на "Распаковать" - то распаковывается обыкновенная portable без всяких изменений в реестре.

а где взять картинки перепаковынной мной программы? именно в bmp.

Johny777 13-05-2012 21:50 1915349

Цитата:

Цитата bugmenotagain
Смотри флаг стоит на позиции "Установить" - устанавливается обычная программа со всеми прибамбасами.
если позиция флага на "Распаковать" - то распаковывается обыкновенная portable без всяких изменений в реестре. »

напрашивается вопрос
зачем страница?
ведь лезть в код прийдётся
реализуй через компоненты
Цитата:

Цитата bugmenotagain
а где взять картинки перепаковынной мной программы? именно в bmp. »

странный вопрос
в интернете
гугл тебе поможет
а в фотошопе в 32 битном бмп сохраняешь
или в пэинте (не советую) в 24 битном
Цитата:

Цитата bugmenotagain
чем отличается анси от юникода? »

дружелюбием например

bugmenotagain 13-05-2012 21:54 1915354

вот такого вида хочу добиться
img

Johny777 13-05-2012 22:39 1915386

bugmenotagain,
вот :)
разбирай

читать дальше »
Код:

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


[Components]
Name: A; Description: Выбери меня; Flags: exclusive
Name: B; Description: нет меня; Flags: exclusive
Name: C; Description: меня не надо; Flags: exclusive
Name: D; Description: А мне не хочется быть компонентом; Flags: exclusive


[RUN]
Filename: http://forum.oszone.net/thread-218969-192.html; Flags: shellexec nowait; Check: Visit_Page


[  Code]
var
  Visit_CheckBox: TNewCheckBox;
 
function Visit_Page: Boolean;
begin
    Result:=Visit_CheckBox.Checked;
end;

procedure InitializeWizard();
begin
  with WizardForm do
    begin
      InnerNotebook.SetBounds(ScaleX(0), Bevel1.Top + Bevel1.Height, OuterNotebook.Width, OuterNotebook.Height - MainPanel.Height);
      WizardForm.TypesCombo.Visible := False;
      Color := clWindow;
      ComponentsDiskSpaceLabel.Visible := False;
     
      with ComponentsList do
      begin
        Left := ScaleX(20);
        Top := ScaleY(50);
        BorderStyle := bsNone;
        Color := clBtnFace;
        MinItemHeight := 23;
        Offset := 5;
        ItemHeightFixed := True;
      end;
       
      with SelectComponentsLabel do
      begin
        Caption := 'Пожалуйса слелайте выбор:';
        Left := ComponentsList.Left;
        Top := ComponentsList.Top - ScaleY(20);
        AutoSize:= True;
      end;
     
    end;
   
  Visit_CheckBox := TNewCheckBox.Create(WizardForm);
  with Visit_CheckBox do
  begin
    Name := 'Visit_CheckBox';
    Parent := WizardForm.SelectComponentsPage;
    SetBounds(WizardForm.ComponentsList.Left, WizardForm.ComponentsList.Top + WizardForm.ComponentsList.Height + ScaleY(20), ScaleX(161), ScaleY(17))
    Caption := 'посетить страницу автора';
  end;
end;



картинки сам вставь

bugmenotagain 13-05-2012 22:42 1915388

Johny777, ищу то не знаю что. вы сказали что через компоненты, но на скрине нет компонентов. радиопереключатели.

LinkOFF 13-05-2012 23:29 1915422

Здравствуйте! Прошу пожалуйста сделайте мне распаковку архивов в зависимости от выбранных компонентов.Очень прошу!Заранее всем благодарен.Вот архив http://rghost.ru/download/38069694/a...0Space%202.rar

Devils Night 14-05-2012 03:06 1915466

Цитата:

Цитата LinkOFF
Здравствуйте! Прошу пожалуйста сделайте мне распаковку архивов в зависимости от выбранных компонентов.Очень прошу!Заранее всем благодарен.Вот архив http://rghost.ru/download/38069694/a...0Space%202.rar »

Может всё таки сюда, а!?

bugmenotagain 14-05-2012 13:07 1915632

как изменить иконку и названия утилиты удаления?

обязательно ключи реестра куда то сохранять?

YURSHAT 14-05-2012 13:57 1915665

Цитата:

Цитата bugmenotagain
как изменить названия утилиты удаления? »

Код:

[Setup]
UninstallDisplayName=My Program

Цитата:

Цитата bugmenotagain
как изменить иконку утилиты удаления? »

Иконку деинсталлятора изменить нельзя...

bugmenotagain 14-05-2012 14:00 1915667

ChangesAssociations для ассоциаций и удаления их, верно?

Цитата:

Цитата YURSHAT
Иконку деинсталлятора изменить нельзя... »

ну да, конечно нельзя, сколько качаю репаков программ и игр, у главного exe своя иконка, а для удаления своя.

valyok666 14-05-2012 14:09 1915677

bugmenotagain,
UninstallIconFile=твояиконка.ico

R.i.m.s.k.y. 14-05-2012 14:18 1915686

Цитата:

Цитата bugmenotagain
ChangesAssociations для ассоциаций и удаления их, верно? »

нет, не верно
Читай справку, ChangesAssociations говорит винде обновить ассоциации файлов

bugmenotagain 14-05-2012 14:48 1915701

для чего нужны ключи из реестра? Я без них все сделал и программа устанавливается и работает.

R.i.m.s.k.y. 14-05-2012 14:52 1915703

bugmenotagain, а) для самой программы чтобы могла находить допкомпоненты б) для патчей
Ключи жрать не просят - делай, ты ж не автор чтобы рассуждать "нужно / не нужно"

bugmenotagain 14-05-2012 14:54 1915705

R.i.m.s.k.y.,
Цитата:

Цитата R.i.m.s.k.y.
оформление в инно - пустая трата времени, головняка много, а толку мало »

на что намек?

R.i.m.s.k.y. 14-05-2012 15:08 1915713

Цитата:

Цитата bugmenotagain
на что намек? »

1. глючит часто, доказательства - на руторе в раздачах игр
2. упор на оформление, нет бы вместо свистулек добавить проверку уже установленных версий компонентов, заместо этого ставят не спросясь и не разобравшись, к примеру, vcredist
3. не ждите от меня ответов про формы, я с ними на "Вы и шепотом" :)

bugmenotagain 14-05-2012 15:21 1915719

R.i.m.s.k.y., и какой же лучший установшик? nsis? у него нет ни примеров ни чего. все руками надо прописывать. в каше пути прописывать

R.i.m.s.k.y. 14-05-2012 15:26 1915724

bugmenotagain, из совсем простых есть smart installer
Но любую прогу делает коммунити
Если хочешь на инно начать - попробуй с InnoIde, у него всякие упрощалки есть

bugmenotagain 14-05-2012 15:27 1915726

R.i.m.s.k.y., nsis самый лучший же кричат.

мне все равно не понятно. в справках пишут заумно. и вообще то что мне нужно найти не могу. хотя бы сделать простой выбор установить программу / распаковать portable как делают сейчас многие известные репакеры. весь вечер и сегодня полдня убил.

R.i.m.s.k.y. 14-05-2012 15:31 1915731

bugmenotagain, холивар детектед?
к чему душа лежит тем и пользуйся, как я уже сказал
Цитата:

Цитата R.i.m.s.k.y.
любую прогу делает коммунити »

bugmenotagain,
1. за правку сообщений после ответа на него нужно закармливать конфетами пока злодей не окочурится от инсульта :)
2. ну дык спрашивай чего непонятно, только конкретнее, общие вопросы "как сделать репаг" имею ровно один ответ "берешь и делаешь"
Самый лучший вопрос вида: вот скрипт, делаю так получается вот такая ошибка

Твоя прошлая картинка с раром делается через Components, только значка рядом не будет (или будет но это уже задача со звездочкой)

Johny777 14-05-2012 16:06 1915755

Цитата:

Цитата bugmenotagain
мне все равно не понятно. в справках пишут заумно. и вообще то что мне нужно найти не могу. хотя бы сделать простой выбор установить программу / распаковать portable как делают сейчас многие известные репакеры. весь вечер и сегодня полдня убил. »

я пример кому сделал?
http://forum.oszone.net/post-1915386-1915.html
А?
ты мимо прошёл и даже не глянул!
там концепт того, что ты хочешь
с твоего скрина делал
разбери его
пойми
Цитата:

Цитата bugmenotagain
nsis самый лучший же кричат »

это относительный вопрос
они все хороши по своему :)

alert30 14-05-2012 16:06 1915756

bugmenotagain, сколько постов и вопросов написали.
Зачем написать столько простых и "чайничных" вопросов? Бери учебник по руководству Inno Setup и учи.
Каждый RePack'ер должен знать как бы язык программирования, а раз ты несколько скриптов делаешь без ошибок, продолжай в том же духе.

YURSHAT 14-05-2012 16:17 1915766

Цитата:

Цитата valyok666
UninstallIconFile »

хм, раньше вроде эта опция не изменяла иконку. bugmenotagain, пардон :blush2:

MeХanik 14-05-2012 16:28 1915769

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

alert30 14-05-2012 16:34 1915775

MeХanik, размер инсталлятора - в расширенном Inno Setup. А музыка - в Inno Setup GameScript Generator.

bugmenotagain 14-05-2012 18:13 1915847

после установки программы через ее оригинальный установщик, при первом запуске программы открывается окно About. как мне также сделать в своем установщике?

MeХanik 14-05-2012 18:51 1915859

Скажите как сделать чтобы при установке файлы извлекались из архива .arc
Объясните что куда прописывать?

Devils Night 14-05-2012 19:22 1915878

Цитата:

Цитата MeХanik
Скажите как сделать чтобы при установке файлы извлекались из архива .arc
Объясните что куда прописывать? »

Ну начинается день золотой, шуруй сюда

Gnom_aka_Lexander 14-05-2012 19:45 1915890

Цитата:

Цитата YURSHAT
хм, раньше вроде эта опция не изменяла иконку. »

она и сейчас не изменяет - выясняли недавно, UninstallIconFile - это плюшка расширенной версии.

bugmenotagain 14-05-2012 19:58 1915900

чекбокс как сделать который в программе русский язык выставит? (WinDjView)

Gnom_aka_Lexander 14-05-2012 20:00 1915903

bugmenotagain, создаешь TNewCheckBox и булевую функцию, которая даст ответ в зависимости от состояния чекбокса. а проще - создай компонент или задачу - в InnoIDE - как два пальца - нужно совсем уж ленивым быть, чтоб не справиться.

bugmenotagain 14-05-2012 20:32 1915920

по теме
как убрать #define MyAppVersion?
img
[IMG][/IMG]
чтоб не было слова "версия"

Gnom_aka_Lexander 14-05-2012 20:35 1915922

Цитата:

Цитата bugmenotagain
как убрать #define MyAppVersion? »

скрипт покажи. а то болею я , а когда болею - с телепатией сложности.
И да, про IsTool - начиная с версии Inno 5.3.9, вроде, она уже частично не соответствует сабжу, так сказать. Есть более актуальные IDE - InnoIDE от Graham Murt и Inno Script Studio от Kymoto Solutions. с русиками там тоже нет нужды помогать - Kymoto пошел навстречу и внедрил русик в дистрибутив, а Graham Murt прекратил работу над InnoIDE, что печально, конечно, но русик к последней версии так-же нет нужды по десять раз выкладывать

bugmenotagain 14-05-2012 20:39 1915925

как убрать тире в загаловке

[IMG][/IMG]

Gnom_aka_Lexander 14-05-2012 20:46 1915931

Цитата:

Цитата bugmenotagain
как убрать тире в загаловке »

отредактировать файлы сообщений.

bugmenotagain 14-05-2012 20:48 1915932

Цитата:

Цитата Лександер
отредактировать »

да Я бы сам догадался что надо их редактировать, где их искать, не подскажите?

Gnom_aka_Lexander 14-05-2012 20:50 1915935

очень логично - заглядываешь в папку с инно и видишь там очень логично названную папку Languages, в ней файлы с расширением *.lng - это и есть подключаемые файлы сообщений. очень удобно редактировать их с помощью самой Inno Setup или Notepad++

bugmenotagain 14-05-2012 20:58 1915937


как тут в названии папки убрать цифры версии? а в описании их оставить?


Gnom_aka_Lexander 14-05-2012 21:02 1915938

bugmenotagain, убрать эти цифры из названия программы.

bugmenotagain 14-05-2012 21:05 1915940

Цитата:

Цитата Лександер
логично названную папку Languages, в ней файлы с расширением *.lng »

isl там. и будьте добры, скажите где там тире находится?

R.i.m.s.k.y. 14-05-2012 21:07 1915942

bugmenotagain
Цитата:

Цитата Лександер
очень логично - заглядываешь в папку с инно и видишь там очень логично названную папку Languages, в ней файлы с расширением *.lng - это и есть подключаемые файлы сообщений. очень удобно редактировать их с помощью самой Inno Setup или Notepad++ »

Это очень нехороший совет
Первая часть правильная, в файле russian.lng ищем нужный текст и подсматриваем имя переменной, а потом в инно в секции [Messages] переопределяем ее
Код:

[Messages]
BeveledLabel=            SVP-Team.com (C) 2008-2012
russian.WelcomeLabel2=Программа установит [name/ver] на Ваш компьютер.%n%nРекомендуется закрыть все прочие приложения и антивирусы перед тем, как продолжить.%n%nНа версиях операционных систем, отличающихся от оригинальных образов Microsoft, работоспособность SmoothVideo Project не гарантируется.
english.WelcomeLabel2=This will install [name/ver] on your computer.%n%nPlease close all other applications and stop antivirus software before continue.


bugmenotagain 14-05-2012 21:11 1915944

Цитата:

Цитата Лександер
убрать эти цифры из названия программы. »

Логично. Но
imgs

вот так получается у меня





а мне надо вот так






Цитата:

Цитата R.i.m.s.k.y.
Первая часть правильная, в файле russian.lng ищем нужный текст и подсматриваем имя переменной, а потом в инно в секции [Messages] переопределяем ее »

lng не появляется. в чем проблема?

Sotonisto 14-05-2012 21:20 1915949

Всем доброго времени суток! Использую скрипт c определением свободного/необходимого места на диске:
читать дальше »
Код:

procedure GetFreeSpaceCaption(Sender: TObject);
var
  Path: String;
begin
  Path := ExtractFileDrive(WizardForm.DirEdit.Text);
  GetSpaceOnDisk(Path, True, FreeMB, TotalMB);

if FreeMB > 1024 then
  FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ')+ FloatToStr(round(FreeMB/1024*100)/100) + ' Гб' else
  FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ')+ IntToStr(FreeMB)+ ' Мб';
 
if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled:= False else
  WizardForm.NextButton.Enabled:= True; end;
 
procedure GetNeedSpaceCaptionFlashing(h: Longword; msg: Longword; idevent: Longword; dwTime: Longword);
begin
    if FreeSpaceLabel.Font.Color=$FFFFFF then FreeSpaceLabel.Font.Color:=$0000FF else FreeSpaceLabel.Font.Color:=$FFFFFF;
end;

procedure GetNeedSpaceCaption;
begin
if NeedSize > 1024 then
  NeedSpaceLabel.Caption:= ExpandConstant('{cm:NeedSpace} ') + FloatToStr(round(NeedSize/1024*100)/100) + ' Гб'  else
  NeedSpaceLabel.Caption:= ExpandConstant('{cm:NeedSpace} ') + IntToStr(NeedSize) + ' Мб'; 

if (FreeMB<NeedSize) then
  SetTimer(WizardForm.Handle,WFDiskTimerID,1000,WrapTimerProc(@GetNeedSpaceCaptionFlashing,4));
end;

procedure CurPageChanged3(CurPageID: Integer);
begin
if CurPageID=wpSelectDir then begin
  GetNeedSpaceCaption;

if FreeMB < NeedSize then
  WizardForm.NextButton.Enabled:=False
  end;
end;


Все работает, но не знаю что делать с этим:

Как убрать нули?

R.i.m.s.k.y. 14-05-2012 21:20 1915950

bugmenotagain,
1. lng не появляется или нету? Учись правильно подставлять в предложения слова в соответствии со значением, принятым в данной местности
2. тебе нужен russian.ISL, ну а дальше как написано выше, ищешь свой текст и переопределяешь его в секции [Messages]

Sotonisto,
еще бы кусок кода который рисует эти нули и необходимое место, так непонятно (мне по крайней мере)

bugmenotagain 14-05-2012 21:22 1915952

R.i.m.s.k.y., мне править где? в ing или isl ?

R.i.m.s.k.y. 14-05-2012 21:23 1915953

bugmenotagain, перечитай еще раз что я написал
смотришь в isl и пишешь в Messages
Конкретно твой случай
Код:

[Messages]
SelectDirLabel3=...
SelectDirBrowseLabel=...


bugmenotagain 14-05-2012 21:26 1915955

R.i.m.s.k.y., спасибо. там банально просто. тире не заметил сразу.
а что с версиями? выше картинки привел

Цитата:

Цитата R.i.m.s.k.y.
Код:
[Messages]
SelectDirLabel3=...
SelectDirBrowseLabel=... »

ну вообще то там проще

Код:

[Messages] 
; *** Application titles
SetupAppTitle=Установка
SetupWindowTitle=Установка %1
UninstallAppTitle=Деинсталляция
UninstallAppFullTitle=Деинсталляция %1

перед %1 тире было. Я удалил и теперь без тире заголовок.

R.i.m.s.k.y. 14-05-2012 21:34 1915962

Цитата:

Цитата bugmenotagain
ну вообще то там проще »

если у тебя несколько инсталлеров ты под каждый проект будешь каждый раз править russian.isl?
Или еще хужей, исправишь файл, забудешь и эти исправления пойдут в следующий проект

bugmenotagain 14-05-2012 21:45 1915965

Цитата:

Цитата R.i.m.s.k.y.
russian.isl »

он же один

Sotonisto 14-05-2012 21:52 1915967

R.i.m.s.k.y., это скрипт инсталлятора CoD:BO (не помню откуда скачал). Вот все файлы, которые используются.

Gnom_aka_Lexander 14-05-2012 22:01 1915973

Sotonisto, на юникоде компилишь?

91892823 14-05-2012 22:25 1915989

Здравствуйте! Долго пытался найти ответ на свои вопросы, но, к сожалению, мне это не удалось, а посему пишу здесь.
Имеются два портабельных фоошопа (64/32бит).
Вот мой скрипт
читать дальше »



[Setup]
; Примечание: Значение AppId идентифицирует это приложение.
; Не используйте одно и тоже значение в разных установках.
; (Для генерации значения GUID, нажмите Инструменты | Генерация GUID.)
AppId={{3562ED3D-276F-4466-9D11-F327086006B5}
AppName=PS
AppVersion=13.0
;AppVerName=PS 13.0
DefaultDirName={pf}\PS32
DisableDirPage=yes
DefaultGroupName=PS
DisableProgramGroupPage=yes
OutputDir=E:\ТемР\4556
OutputBaseFilename=setup
SetupIconFile=E:\44к.ico
Compression=lzma
SolidCompression=yes

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

[Files]
Source: "C:\Program Files\Adobe Photoshop CS6 (x32)\*"; DestDir: {app}; Flags: ignoreversion
Source: "C:\Program Files\Adobe Photoshop CS6 (x64)\*"; DestDir: {app}; Flags: ignoreversion

[Icons]
Name: {commondesktop}\Ps; Filename: {app}\PhotoshopCS6Portable.exe; WorkingDir: {app}; Check: not IsWin64
Name: {commondesktop}\Ps; Filename: {app}\Photoshopx64Portable.exe; WorkingDir: {app}; Check: IsWin64



Задача:
1. Установка без вывода любых окон, кроме полоски процесса распаковки.
2. Автоматическое определение битности системы, и, соответственно, установка нужного.
Заранее благодарю.

Gnom_aka_Lexander 14-05-2012 23:00 1916007

91892823, Так, может?
читать дальше »

Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[Files]
Source: "C:\Program Files\Adobe Photoshop CS6 (x32)\*"; DestDir: {app}; Flags: ignoreversion; Check: not IsWin64
Source: "C:\Program Files\Adobe Photoshop CS6 (x64)\*"; DestDir: {app}; Flags: ignoreversion; Check: IsWin64

[Icons]
Name: {commondesktop}\Ps; Filename: {app}\PhotoshopCS6Portable.exe; WorkingDir: {app}; Check: not IsWin64
Name: {commondesktop}\Ps; Filename: {app}\Photoshopx64Portable.exe; WorkingDir: {app}; Check: IsWin64

[*code] {тут нужно убрать звездочку}
function ShouldSkipPage(PageID: Integer): Boolean;
begin
  Result:=true;//  просто пропускаем все страницыю Останется страница готовности - ее просто так не скрыть.
end;

procedure WizardFormShow(Sender: TObject);
begin
  WizardForm.NextButton.OnClick(nil); // нажимает на кнопку далее, в момент показа окна инсталла.
end;

procedure InitializeWizard();
begin
  with WizardForm do
  begin
    Show; //  без этой строчки будет ошибка при вызове OnShow.
    OnShow := @WizardFormShow;
  end;
end;


Sotonisto 14-05-2012 23:49 1916033

Лександер, без понятия, но вроде бы да :) Если это имеет большое значение - могу установить Ansi.
P.S.: А в чем разница между Unicode и Ansi версиями?

Devils Night 15-05-2012 00:05 1916042

91892823, И ещё, если уж делаешь портейбл, то в секцию [Setup] добавь строку
Код:

Uninstallable=false
ну или же
Код:

CreateUninstallRegKey=false
UpdateUninstallLogAppName=false


91892823 15-05-2012 00:10 1916043

Лександер, 1. Установка без вывода любых окон, кроме полоски процесса распаковки. - задача, можно сказать, выполнена.
А вот строки..
[Files]
Source: "C:\Program Files\Adobe Photoshop CS6 (x32)\*"; DestDir: {app}; Flags: ignoreversion; Check: not IsWin64
Source: "C:\Program Files\Adobe Photoshop CS6 (x64)\*"; DestDir: {app}; Flags: ignoreversion; Check: IsWin64
не подходят, потому что во время компиляции распознается битность (у меня 32) и 64 не компилируется в инталлятор..
Вроде так.. И подкаталоги (C:\Program Files\Adobe Photoshop CS6 (x32)\App" и "C:\Program Files\Adobe Photoshop CS6 (x64)\App") тоже не компилируются..

Devils Night 15-05-2012 00:25 1916046

Цитата:

Цитата 91892823
не подходят, потому что во время компиляции распознается битность (у меня 32) и 64 не компилируется в инталлятор.. »

У меня тоже 32 бита и всё компилируется.
1. ты уверен что для 32 битной находится в C:\Program Files\Adobe Photoshop CS6 (x32) а для 64 битной в C:\Program Files\Adobe Photoshop CS6 (x64)?
2. Может лучше засунуть скрипт для надёжности непосредственно в Program Files, и изменить пути на такие:
Код:

Source: Adobe Photoshop CS6 (x32)\*; DestDir: {app}; Flags: ignoreversion; Check: not IsWin64
Source: Adobe Photoshop CS6 (x64)\*; DestDir: {app}; Flags: ignoreversion; Check: IsWin64

?
Да и учти, при установке у тебя распакуется только для 32 бита.
Для проверки, мол запаковались ли файлы для 32 бита и/или для 64 бита, сначала скомпиль как есть, переименуй инсталл, а потом по очереди закомментируй по строке, сначала 32
Код:

[Files]
;Source: Adobe Photoshop CS6 (x32)\*; DestDir: {app}; Flags: ignoreversion; Check: not IsWin64
Source: Adobe Photoshop CS6 (x64)\*; DestDir: {app}; Flags: ignoreversion; Check: IsWin64

, а потом 64
Код:

[Files]
Source: Adobe Photoshop CS6 (x32)\*; DestDir: {app}; Flags: ignoreversion; Check: not IsWin64
;Source: Adobe Photoshop CS6 (x64)\*; DestDir: {app}; Flags: ignoreversion; Check: IsWin64

и посмотри размеры инсталлятора.

91892823 15-05-2012 00:43 1916052

Devils Night,

1. ты уверен что для 32 битной находится в C:\Program Files\Adobe Photoshop CS6 (x32) а для 64 битной в C:\Program Files\Adobe Photoshop CS6 (x64)? - Да, это точно.
2. Может лучше засунуть скрипт для надёжности непосредственно в Program Files, и изменить пути на такие: - Так и сделал, но результат тот же - 64х(520 мб) и 32х(470 мб) в итог компилируются лишь ехешники.. При установке вроде все норм, выбирается нужный. Быть может, проблема в том, что директория App и там, и там?

Devils Night 15-05-2012 01:00 1916062

Флаги добавь Flags: recursesubdirs createallsubdirs
;recursesubdirs - Обрабатывать подкаталоги
;createallsubdirs - Создавать все подкаталоги
т.е:
Код:

[Files]
Source: Adobe Photoshop CS6 (x32)\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Check: not IsWin64
Source: Adobe Photoshop CS6 (x64)\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs; Check: IsWin64


91892823 15-05-2012 01:27 1916070

Devils Night, спасибо! Задача выполнена. Спасибо всем, кто помог!
Вот скрипт полностью, вдруг кому-нибудь пригодится.
Автоустановка с определением битности системы
читать дальше »

[Setup]
Uninstallable=false
CreateUninstallRegKey=false
UpdateUninstallLogAppName=false
AppName=PS
AppVersion=13.0
;AppVerName=PS 13.0
DefaultDirName={pf}\Ps
DisableDirPage=yes
DefaultGroupName=PS
DisableProgramGroupPage=yes
OutputDir=E:\ТемР\4556
OutputBaseFilename=setup
SetupIconFile=E:\44к.ico
Compression=lzma
SolidCompression=yes

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

[Files]
Source: Adobe Photoshop CS6 (x32)\*; DestDir: {app}; Flags: recursesubdirs createallsubdirs ignoreversion; Check: not IsWin64
Source: Adobe Photoshop CS6 (x64)\*; DestDir: {app}; Flags: recursesubdirs createallsubdirs ignoreversion; Check: IsWin64

[Icons]
Name: {commondesktop}\Ps; Filename: {app}\PhotoshopCS6Portable.exe; WorkingDir: {app}; Check: not IsWin64
Name: {commondesktop}\Ps; Filename: {app}\Photoshopx64Portable.exe; WorkingDir: {app}; Check: IsWin64

[code]
function ShouldSkipPage(PageID: Integer): Boolean;
begin
Result:=true;
end;

procedure WizardFormShow(Sender: TObject);
begin
WizardForm.NextButton.OnClick(nil);
end;

procedure InitializeWizard();
begin
with WizardForm do
begin
Show;
OnShow := @WizardFormShow;
end;
end;

MeХanik 15-05-2012 13:25 1916290

Цитата:

Цитата Devils Night
Ну начинается день золотой, шуруй сюда»

дело в том что тут ничего нужного нет там только как сжимать и чем !!!
А мне нужно что куда прописывать чтобы файлы извлекались из архива !!!

bugmenotagain 15-05-2012 13:39 1916299

в чем проблема


Код:

[Files]
Source: "C:\Program Files\WinDjView\*"; DestDir: "{app}"; Flags: ignoreversion; Components: WinDjView


R.i.m.s.k.y. 15-05-2012 13:45 1916305

bugmenotagain, либо не объявлена секция Components, либо в ней нет компонента WinDjView

R.i.m.s.k.y. 15-05-2012 14:11 1916322

bugmenotagain,
1. попробуй добавить флаги createallsubdirs recursesubdirs
2. тут интереснее, Uninstallable задается только в секции Setup и компоненты к ней не применишь, как вариант удалять удалятор в конце и выносить секцию из реестра

bugmenotagain 15-05-2012 14:50 1916346

Цитата:

Цитата R.i.m.s.k.y.
1. попробуй добавить флаги createallsubdirs recursesubdirs »

сработало. но только почему то программа видна в "Установка и удаление программ" а так же видна в специальных программ- дистилляторов

она же portable. она должна копироваться как обычная папка с обычными файлами.
Цитата:

Цитата R.i.m.s.k.y.
2. тут интереснее, Uninstallable задается только в секции Setup и компоненты к ней не применишь, как вариант удалять удалятор в конце и выносить секцию из реестра »

такое ощущение что вы не уверены.

и в меню пуск она суется. мда

R.i.m.s.k.y. 15-05-2012 14:53 1916349

Цитата:

Цитата bugmenotagain
такое ощущение что вы не уверены. »

угадал! я бы сделал в шаге ssDone удаление ключа реестра из секции реестра "установка/удаление программ" и удаление удалятора
Но может кто-то более красивое решение подскажет

bugmenotagain 15-05-2012 14:55 1916350

R.i.m.s.k.y., тогда такой вопрос. как заставить второй компонент (portable) копироваться в указанное место как обычный файл? без всякого реестра, меню пуск и прочее?

R.i.m.s.k.y. 15-05-2012 14:58 1916354

bugmenotagain, прописать в секции Icons, Registry и прочие правильно и корректно нужным строчкам нужные Components, строчки без Components выполняются всегда

bugmenotagain 15-05-2012 15:01 1916357

R.i.m.s.k.y., не подскажите примерно что прописывать?

R.i.m.s.k.y. 15-05-2012 15:02 1916359

bugmenotagain, точно так же как и в секции Files, строчка которой была выше

bugmenotagain 15-05-2012 15:07 1916365

R.i.m.s.k.y., про это можно где нибудь почитать?

запутался.

bugmenotagain 15-05-2012 15:14 1916369

не понятно
Код:

Source: port\*; DestDir: {app}\port;
у меня так
Код:

Source: "C:\Program Files\WinDjView\*"; DestDir: "{app}";
Цитата:

Цитата Johny777
Type: files; Name: {app}\ »

после слеша что писать?

Johny777 15-05-2012 15:25 1916374

bugmenotagain,
твоя проблема решена в этом сообщении
изучай, пользуйся!


Цитата:

Цитата R.i.m.s.k.y.
угадал! я бы сделал в шаге ssDone удаление ключа реестра из секции реестра "установка/удаление программ" и удаление удалятора
Но может кто-то более красивое решение подскажет »

касательно портативной/не портативной в одном инсталле можно сделать так:
*(работает как часы :). Проверил!)
Код:

[Setup]
AppName=My Program
AppVerName=MyProg.exe
DefaultDirName={pf}\SeperTest
AppId=TheBestAppIdEverMade
UninstallFilesDir={app}\uninstall
DirExistsWarning=no
DisablewelcomePage=yes


[Components]
Name: norm; Description: Я простая версия; Flags: exclusive
Name: port; Description: А я портативная; Flags: exclusive


[Files]
Source: port\*; DestDir: {app}\port; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname uninsneveruninstall; Components: port
Source: norm\*; DestDir: {app}\norm; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname; Components: norm


[  Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  AppPath: string;
  ResultCode: Integer;
begin
  if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1', 'InstallLocation', AppPath) then AppPath := RemoveQuotes(AppPath);
  if (CurStep = ssDone) and (IsComponentSelected('port')) then Exec(AppPath + '\uninstall\unins000.exe', '/VERYSILENT', '', SW_SHOW, ewNoWait, ResultCode);
end;

вкладываю архив с файлами

bugmenotagain 15-05-2012 15:54 1916392

Johny777, да Я понял что это решение. Я уточняю. пути у всех разные. или мне тупо скопировать?

что мне писать вместо
Цитата:

Цитата Johny777
port\* »

свой путь?

Ivan_009 15-05-2012 17:36 1916447

Как сделать так, чтобы при успешной установке на финишной странице загружалась одна картинка а при ошибке другая.Дело в том, что я использую на каждой странице разную картинку через bmp. Распаковка у меня через ISDone. Подскажите пожалуйста... :dont-know

MeХanik 15-05-2012 17:57 1916457

Скажите что куда прописать ,чтобы файл - Game.exe - устанавливался в папку \system


Вот мой инстал :
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
DiskSpanning=true
DiskSliceSize=1457664000
; 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={{4C9C2778-0018-4EA8-BD69-82E1027FEB7D}
AppName=Shrek 2
AppVersion=1.0
;AppVerName=Shrek 2 1.0
AppPublisher=MeXanik
AppPublisherURL=rutracker.org
AppSupportURL=rutracker.org
AppUpdatesURL=rutracker.org
DefaultDirName={pf}\Shrek 2
DefaultGroupName=Shrek 2
AllowNoIcons=yes
OutputDir=C:\Documents and Settings\Администратор\Рабочий стол\Новая папка
OutputBaseFilename=setup
SetupIconFile=D:\Разное\1336903674_adept_installer.ico
Compression=lzma/ultra64
SolidCompression=true
InternalCompressLevel=ultra64

[Languages]
Name: english; MessagesFile: compiler:Languages\English.isl
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: D:\Разное\Shrek2-1\System\Game.exe; DestDir: {app}; Flags: ignoreversion
;Source: D:\Разное\Shrek2-1\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: {group}\Shrek 2; Filename: {app}\Game.exe
Name: {group}\{cm:ProgramOnTheWeb,Shrek 2}; Filename: rutracker.org
Name: {group}\{cm:UninstallProgram,Shrek 2}; Filename: {uninstallexe}
Name: {commondesktop}\Shrek 2; Filename: {app}\Game.exe; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\Shrek 2; Filename: {app}\Game.exe; Tasks: quicklaunchicon

[Run]
Filename: {src}\Shrek2.exe; WorkingDir: {app}; Parameters: -x -y -s2 -d.; StatusMsg: Идет распаковка данных, ждите...; Flags: runasoriginaluser
Filename: {app}\system\Game.exe; Description: {cm:LaunchProgram,Shrek 2}; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: InstallPath; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: StartMenuFolder; ValueData: MeXanik
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: Version; ValueData: 1.00
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: Language; ValueData: 1049
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: UninstallString; ValueData: C:\Program Files\Common Files\InstallShield\Driver\7\Intel 32\Idriver.exe
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: UninstallArgs; ValueData: /M{{7774A6A9-CE0D-4544-9A29-84351BAE184A}

[UninstallDelete]
 Name: {app}\*.*; Type: filesandordirs


bugmenotagain 15-05-2012 18:05 1916466

Johny777,

и мне нужна страница приветствия.

R.i.m.s.k.y. 15-05-2012 18:05 1916467

MeХanik,
Код:

[Files]
Source: D:\Разное\Shrek2-1\System\Game.exe; DestDir: {app}\System; Flags: ignoreversion

bugmenotagain, это кстати ответ и на твой вопрос про путь тоже
скрипт покажи, что у тебя там за константа reg

bugmenotagain 15-05-2012 18:09 1916471

вот на эту строчку ругается
Код:

AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}'));

bugmenotagain 15-05-2012 18:14 1916476

Вложений: 1
Код:

[  Code]
procedure CurStepChanged(CurStep: TSetupStep);
var 
AppPath: string; 
ResultCode: Integer;
begin 
AppPath := RemoveQuotes(ExpandConstant('{reg:HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{#SetupSetting("AppID")}_is1,InstallLocation|}')); 
 if (CurStep = ssDone) and (IsComponentSelected('port')) then Exec(AppPath + '\uninstall\unins000.exe', '/VERYSILENT', '', SW_SHOW, ewNoWait, ResultCode);
end;


R.i.m.s.k.y. 15-05-2012 18:49 1916492

bugmenotagain, структуру reg: нельзя применять в коде
Код:

[  Code]
procedure CurStepChanged(CurStep: TSetupStep);
var 
AppPath, key, InstallLocation: string; 
ResultCode: Integer;
begin 
if (CurStep = ssDone) and (IsComponentSelected('port')) then begin
key := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + ExpandConstant('{#SetupSetting("AppID")}') + '_is1';
RegQueryStringValue(HKLM, key, 'InstallLocation', InstallLocation);
MsgBox('Key = ' + key + #13#10 + 'InstallLocation = ' + InstallLocation, mbInformation, MB_OK);
AppPath := RemoveBackslashUnlessRoot(RemoveQuotes(InstallLocation)); 
 Exec(AppPath + '\uninstall\unins000.exe', '/VERYSILENT', '', SW_SHOW, ewNoWait, ResultCode);
end; //if (CurStep = ssDone) and (IsComponentSelected('port'))
end;

КМК это не сработает, ты ставишь ее и тут же на последнем шаге сносишь, хотя флаг uninsneveruninstall присутсвует, может и сработать
Вот что точно левое так это секция [UninstallDelete]

Johny777 15-05-2012 18:53 1916494

R.i.m.s.k.y.,
у меня пример на предыдущей странице рабочий
я проверял
добавил другую строку на предыдущей странице

R.i.m.s.k.y. 15-05-2012 18:58 1916499

Johny777, я переписал по рабочему, это раз
дваз - неправильно постоянно вычислять ключи, надо их подсунуть под if (CurStep = ssDone)

=============
еще ошибка AppPath имеет на конце \ и ты еще раз приплюсовываешь его же

bugmenotagain 15-05-2012 19:05 1916501

Johny777, Я скопировал ваш скрипт. но он не работает

Цитата:

Цитата R.i.m.s.k.y.
[ Code] procedure CurStepChanged(CurStep: TSetupStep); var AppPath, key, InstallLocation: string; ResultCode: Integer; begin if (CurStep = ssDone) and (IsComponentSelected('port')) then begin key := 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\' + ExpandConstant('{#SetupSetting("AppID")}') + '_is1'; RegQueryStringValue(HKLM, key, 'InstallLocation', InstallLocation); MsgBox('Key = ' + key + #13#10 + 'InstallLocation = ' + InstallLocation, mbInformation, MB_OK); AppPath := RemoveQuotes(InstallLocation); Exec(AppPath + '\uninstall\unins000.exe', '/VERYSILENT', '', SW_SHOW, ewNoWait, ResultCode); end; //if (CurStep = ssDone) and (IsComponentSelected('port')) end; »

в конце установки
и теперь в назначенную папку вообще ничего не распаковывается. пустая

R.i.m.s.k.y. 15-05-2012 19:12 1916507

bugmenotagain, вот для этого я и поставил MSGBox
смотри пути где ищет удалятор и куда ставишь
Согласно твоему коду он ищет в InstallLocation = ...
А ты где его ждешь?

bugmenotagain 15-05-2012 19:14 1916509

R.i.m.s.k.y.,
Цитата:

Цитата R.i.m.s.k.y.
Согласно твоему коду »

Я ваш скрипт скопировал и все.

R.i.m.s.k.y. 15-05-2012 19:33 1916517

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

bugmenotagain 15-05-2012 19:41 1916522

R.i.m.s.k.y.,
Цитата:

Цитата R.i.m.s.k.y.
куда ставится портабельная и полная версия »

по умолчанию просится C:\Program Files\WinDjView
ну папку можно естественно изменить.
удалятор должен лежать как положено в папке программе.
в portable нет никакого удалятора, это просто набор файлов скопировать и все.

Johny777 15-05-2012 20:13 1916544

R.i.m.s.k.y.,
приношу свои извинения, тк мой пример состоит на половину из лишнего кода :)
только сейчас допёрло, что на шаге ssDone константа {app} ещё существует, а это всё упрощает и укорачивает!
Вот:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=MyProg.exe
DefaultDirName={pf}\SeperTest
UninstallFilesDir={app}\uninstall

[Components]
Name: norm; Description: Я простая версия; Flags: exclusive
Name: port; Description: А я портативная; Flags: exclusive

[Files]
Source: port\*; DestDir: {app}\port; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname uninsneveruninstall; Components: port
Source: norm\*; DestDir: {app}\norm; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname; Components: norm

[  Code]
procedure CurStepChanged(CurStep: TSetupStep);
var
  ResultCode: Integer;
begin
  if (CurStep = ssDone) and (IsComponentSelected('port')) then Exec(ExpandConstant('{app}\uninstall\unins000.exe'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ResultCode);
end;


(Проверил. Работает)
наглядный пример прилагается в архиве

bugmenotagain 15-05-2012 21:26 1916579

Как сделать следующий порядок страниц
1 - приветствие 2 - выбор компонентов 3 - выбор папки установки
у меня сейчас 1 - приветствие 2 - выбор папки 3 - выбор компонентов

R.i.m.s.k.y. 15-05-2012 21:36 1916585

bugmenotagain, порядок стандартных окон не изменить
Или перерисовывай их

nik1967 15-05-2012 21:37 1916586

Цитата:

Цитата bugmenotagain
Как сделать следующий порядок страниц »

читать дальше »
Код:

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

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

[Components]
Name: WB; Description: 'Мой компьютер' - Настройки; ExtraDiskSpaceRequired: 1048576

[_code]
function OnShouldSkipPage(Sender: TWizardPage): Boolean;
begin
    if WizardForm.ComponentsList.Items.Count > 0 then WizardForm.Tag:= 1; // отображаются страницы выбора папки и компонентов
end;

Procedure CurPageChanged(CurPageID: Integer);
Begin
  Case CurPageID of
  wpSelectDir: if WizardForm.Tag = 1 then
    begin
        WizardForm.SelectDirPage.Notebook.ActivePage:= WizardForm.SelectComponentsPage;
        WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectComponents)
        WizardForm.Hint:= WizardForm.PageDescriptionLabel.Caption; // запомнить SetupMessage(msgSelectDirDesc)
        WizardForm.PageDescriptionLabel.Caption:= SetupMessage(msgSelectComponentsDesc)
    end;
  wpSelectComponents: if WizardForm.Tag = 1 then
    begin
        WizardForm.SelectComponentsPage.Notebook.ActivePage:= WizardForm.SelectDirPage;
        WizardForm.DiskSpaceLabel.Caption:= WizardForm.ComponentsDiskSpaceLabel.Caption;
        WizardForm.PageNameLabel.Caption:= SetupMessage(msgWizardSelectDir)
        WizardForm.PageDescriptionLabel.Caption:= WizardForm.Hint // иначе вместо названия программы [name]
    end;
  end;
end;


bugmenotagain 15-05-2012 21:43 1916588

R.i.m.s.k.y., как другие тогда делают порядок?

nik1967, только code нужен?

R.i.m.s.k.y. 15-05-2012 21:48 1916593

Цитата:

Цитата bugmenotagain
как другие тогда делают порядок? »

переопределяют страницы. пишут свои заместо стандартных
Так я думал пока nik1967 не ответил, хе-хе

bugmenotagain 15-05-2012 21:49 1916595

R.i.m.s.k.y., а это сложно свои страницы писать?

nik1967 15-05-2012 21:51 1916596

Это не мой пример. Где то, когда то, у кого то подсмотрел, стыдно признаться не помню у кого, вполне возможно, что и здесь.

R.i.m.s.k.y. 15-05-2012 21:53 1916598

Цитата:

Цитата bugmenotagain
а это сложно свои страницы писать »

для меня - да
Но остальные имеют свое мнение на этот счет
Вообще все сложно когда не знаешь, когда знаешь - все просто.
Для меня к примеру и 1Цэ сложная вещь, потому что нету форума по 1с как по инно :)

bugmenotagain 15-05-2012 21:56 1916601

R.i.m.s.k.y., а что лучше свои нарисовать или стандартные изменить?

где можно почитать про это?

Цитата:

Цитата El Sanchez
Inno Setup Form Designer - редактор страниц Inno Setup, можно создавать свои страницы. »

с помощью этой да?

R.i.m.s.k.y. 15-05-2012 22:08 1916610

Цитата:

Цитата bugmenotagain
а что лучше свои нарисовать или стандартные изменить? »

вообще не трогать :)

bugmenotagain 15-05-2012 22:10 1916611

R.i.m.s.k.y., эта хрень даже запускаться не хочет

Devils Night 15-05-2012 23:31 1916649

Цитата:

Цитата bugmenotagain
только code нужен? »

В основном да, а без него никак.
Цитата:

Цитата bugmenotagain
с помощью этой да? »

Ну создать формы можно с помощью неё, плюшек там всяких добавить на страницу, только вот многое сложно будет сделать, особенно когда все тонкости кода не знаешь, надо много, много читать и заучивать чтоб понять.

Johny777 15-05-2012 23:55 1916661

R.i.m.s.k.y.,
у себя тоже давно поменял страницы
только проще
тк компонентов (секции) нет, то и страницы нет
вставил вот таким вот чудесным макаром страничку перед страницей выбора директории установки

и создал на ней всё необходимое
есть и другой способ через (взял в во вкладке "поддержка" расширенной версии)
читать дальше »

function CreateInputQueryPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String): TInputQueryWizardPage;
function CreateInputOptionPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String; Exclusive, ListBox: Boolean): TInputOptionWizardPage;
function CreateInputDirPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String; AAppendDir: Boolean; ANewFolderName: String): TInputDirWizardPage;
function CreateInputFilePage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String): TInputFileWizardPage;
function CreateOutputMsgPage(const AfterID: Integer; const ACaption, ADescription, AMsg: String): TOutputMsgWizardPage;
function CreateOutputMsgMemoPage(const AfterID: Integer; const ACaption, ADescription, ASubCaption: String; const AMsg: AnsiString): TOutputMsgMemoWizardPage;
function CreateOutputProgressPage(const ACaption, ADescription: String): TOutputProgressWizardPage;
function CreateCustomPage(const AfterID: Integer; const ACaption, ADescription: String): TWizardPage;

но я с ним не дружу
а работать со своей страницей предельно легко
вот на моём примере
читать дальше »
Код:

var
  ComponentsPage: TWizardPage;
....
procedure InitializeWizard;
begin
  ComponentsPage := CreateCustomPage(wpInfoBefore, 'ISCustomPage1_Caption', 'ISCustomPage1_Description');
...
  ep1_MainLable := TLabel.Create(WizardForm);
  with ep1_MainLable do
  begin
    Name := 'ep1_MainLable';
    Parent := ComponentsPage.Surface;
....
  if CurPageID=ComponentsPage.ID then
    begin
      with WizardForm do
        begin
,,,


_______________________________________
касательно смены страниц местами
не знаю насчёт других, но логика моя говорит, что разумнее сначала выбирать "что" и потом говорить "куда", а не наоборот

Ivan_009 16-05-2012 00:26 1916670

Как убрать данную область...

Johny777 16-05-2012 00:53 1916681

это, Ваня, так называемая WizardForm.Caption := 'название'
ищи через ctrl + F
может быть записано и так:
with WizardForm do
begin
Caption := 'Готово';
...
или в процедуре какой

Ivan_009 16-05-2012 00:58 1916683

Johny777 мне нужно полностью удалить эту область не подскажешь как :dont-know

Johny777 16-05-2012 01:05 1916692

Ivan_009,
ну так
WizardForm.Caption := '';
главное кавычки не стирай, а в них ничего не пиши
а можно и без кода обойтись
вот так
[Messages]
SetupWindowTitle=

Ivan_009 16-05-2012 01:11 1916695

Не мне надо, чтобы верхушки вообще не было

Johny777 16-05-2012 01:14 1916697

Цитата:

Цитата Ivan_009
Не мне надо, чтобы верхушки вообще не было »

оно?

procedure InitializeWizard();
begin
WizardForm.BorderIcons := [];
...

но тогда и иконка и значки "свенуть", "закрыть" слетят

Ivan_009 16-05-2012 01:25 1916699

Почти :) еще бы полоску докучи верхнию убрать полностью

Johny777 16-05-2012 01:37 1916711

Ivan_009,
ну вот так
with WizardForm do
begin
BorderStyle := bsNone;
end;
только окно таскать не за что будет
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,
но благодаря Лександру у нас есть чудо-процедура (сам у себя в инсталле использую. Очень удобно!)
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[  code]
type
  TANewStatic = record
    Static  : TNewStaticText;
  end;

var
  ANewStatic : array of TANewStatic;

function ReleaseCapture(): Longint; external 'ReleaseCapture@user32.dll stdcall';

procedure MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(WizardForm.Handle,$0112,$F012,0)
end;

procedure AddStaticToArray(st:TNewStaticText);
var
  i:integer;
begin
  i:=GetArrayLength(ANewStatic);
  SetArrayLength(ANewStatic,i+1);
  ANewStatic[i].Static:=st;
  ANewStatic[i].Static.OnMouseDown:=@MouseDown;
end;

procedure StaticChange(c:TWinControl);
var
  i:integer;
begin
  for i:=0 to c.ControlCount-1 do
    if c.Controls[i] is TWinControl then begin
      if c.Controls[i] is TNewStaticText then AddStaticToArray(TNewStaticText(c.Controls[i]));
      if TWinControl(c.Controls[i]).ControlCount>0 then StaticChange(TWinControl(c.Controls[i]));
    end;
end;

procedure InitializeWizard;
var i:integer;
begin
with WizardForm do begin
  /// BorderStyle:=bsNone;

  end;
for i:=0 to 18 do
  begin
    with TLabel.Create(WizardForm) do
    begin
    BringToFront;
      Case i of
      0:Parent := WizardForm;
      1:Parent := WizardForm.OuterNotebook;
      2:Parent := WizardForm.InnerNotebook;
      3:Parent := WizardForm.InnerPage;
      4:Parent := WizardForm.WelcomePage;
      5:Parent := WizardForm.LicensePage;
      6:Parent := WizardForm.PasswordPage;
      7:Parent := WizardForm.InfoBeforePage;
      8:Parent := WizardForm.UserInfoPage;
      9:Parent := WizardForm.SelectDirPage;
      10:Parent := WizardForm.SelectComponentsPage;
      11:Parent := WizardForm.SelectProgramGroupPage;
      12:Parent := WizardForm.SelectTasksPage;
      13:Parent := WizardForm.ReadyPage;
      14:Parent := WizardForm.PreparingPage;
      15:Parent := WizardForm.InstallingPage;
      16:Parent := WizardForm.InfoAfterPage;
      17:Parent := WizardForm.FinishedPage;
      18:Parent := WizardForm.MainPanel;
      end;
      Transparent := True;
      Align := alClient;
      OnMouseDown:=@MouseDown;
    end;
  end;
  StaticChange(WizardForm);
end;


при желании можно не использовать кусок из InitializeWizard
и всем нужным элементам во вкладке "события" дизайнера расширенной версии
в событии OnMouseDown присвоить процедуру MouseDown (картинкам, панелям и пр)
в окнах (ведь Notebook-ам эту процедуру не присвоить) создать на всю страницу или в определённых участках лейблы с параметрами (параметры выделил жирным)
читать дальше »
Код:

  Label1 := TLabel.Create(WizardForm);
  with Label1 do
  begin
    Name := 'Label1';
    Parent := WizardForm.SelectDirPage;
    AutoSize := False;
    Transparent := True;
    OnMouseDown := @MouseDown;
    Caption := '';
    Left := ScaleX(104);
    Top := ScaleY(112);
    Width := ScaleX(171);
    Height := ScaleY(53);
  end;


а если этот лейбл будет не давать пользоваться некоторыми элементами (SpeedButton-у например), то их нужно в той же вкладке
"дизайн" при щелчке правой кнопкой мыши по ним поднять "на передний план"
:)

MeХanik 16-05-2012 07:45 1916760

Как сделать , чтобы после установки в ярлыке на раб.столе был прописан путь : X:\XXX\Shrek 2\system
Инстал все тот же:
Код:

; Script generated by the Inno Setup Script Wizard.
; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES!

[Setup]
DiskSpanning=true
DiskSliceSize=1457664000
; 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={{4C9C2778-0018-4EA8-BD69-82E1027FEB7D}
AppName=Shrek 2
AppVersion=1.0
;AppVerName=Shrek 2 1.0
AppPublisher=MeXanik
AppPublisherURL=rutracker.org
AppSupportURL=rutracker.org
AppUpdatesURL=rutracker.org
DefaultDirName={pf}\Shrek 2
DefaultGroupName=Shrek 2
AllowNoIcons=yes
OutputDir=C:\Documents and Settings\Администратор\Рабочий стол\Новая папка
OutputBaseFilename=setup
SetupIconFile=D:\Разное\1336903674_adept_installer.ico
Compression=lzma/ultra64
SolidCompression=true
InternalCompressLevel=ultra64

[Languages]
Name: english; MessagesFile: compiler:Languages\English.isl
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: D:\Разное\Shrek2-1\System\Game.exe; DestDir: {app}; Flags: ignoreversion
;Source: D:\Разное\Shrek2-1\*; DestDir: {app}; Flags: ignoreversion recursesubdirs createallsubdirs
; NOTE: Don't use "Flags: ignoreversion" on any shared system files

[Icons]
Name: {group}\Shrek 2; Filename: {app}\Game.exe
Name: {group}\{cm:ProgramOnTheWeb,Shrek 2}; Filename: rutracker.org
Name: {group}\{cm:UninstallProgram,Shrek 2}; Filename: {uninstallexe}
Name: {commondesktop}\Shrek 2; Filename: {app}\Game.exe; Tasks: desktopicon
Name: {userappdata}\Microsoft\Internet Explorer\Quick Launch\Shrek 2; Filename: {app}\Game.exe; Tasks: quicklaunchicon

[Run]
Filename: {src}\Shrek2.exe; WorkingDir: {app}; Parameters: -x -y -s2 -d.; StatusMsg: Идет распаковка данных, ждите...; Flags: runasoriginaluser
Filename: {app}\system\Game.exe; Description: {cm:LaunchProgram,Shrek 2}; Flags: nowait postinstall skipifsilent

[Registry]
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: InstallPath; ValueData: {app}; Flags: uninsdeletekey
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: StartMenuFolder; ValueData: MeXanik
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: Version; ValueData: 1.00
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: Language; ValueData: 1049
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: UninstallString; ValueData: C:\Program Files\Common Files\InstallShield\Driver\7\Intel 32\Idriver.exe
Root: HKLM; SubKey: SOFTWARE\Activision\Shrek 2; ValueType: string; ValueName: UninstallArgs; ValueData: /M{{7774A6A9-CE0D-4544-9A29-84351BAE184A}

[UninstallDelete]
 Name: {app}\*.*; Type: filesandordirs


R.i.m.s.k.y. 16-05-2012 07:57 1916764

MeХanik, почитать про абсолютные и относительные пути
Код:

[Icons]
Name: {group}\Shrek 2; Filename: {app}\System\Game.exe; WorkingDir: {app}\System


bugmenotagain 16-05-2012 09:50 1916821


в реестре ошибка появляется после распаковки.


Значит страницы никак нельзя отредактировать?
NSIS действительно самый лучший. все страницы там руками пишешь, без всякой черной магии и pascal.

R.i.m.s.k.y. 16-05-2012 09:55 1916823

bugmenotagain, и что из этой куцой картинки мы должны понять?

bugmenotagain 16-05-2012 10:18 1916829

R.i.m.s.k.y., ошибка в реестре. программа CCleaner

R.i.m.s.k.y. 16-05-2012 10:23 1916836

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

bugmenotagain 16-05-2012 10:31 1916842

Код:

#define MyAppName "WinDjView 1.0.3"
#define MyAppVersion "1.0.3"
#define MyAppExeName "WinDjView.exe" 
[Setup]
AppId={{60F3D1CB-B2A7-46E7-92B0-93526131061D}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName=WinDjView 1.0.3
DefaultDirName={pf}\WinDjView
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
InfoBeforeFile=C:\Users\Admin\Desktop\ss.rtf
OutputDir=D:\Инстляторы
OutputBaseFilename=WinDjView.v1.0.3
SetupIconFile=C:\Users\Admin\Desktop\win.ico
Compression=lzma
SolidCompression=yes
WizardImageFile=картинка.bmp
WizardSmallImageFile=55x55.bmp
UninstallFilesDir={app}\uninstall
DirExistsWarning=no
WizardImageStretch=no 
WizardImageBackColor=clWhite
ShowComponentSizes=no 
[Languages]
Name: "russian"; MessagesFile: "compiler:Languages\Russian.isl" 
[Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkedonce; Components: norm; 
[Components]
Name: norm; Description: Установка; Flags: exclusive
Name: port; Description: Распаковка; Flags: exclusive 
[Files]
Source: "C:\users\Admin\Desktop\WinDjViewPortable\*"; DestDir: {app}\; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname uninsneveruninstall; Components: port Source: "C:\Program Files\WinDjView\*"; DestDir: {app}\; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname; Components: norm 
[UninstallDelete]
Type: files; Name: {app}\ ; Components: port 
[Icons] 
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
 [  Code]
procedure CurStepChanged(CurStep: TSetupStep);
var 
ResultCode: Integer;
begin 
 if (CurStep = ssDone) and (IsComponentSelected('port')) then Exec(ExpandConstant('{app}\uninstall\unins000.exe'), '/VERYSILENT', '', SW_SHOW, ewNoWait, ResultCode);
 end; 
[Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent

после распаковки портативной версии программы.

R.i.m.s.k.y. 16-05-2012 10:52 1916862

bugmenotagain, ну мало ли
а точно имя удалятора unins000.exe???

так попробуй
Код:

#define MyAppName "WinDjView 1.0.3"
#define MyAppVersion "1.0.3"
#define MyAppExeName "WinDjView.exe" 

[Setup]
AppId={{60F3D1CB-B2A7-46E7-92B0-93526131061D}
AppName={#MyAppName}
AppVersion={#MyAppVersion}
AppVerName=WinDjView 1.0.3
DefaultDirName={pf}\WinDjView
DefaultGroupName={#MyAppName}
DisableProgramGroupPage=yes
InfoBeforeFile=C:\Users\Admin\Desktop\ss.rtf
OutputDir=D:\Инстляторы
OutputBaseFilename=WinDjView.v1.0.3
SetupIconFile=C:\Users\Admin\Desktop\win.ico
Compression=lzma
SolidCompression=yes
WizardImageFile=картинка.bmp
WizardSmallImageFile=55x55.bmp
UninstallFilesDir={app}\uninstall
DirExistsWarning=no
WizardImageStretch=no 
WizardImageBackColor=clWhite
ShowComponentSizes=no 

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

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: checkedonce; Components: norm; 

[Components]
Name: norm; Description: Установка; Flags: exclusive
Name: port; Description: Распаковка; Flags: exclusive 

[Files]
Source: "C:\users\Admin\Desktop\WinDjViewPortable\*"; DestDir: {app}\; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname uninsneveruninstall; Components: port
Source: "C:\Program Files\WinDjView\*"; DestDir: {app}\; Flags: ignoreversion createallsubdirs recursesubdirs sortfilesbyextension sortfilesbyname; Components: norm 

;[UninstallDelete]
;Type: files; Name: {app}\ ; Components: port 

[Icons] 
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon

[*Code]
procedure CurStepChanged(CurStep: TSetupStep);
var 
ResultCode: Integer;
begin 
if (CurStep = ssDone) then begin
  if (IsComponentSelected('port')) then begin
  Exec(ExpandConstant('{app}\uninstall\unins000.exe'), ' /VERYSILENT', ExpandConstant('{app}\uninstall'), SW_SHOW, ewNoWait, ResultCode);
  MsgBox('папка с удалятором = '  + ExpandConstant('{app}\uninstall'), mbInformation, MB_OK);
  if RegKeyExists(HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1) then MsgBox('ключ в реестре не удален', mbInformation, MB_OK);
  end; //if (IsComponentSelected('port'))
end; //if (CurStep = ssDone)
end;  //CurStepChanged

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


bugmenotagain 16-05-2012 11:03 1916870

Код:

  if RegKeyExists(HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1) then MsgBox('ключ в реестре не удален', mbInformation, MB_OK);

R.i.m.s.k.y. 16-05-2012 11:05 1916872

ы кавыки забыл
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1') then MsgBox('ключ в реестре не удален', mbInformation, MB_OK);

bugmenotagain 16-05-2012 11:11 1916877

Цитата:

Цитата R.i.m.s.k.y.
ы кавыки забыл
if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1') then MsgBox('ключ в реестре не удален', mbInformation, MB_OK); »

реестр чистый, но

R.i.m.s.k.y. 16-05-2012 11:13 1916879

я бы делал вот так
Код:

[*Code]
procedure RD(Dir:string);
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + Add_Quotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure CurStepChanged(CurStep: TSetupStep);
var 
ResultCode: Integer;
begin 
if (CurStep = ssDone) then begin
  if (IsComponentSelected('port')) then begin
  RD(ExpandConstant('{app}\uninstall'));
  if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1') then RegDeleteKeyIncludingSubkeys(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1')
  if RegKeyExists(HKCU, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1') then RegDeleteKeyIncludingSubkeys(HKCU, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1')
  end; //if (IsComponentSelected('port'))
end; //if (CurStep = ssDone)
end;  //CurStepChanged

Цитата:

Цитата bugmenotagain
реестр чистый, но »

а в остальном все хорошо?
Чтобы убрать отладочное сообщение удали строчки с MSGBox

bugmenotagain 16-05-2012 11:16 1916882

Код:

Exec('cmd.exe', ' /c rd /S /Q  ' + Add_Quotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
ругается. кажется опять кавычки

перед Add_Quotes

Цитата:

Цитата R.i.m.s.k.y.
*Code] procedure RD(Dir:string); begin Exec('cmd.exe', ' /c rd /S /Q ' + Add_Quotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res); Exec('cmd.exe', ' /c rd /S /Q ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res); end; procedure CurStepChanged(CurStep: TSetupStep); var ResultCode: Integer; begin if (CurStep = ssDone) then begin if (IsComponentSelected('port')) then begin RD(ExpandConstant('{app}\uninstall')); if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1') then RegDeleteKeyIncludingSubkeys(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1') if RegKeyExists(HKCU, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1') then RegDeleteKeyIncludingSubkeys(HKCU, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1') end; //if (IsComponentSelected('port')) end; //if (CurStep = ssDone) end; //Cu »

этот код к чему?

R.i.m.s.k.y. 16-05-2012 11:18 1916887

bugmenotagain, ты либо используй мой вариант, либо не мой
Я привел вариант как бы сделал я. Ты сам то можешь прочитать чего накопировал? нет? думаешь мы должны?

RD рабочий из моего инсталла
я забыл добавить Add_Quotes, в башке компилятора то нет
Код:

[*Code]
function Add_Quotes(strng : String):String;
begin
  Result := '"' + strng + '"';
end;

procedure RD(Dir:string);
begin
  Exec('cmd.exe', ' /c rd /S /Q  ' + AddQuotes(Dir),ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
  Exec('cmd.exe', ' /c rd /S /Q  ' + '"'+Dir+'"',ExpandConstant('{sys}'), SW_Hide,ewWaitUntilTerminated,res);
end;

procedure CurStepChanged(CurStep: TSetupStep);
var 
ResultCode: Integer;
begin 
if (CurStep = ssDone) then begin
  if (IsComponentSelected('port')) then begin
  RD(ExpandConstant('{app}\uninstall'));
  if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1') then RegDeleteKeyIncludingSubkeys(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1')
  if RegKeyExists(HKCU, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1') then RegDeleteKeyIncludingSubkeys(HKCU, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1')
  end; //if (IsComponentSelected('port'))
end; //if (CurStep = ssDone)
end;  //CurStepChanged


bugmenotagain 16-05-2012 11:28 1916892

R.i.m.s.k.y.,
Код:

if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1')
 then; 
 end; //if (IsComponentSelected('port'))

что еще удалить?

R.i.m.s.k.y. 16-05-2012 11:34 1916900

bugmenotagain,
читать дальше »

Код:

[*Code]
procedure CurStepChanged(CurStep: TSetupStep);
var 
ResultCode: Integer;
begin 
if (CurStep = ssDone) then begin
  if (IsComponentSelected('port')) then begin
  Exec(ExpandConstant('{app}\uninstall\unins000.exe'), ' /VERYSILENT', ExpandConstant('{app}\uninstall'), SW_SHOW, ewNoWait, ResultCode);
//  MsgBox('папка с удалятором = '  + ExpandConstant('{app}\uninstall'), mbInformation, MB_OK);
//  if RegKeyExists(HKLM, SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1) then MsgBox('ключ в реестре не удален', mbInformation, MB_OK);
  end; //if (IsComponentSelected('port'))
end; //if (CurStep = ssDone)
end;  //CurStepChanged


bugmenotagain 16-05-2012 11:40 1916905

точно. Я не программист, и код pascal для меня как китайский.

Код:

procedure CurStepChanged(CurStep: TSetupStep); 
var 
 ResultCode: Integer;
 begin 
if (CurStep = ssDone) then begin 
 if (IsComponentSelected('port')) then begin 
 Exec(ExpandConstant('{app}\uninstall\unins000.exe'), ' /VERYSILENT', ExpandConstant('{app}\uninstall'), SW_SHOW, ewNoWait, ResultCode);
  if RegKeyExists(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{{60F3D1CB-B2A7-46E7-92B0-93526131061D}_is1')
 then; 
end; //if (IsComponentSelected('port'))
 end; //if (CurStep = ssDone)
 end;  //CurStepChanged

у меня так и все работает.

bugmenotagain 16-05-2012 12:27 1916930

Цитата:

Цитата Johny777
Совет
при выборе портативной кажется не разумно копировать её в Programm Files
лучше в "Мои документы" или на Рабочий стол (имею в виду делать путь установки таким в эдите пути на соответствующей странице) »

по умолчанию просится. думаю изменить папку не составит труда

скажите тут есть темы на другие установщики? inno setup , nsis слишком для программистов, чтоб делать удобные плюшки. а стандартные функции желают лучшего.
alert30
Цитата:

[qCode]
var Check: array [0..2] of TCheckBox;
procedure Check0(Sender: TObject);
begin
if Check[0].Checked then
begin Check[1].
Checked := False;
Check[2].Checked := False;
end;
if (Check[0].Checked = False)
and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[0].Checked := True; end;
procedure Check1(Sender: TObject);
begin
if Check[1].Checked then begin
Check[0].Checked := False;
Check[2].Checked := False;
end;
if (Check[0].Checked = False)
and (Check[1].Checked = False)
and (Check[2].Checked = False) then Check[1].Checked := True;
end;
procedure Check2(Sender: TObject);
begin if Check[2].Checked then
begin
Check[0].Checked := False;
Check[1].Checked := False;
end;
if (Check[0].Checked = False)
and (Check[1].Checked = False)
and (Check[2].Checked = False) then
Check[2].Checked := True;
end;
procedure InitializeWizard();
begin Check[0] := TCheckBox.Create(WizardForm);
with Check[0] do begin Parent := WizardForm.SelectDirPage;
Checked := True;
Top := ScaleY(100);
OnClick := @Check0;
Caption := 'Чекбокс №1';
end;
Check[1] := TCheckBox.Create(WizardForm);
with Check[1] do begin Parent := WizardForm.SelectDirPage;
Top := ScaleY(120); OnClick := @Check1;
Caption := 'Чекбокс №2'; end;
Check[2] := TCheckBox.Create(WizardForm);
with Check[2] do begin Parent := WizardForm.SelectDirPage;
Top := ScaleY(140); OnClick := @Check2;
Caption := 'Чекбокс №3'; end; end;

такой скрипт надо настрочить, чтобы сделать пару жалких чекбокса.

alert30 16-05-2012 12:38 1916935

bugmenotagain, скрой код, слишком большой.

R.i.m.s.k.y. 16-05-2012 12:42 1916938

Цитата:

Цитата bugmenotagain
скажите тут есть темы на другие установщики? inno setup , nsis слишком для программистов »

А как ты хотел, делать что-то для компа и не знать основ не получиццо
Любая программа будет слишком если в ней не разбираться

Ivan_009 16-05-2012 14:22 1916997

Подскажите для чего эта функция нужна ли она в слайдшоу...function GetSystemMetrics(nIndex:Integer):Integer; external 'GetSystemMetrics@user32.dll stdcall'; :search:

bugmenotagain 16-05-2012 14:29 1917005

Цитата:

Цитата R.i.m.s.k.y.
Твой вопрос можно было сделать и без секции кода одним мастером в инно: 3 инсталла, один обычный, один портативный и один главный который запускает выбранное »

по подробней. кстати, главный файл exe выбирать ?

R.i.m.s.k.y. 16-05-2012 14:36 1917013

bugmenotagain, Можно и поподробней, но не хочется
про главный файл не понял, где и зачем его выбирать?

Цитата:

Цитата Ivan_009
Подскажите для чего эта функция нужна ли она в слайдшоу...function GetSystemMetrics(nIndex:Integer):Integer; external 'GetSystemMetrics@user32.dll stdcall'; »

если не изменяет склероз получает размер экрана

Ivan_009 16-05-2012 14:44 1917024

R.i.m.s.k.y у меня и за этой функции ошибка если ее отлючить то все нормально работает :)

R.i.m.s.k.y. 16-05-2012 14:46 1917026

Ivan_009,
Ну если бы ты хотел чтобы тебе помогли то наверное ты бы показал ошибку или привел ее текст
Точно по тексту скрипта нет вызова этой функции?

Ivan_009 16-05-2012 15:03 1917034

R.i.m.s.k.y вот ошибки

bugmenotagain 16-05-2012 15:15 1917041

как изменить страницу компонентов
img





Ivan_009 16-05-2012 16:34 1917082

Подскажите как убрать белую область пробовал через SetBounds(ScaleX(79), ScaleY(61), ScaleX(798), ScaleY(620)) не получаеться зараннее спасибо... :search:

Johny777 16-05-2012 16:50 1917090

ну что ж ты Вань
картинку сдвинь или растяни (всего-то несколько пикселей)

название_картинки.Width := WizardForm.Width;
название_картинки.Stretch := true;

Ivan_009 16-05-2012 16:55 1917093

Johny777 Спасибо... :up

El Sanchez 16-05-2012 17:53 1917139

bugmenotagain, запуск деинсталлятора портативной установкой на этапе ssDone это, я так понимаю, для того, чтобы не было файлов деинсталлятора и записей в реестре, т.е. превращаем обычную установку в обычную. Вся эта стройная схема рушится по нескольким причинам: портативная установка в одну папку поверх обычной перепишет/добавит файлы от обычной установки, что есть нехорошо; портативная установка в одну папку поверх обычной на этапе ssDone своим вызовом деинсталлятора вынесет вместе с реестровыми записями и файлами деинсталлятора еще и только что распакованные файлы и, возможно, программную папку. Получим либо голое место, либо только файлы, не вошедшие в лог деинсталлятора.
Начните с этого шаблона и почитайте, наконец, справку:
читать дальше »

Код:

#define MyAppName "WinDjView"
#define MyAppVersion "1.0.3"
#define MyAppExeName "WinDjView.exe"

[Setup]
AppName={#MyAppName}
AppVerName={#MyAppName} {#MyAppVersion}
DefaultDirName={pf}\{#MyAppName}
Uninstallable=not IsComponentSelected('portable')

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

[Files]
Source: C:\Program Files\WinDjView\*; DestDir: {app}; Flags: ignoreversion createallsubdirs recursesubdirs; Components: default
Source: WinDjViewPortable\*; DestDir: {app}\portable; Flags: ignoreversion createallsubdirs recursesubdirs; Components: portable

[Components]
Name: default; Description: Обычная установка; Flags: exclusive
Name: portable; Description: Портативная установка; Flags: exclusive

[Run]
Filename: {app}\{#MyAppExeName}; Flags: nowait postinstall skipifsilent; Components: default
Filename: {app}\portable\{#MyAppExeName}; Flags: nowait postinstall skipifsilent; Components: portable


bugmenotagain 16-05-2012 18:15 1917159

El Sanchez, а вы можете сказать точно как в установщике сделать распаковку портативной программы? без всякого мусора. справку Я читаю. там нет ничего про портативную распаковку.

El Sanchez, Я думаю надо добавить еще CreateUninstallRegKey. в реестре мусор не создавать

Devils Night 16-05-2012 18:22 1917166

Цитата:

Цитата El Sanchez
для того, чтобы не было файлов деинсталлятора и записей в реестре »

bugmenotagain, на сколько помню:
достаточно этого
Uninstallable=false - Не создавать деинсталлятор

ну а если уж так хочется деинсталлировать то достаточно этого:
CreateUninstallRegKey=false - Не создавать в реестре ключ деинсталляции

ну а это вроде для того если устанавливаешь один раз, по моему так:
UpdateUninstallLogAppName=false - Не обновлять имя приложения в журнале деинсталляции

bugmenotagain 16-05-2012 18:27 1917170

=El Sanchez, а секция code мне не нужна ?

Uninstallable=not IsComponentSelected('portable')
создает удалятор в папке программы. если на него нажать он сам удаляется. программа остается.

UninstallFilesDir={app}\uninstall

Devils Night 16-05-2012 18:35 1917175

Цитата:

Цитата bugmenotagain
а секция code мне не нужна ? »

Вроде тот код который у тебя, он вроде ищет ветку реестра для деинталляции, так? Если так, и если у тебя портейбл, да и смотреть с точки зрения логики то не нужно, потому как при CreateUninstallRegKey=false, ключ в реестре создаваться не будет, а значит нечего и искать там.

У тебя уже два варианта:
1. делать чистый портейбл с использованием CreateUninstallRegKey=false, где код который ищет ветку реестра для деинталляции, не понадобится
2. то что тебе предложил El Sanchez, т.е у него 2 в одном и установка как обычного так и портейбл, где в принципе код будет к стати.

El Sanchez 16-05-2012 20:21 1917237

Цитата:

Цитата bugmenotagain
а вы можете сказать точно как в установщике сделать распаковку портативной программы? без всякого мусора »

Цитата:

Цитата El Sanchez
Uninstallable=not IsComponentSelected('portable') »

Директива Uninstallable указывает установщику создавать/не создавать деинсталлятор и записи деинсталлятора в реестре. В данном случае значение директивы зависит от результата функции IsComponentSelected с параметром portable, т.е. если мы не выбрали компонент portable (Портативная установка), то IsComponentSelected('portable') вернет False, а с учетом того, что перед функцией стоит оператор not, то not False становится True. Деинсталлятор будет создаваться. Ну и наоборот.
Цитата:

Цитата bugmenotagain
справку Я читаю. там нет ничего про портативную распаковку. »

Help - Setup Scripts Sections - Setup section directives - Uninstallable

Цитата:

Setting this to a boolean expression can be useful if you want to offer the user a 'portable mode' option.

Example:
[Setup]
Uninstallable=not IsTaskSelected('portablemode')

[Tasks]
Name: portablemode; Description: "Portable Mode"


Теперь вопрос. Почему я не написал такой вот напрашивающийся сам собой вариант?
Код:

Uninstallable=IsComponentSelected('default') //т.е. создавать деинсталлятор, если выбрана обычная установка.

R.i.m.s.k.y. 16-05-2012 20:33 1917241

Цитата:

Цитата El Sanchez
Uninstallable=IsComponentSelected('default') »

камрад, я о таком даже не догадывался!

Gnom_aka_Lexander 16-05-2012 20:49 1917246

Цитата:

Цитата R.i.m.s.k.y.
камрад, я о таком даже не догадывался! »

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

Sotonisto 16-05-2012 22:50 1917322

Доброго времени суток.
Подскажите в чем проблема - текст при выборе папки установки/группы (меню "Пуск") не обновляется.
Возьмем стандартный путь "C:\Program Files\Stalker" - в полоске "путь установки" отображается такой же; если его (во время инсталляции) изменить, например, на "D:\Games\Stalker" - путь установки изменится, но текст в полоске будет стандартным ("C:\Program Files\Stalker"). Как решить эту проблему?
Надеюсь Вы поняли, что я имел в виду. Вот сам скрипт.
P.S.: Лександер, спасибо. Проблема с нулями и вправду решилась после перехода на Ansi-версию :)

Johny777 17-05-2012 01:11 1917370

Цитата:

Цитата El Sanchez
А можно и без таймеров: »
читать дальше »
Код:

const
    GWL_EXSTYLE = (-20);
    WS_EX_COMPOSITED = $2000000;
    AW_HIDE = $10000;
    AW_VER_POSITIVE = $4;
    AW_VER_NEGATIVE = $8;

function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function AnimateWindow(hwnd: HWND; dwTime, dwFlags: DWORD): BOOL; external 'AnimateWindow@user32.dll stdcall';

var
    SettingPanel: TPanel;

procedure NewButton1Click(Sender: TObject);
begin
    with SettingPanel do
    begin
        //временно отрубаем стиль WS_EX_COMPOSITED, а то AnimateWindow плавненько не отработает
        SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) xor WS_EX_COMPOSITED);
        AnimateWindow(Handle, 1000, (AW_VER_POSITIVE * dword(not Visible)) or ((AW_HIDE or AW_VER_NEGATIVE) * dword(Visible)));
        SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED);
        Visible := not Visible;
    end;
end;

procedure InitializeWizard();
begin
    SetWindowLong(WizardForm.Handle, GWL_EXSTYLE, GetWindowLong(WizardForm.Handle, GWL_EXSTYLE) or WS_EX_COMPOSITED);

    SettingPanel := TPanel.Create(WizardForm);
    with SettingPanel do
    begin
        Parent := WizardForm;
        SetBounds(ScaleX(0), ScaleY(0), WizardForm.ClientWidth, WizardForm.OuterNotebook.ClientHeight);
        Visible := False;
    end;

    with TNewButton.Create(WizardForm) do
    begin
        Parent := WizardForm;
        SetBounds(ScaleX(40), ScaleY(327), ScaleX(75), ScaleY(25));
        Caption := 'open';
        OnClick := @NewButton1Click;
    end;
end;


анимация зачётная, но малость не то
к тому же стиль WS_EX_COMPOSITED нужен был, чтоб окно не мигало, а отказавшись от старой панели работающей через .repaint, из-за которой оно мигало, в нём тоже отпала необходимость (кажется)

Цитата:

Цитата El Sanchez
можно использовать ф-ию CallbackAddr »

воспользовался (извиняюсь, что только сейчас и при этом поднимаю старое сообщение)
(изменил один из примеров
вот этот
читать дальше »
Код:

[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[  Code]
 var
  SettingPanel: TPanel;
  SettingPanel_m_Timer,SettingPanel_p_Timer: TTimer;

 procedure NewButton1Click(Sender: TObject);
 begin
  SettingPanel_m_Timer.Enabled:=False; SettingPanel_p_Timer.Enabled:=False;

  if SettingPanel.Top<0 then SettingPanel_p_Timer.Enabled:=True;
  if SettingPanel.Top>-1 then SettingPanel_m_Timer.Enabled:=True;
 end;

 procedure PanelTop_p_Timer(Sender: TObject);
 begin
  SettingPanel.Top:=ScaleY(SettingPanel.Top + 5);
  if SettingPanel.Top>-1 then
    SettingPanel_p_Timer.Enabled:=False;
 end;

 procedure PanelTop_m_Timer(Sender: TObject);
 begin
  SettingPanel.Top:=ScaleY(SettingPanel.Top - 5);
  if SettingPanel.Top<-314 then
    SettingPanel_m_Timer.Enabled:=False;
 end;

 procedure InitializeWizard();
 begin
  SettingPanel_p_Timer := TTimer.Create(WizardForm);
  with SettingPanel_p_Timer do
  begin
    Interval := 1;
    Enabled:=False;
    OnTimer := @PanelTop_p_Timer;
  end;

  SettingPanel_m_Timer := TTimer.Create(WizardForm);
  with SettingPanel_m_Timer do
  begin
    Interval := 1;
    Enabled:=False;
    OnTimer := @PanelTop_m_Timer;
  end;

  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  with TNewButton.Create(WizardForm) do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption := 'open';
    OnClick := @NewButton1Click;
  end;
 end;

)
и в то время же накосячил!
не хочет закатываться!:(
зато выкатывается :)

вот что получилось:
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy

[  Code]
var
  SettingPanel: TPanel;
  Flag: boolean;
  hBtn: TButton;

type
  TimerProc = procedure(Sender: TObject);

function CallbackAddr(Callback: TimerProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer(Sender: TObject);
begin
  if SettingPanel.Top<0 then SettingPanel.Top:=ScaleY(SettingPanel.Top + ScaleY(3));
end;

procedure Timer2(Sender: TObject);
begin
  if SettingPanel.Top>-1 then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
end;


procedure HideShow(Sender: TObject);
begin
If not Flag then
  begin
    SetTimer(WizardForm.Handle, 1, 5 {задаём интервал}, CallbackAddr(@Timer, 0));
    KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Hide';
    Flag:= True;
  end
else
  begin
    SetTimer(WizardForm.Handle, 1, 5 {задаём интервал}, CallbackAddr(@Timer2, 0));
    KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Show';
    Flag:= False;
  end;
end;


procedure InitializeWizard();
 begin
  Flag:= False;
 
  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  hBtn:=TButton.Create(WizardForm);
  with hBtn do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;


помогите поправить пожалуйста!

Gnom_aka_Lexander 17-05-2012 08:13 1917423

Цитата:

Цитата Johny777
if SettingPanel.Top>-1 »

Цитата:

Цитата Johny777
SetBounds(ScaleX(0),ScaleY(-315) »

все правильно - создаешь ее как и нужно, а закатываешь только до значения -1. тоесть правильно будет -
Код:

if SettingPanel.Top>-315

Johny777 17-05-2012 11:49 1917529

Лександер,
Спасибо!
поправил
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy

[  Code]
var
  SettingPanel: TPanel;
  Flag: boolean;
  hBtn: TButton;

type
  TimerProc = procedure(Sender: TObject);

function CallbackAddr(Callback: TimerProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer(Sender: TObject);
begin
  if SettingPanel.Top<0 then SettingPanel.Top:=ScaleY(SettingPanel.Top + ScaleY(3));
end;

procedure Timer2(Sender: TObject);
begin
  if SettingPanel.Top>-315 then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
end;


procedure HideShow(Sender: TObject);
begin
If not Flag then
  begin
    SetTimer(WizardForm.Handle, 1, 5 {çàäà¸ì èíòåðâàë}, CallbackAddr(@Timer, 0));
    KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Hide';
    Flag:= True;
  end
else
  begin
    SetTimer(WizardForm.Handle, 1, 5 {çàäà¸ì èíòåðâàë}, CallbackAddr(@Timer2, 0));
    KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Show';
    Flag:= False;
  end;
end;


procedure InitializeWizard();
 begin
  Flag:= False;
 
  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  hBtn:=TButton.Create(WizardForm);
  with hBtn do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;


,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
и ещё вопрос
закометировал строки с KillTimer в процедуре и всё нормально
правильно ли?
может достаточно просто освобождать таймер при переходе на следующую страницу, а не каждый раз после выката и заката?
читать дальше »
Код:

procedure HideShow(Sender: TObject);
begin
If not Flag then
  begin
    SetTimer(WizardForm.Handle, 1, 5 {задаём интервал}, CallbackAddr(@Timer, 0));
  ////// KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Hide';
    Flag:= True;
  end
else
  begin
    SetTimer(WizardForm.Handle, 1, 5 {задаём интервал}, CallbackAddr(@Timer2, 0));
  ///// KillTimer(WizardForm.Handle, 0); //////////
    hBtn.Caption:='Show';
    Flag:= False;
  end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then
    KillTimer(WizardForm.Handle, 0);
end;


Gnom_aka_Lexander 17-05-2012 12:07 1917543

скорее так, тогда:
Код:

procedure Timer2;
begin
  if SettingPanel.Top=-315 then KillTimer(WizardForm.Handle, 1);
  if SettingPanel.Top>-315 then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
end;

будет более правильно, я думаю. при переходе на следующую страницу, ты можешь получить панель застрявшую на середине хода.

Johny777 17-05-2012 12:31 1917554

Лександер,
поправил
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy

[ Code]
var
  SettingPanel: TPanel;
  Flag: boolean;
  hBtn: TButton;

type
  TimerProc = procedure(Sender: TObject);

function CallbackAddr(Callback: TimerProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer(Sender: TObject);
begin
  if SettingPanel.Top<0 then SettingPanel.Top:=ScaleY(SettingPanel.Top + ScaleY(3));
end;

procedure Timer2(Sender: TObject);
begin
  if SettingPanel.Top>-315 then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
  //if SettingPanel.Top=-315 then KillTimer(WizardForm.Handle, 0);
end;


procedure HideShow(Sender: TObject);
begin
If not Flag then
  begin
    SetTimer(WizardForm.Handle, 1, 5, CallbackAddr(@Timer, 0));
    //KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Hide';
    Flag:= True;
  end
else
  begin
    SetTimer(WizardForm.Handle, 1, 5, CallbackAddr(@Timer2, 0));
    //KillTimer(WizardForm.Handle, 0);
    hBtn.Caption:='Show';
    Flag:= False;
  end;
end;


procedure InitializeWizard();
 begin
  Flag:= False;
 
  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm.WelcomePage;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  hBtn:=TButton.Create(WizardForm);
  with hBtn do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then
    KillTimer(WizardForm.Handle, 0);
end;


назначил родителем панели страницу приветствия (для теста перехода)
странным образом при переходе во время выката на wpSelectDir и обратно она не застревает, а как будто бы выкатывается/закатывается "за глазами"
а при быстром переходе продолжает выкатываться, хотя таймер должен был быть освобождён!
может это и есть вся прелесть CallbackAddr :), ведь эта функция числится среди расширенных?

Gnom_aka_Lexander 17-05-2012 12:37 1917563

Johny777, нет. во первых у тебя не обозначен идентификатор таймера, во вторых ты запускаешь таймер с nIDEvent равным 1 а закрываешь - 0, тоесть совсем другой таймер.
Цитата:

Цитата Johny777
может это и есть вся прелесть CallbackAddr , ведь эта функция числится среди расширенных? »

Ты используешь wrapcallback из innocallback.dll а не CallbackAddr из расширенной версии.

Johny777 17-05-2012 12:41 1917565

Лександер,
ясно
вернул единицу на место
могу ли я любое число (скажем 4) в хэндл ставить, чтоб другие таймеры не закрыть случайно?
те SetTimer(WizardForm.Handle, 4, 5 .... и KillTimer(WizardForm.Handle, 4);
Код:

procedure Timer2(Sender: TObject);
begin
  if SettingPanel.Top>-315 then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
  if SettingPanel.Top=-315 then KillTimer(WizardForm.Handle, 1);
end;


bugmenotagain 17-05-2012 12:47 1917569

alert30, мне нельзя спросить как запретить создавать unistall?

Gnom_aka_Lexander 17-05-2012 12:47 1917570

можно так:
Код:

var
  timer : Integer;
....................................
if SettingPanel.Top=-315 then KillTimer(WizardForm.Handle, timer);
.......................................
SetTimer(WizardForm.Handle, 4, timer...

Вроде ничего не напутал :)

Цитата:

Цитата bugmenotagain
мне нельзя спросить как запретить создавать unistall? »

Можно. Один раз. и смысла нет переспрашивать, получив правильный ответ. То, что у тебя не получилось этим ответом воспользоваться - это уже твоя беда все-таки, у меня все как нужно отработало - несколько раз проверил специально.
Johny777
таки я напутал :)
вот так правильно будет. Заодно сделал на встроенном в расширенную версию каллбеке.
читать дальше »

Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[*Code]
var
  SettingPanel  : TPanel;
  Flag          : boolean;
  Timer          : LongWord;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer1;
begin
  if SettingPanel.Top < 0 then SettingPanel.Top := SettingPanel.Top + ScaleY(3);
  if SettingPanel.Top = 0 then KillTimer(WizardForm.Handle, Timer);
end;

procedure Timer2;
begin
  if SettingPanel.Top > -315 then SettingPanel.Top := SettingPanel.Top - ScaleY(3);
  if SettingPanel.Top = -315 then KillTimer(WizardForm.Handle, Timer);
end;


procedure HideShow(Sender: TObject);
begin
  KillTimer(WizardForm.Handle, Timer);
  case Flag of
  True :
    begin
      Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('Timer2'));
      TButton(Sender).Caption:='Show';
    end;
  False :
    begin
      Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('Timer1'));
      TButton(Sender).Caption:='Hide';
    end;
  end;
  Flag:= not Flag;
end;


procedure InitializeWizard();
 begin
  Flag:= False;

  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  with TButton.Create(WizardForm) do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;


Johny777 17-05-2012 13:23 1917593

Лександер,
вылетало с ошибкой дубликата на слове timer (в процедуре таймер)
переименовал
не читать дальше »
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[Files]
Source: compiler:InnoCallback.dll; Flags: dontcopy

[  Code]
var
  SettingPanel: TPanel;
  Flag: boolean;
  hBtn: TButton;
  timerA : Integer;

type
  TimerProc = procedure(Sender: TObject);

function CallbackAddr(Callback: TimerProc; ParamCount: Integer): LongWord; external 'wrapcallback@files:innocallback.dll stdcall';
function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure Timer(Sender: TObject);
begin
  if SettingPanel.Top<0 then SettingPanel.Top:=ScaleY(SettingPanel.Top + ScaleY(3));
end;

procedure Timer2(Sender: TObject);
begin
  if SettingPanel.Top>ScaleY(-315) then SettingPanel.Top:=ScaleY(SettingPanel.Top - ScaleY(3));
  if SettingPanel.Top=ScaleY(-315) then KillTimer(WizardForm.Handle, timerA);
end;


procedure HideShow(Sender: TObject);
begin
If not Flag then
  begin
    SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr(@Timer, 0));
    hBtn.Caption:='Hide';
    Flag:= True;
  end
else
  begin
    SetTimer(WizardForm.Handle, 1, timerA , CallbackAddr(@Timer2, 0));
    hBtn.Caption:='Show';
    Flag:= False;
  end;
end;



timerA : Integer - для оптимизации или простоты?
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Цитата:

Цитата Лександер
вот так правильно будет. Заодно сделал на встроенном в расширенную версию каллбеке. »

вот спасибо! :)

Gnom_aka_Lexander 17-05-2012 13:29 1917597

Ну, и нет пределов совершенству, как говорит Seregа, - в одной процедуре таймера сделал, до кучи - как говорится, пользуйте, как лучше нравится :)
читать дальше »
Код:

[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program
OutputDir=.

[*Code]
var
  SettingPanel  : TPanel;
  Flag          : boolean;
  Timer          : LongWord;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';

procedure MyTimer;
begin
  case Flag of
  True :
    begin
      if SettingPanel.Top = 0 then
        KillTimer(WizardForm.Handle, Timer);
      if SettingPanel.Top < 0 then SettingPanel.Top := SettingPanel.Top + ScaleY(3);
    end;
  False :
    begin
      if SettingPanel.Top = ScaleY(-315) then
        KillTimer(WizardForm.Handle, Timer);
      if SettingPanel.Top > ScaleY(-315) then SettingPanel.Top := SettingPanel.Top - ScaleY(3);
    end;
  end;
end;

procedure HideShow(Sender: TObject);
begin
  KillTimer(WizardForm.Handle, Timer);
  Timer := SetTimer(WizardForm.Handle, 1, 5 , CallbackAddr('MyTimer'));
  case Flag of
    True : TButton(Sender).Caption:='Show';
    False : TButton(Sender).Caption:='Hide';
  end;
  Flag:= not Flag;
end;

procedure InitializeWizard();
 begin
  Flag:= False;

  SettingPanel := TPanel.Create(WizardForm);
  with SettingPanel do
  begin
    Parent := WizardForm;
    SetBounds(ScaleX(0),ScaleY(-315),ScaleX(497),ScaleY(313));
    ParentBackground := False;
  end;

  with TButton.Create(WizardForm) do
  begin
    OnClick:= @HideShow;
    SetBounds(ScaleX(40),ScaleY(327),ScaleX(75),ScaleY(25))
    Caption:='Show';
    Parent:= WizardForm;
  end;
end;



Цитата:

Цитата Johny777
для оптимизации или простоты? »

нет, это дескриптор таймера, по ид он не убивается, вроде.

Johny777 17-05-2012 13:35 1917602

Лександер,
ну та что на одной процедуре отличается от предыдущей тем, что её нельзя начать закатывать во время выката, а ту с двумя можно!
и везде SettingPanel.Top = -315 кажись правильнее будет записать SettingPanel.Top = ScaleY(-315)

El Sanchez,
думаю этим примерам прямая дорога в шапку, в "Ссылки на примеры скриптов" :)

Gnom_aka_Lexander 17-05-2012 13:38 1917605

Johny777, поправил, теперь можно на ходу менять направление :)
В одной процедуре - просто меньше шансов запутаться в дальнейшем.

Цитата:

Цитата Johny777
кажись правильнее будет записать SettingPanel.Top = ScaleY(-315) »

совершенно верно.

El Sanchez 17-05-2012 18:19 1917798

Johny777, нужно рассчитывать интервал таймера и сдвиг контрола в зависимости от размеров самого контрола. Если у меня, к примеру, панель высотой в 2 пикселя и надо все это дела выкатить/закатить за, скажем, 1 сек., то фиксированный сдвиг в 3 пикселя и фиксированный интервал таймера в 5 мс не катят. Убил полдня на алгоритм, вот вариант.
читать дальше »

Код:

[code]
var
    SettingPanel: TPanel;
    hBtn: TButton;
    //iStartTime: Integer; //debug
    iTimer, iRollInfo: Integer;

function SetTimer(hWnd, nIDEvent, uElapse, lpTimerFunc: LongWord): LongWord; external 'SetTimer@user32.dll stdcall';
function KillTimer(hWnd, nIDEvent: LongWord): LongWord; external 'KillTimer@user32.dll stdcall';
//function GetTickCount: DWORD; external 'GetTickCount@kernel32.dll stdcall'; //debug


procedure TimerProc(hwnd: HWND; uMsg: UINT; idEvent: UINT_PTR; dwTime: DWORD);
var
    iLen, iStep: Integer;
begin
    iLen := iRollInfo and $FFFF;
    iStep := (iRollInfo and $FF0000) shr $10;
    case iRollInfo shr $18 of
        $0: begin
                if SettingPanel.Left >= -iStep then
                begin
                    KillTimer(0, iTimer);
                    hBtn.Enabled := True;
                end;
                SettingPanel.Left := SettingPanel.Left + iStep;
                //WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Left); //debug
            end;
        $1: begin
                if SettingPanel.Left <= -iLen + iStep then
                begin
                    KillTimer(0, iTimer);
                    hBtn.Enabled := True;
                end;
                SettingPanel.Left := SettingPanel.Left - iStep;
                //WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Left); //debug
            end;
        $2: begin
                if SettingPanel.Top >= -iStep then
                begin
                    KillTimer(0, iTimer);
                    hBtn.Enabled := True;
                end;
                SettingPanel.Top := SettingPanel.Top + iStep;
                //WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Top); //debug
            end;
        $3: begin
                if SettingPanel.Top <= -iLen + iStep then
                begin
                    KillTimer(0, iTimer);
                    hBtn.Enabled := True;
                end;
                SettingPanel.Top := SettingPanel.Top - iStep;
                //WizardForm.Caption := 'time: ' + IntToStr(dwTime-iStartTime) + '; length: ' + IntToStr(SettingPanel.Top); //debug
            end;
    end;
end;

procedure RollControl(Ctrl: TControl; dwTime, dwFlag: DWORD);
//  Ctrl    :  control
//  dwTime  :  rolling time, ms
//  dwFlag  :  roll type ($0 - left to right, $1 - right to left, $2 - top to bottom, $3 - bottom to top)
var
    iLen, iStep: Integer;
    iKoeff: Extended;
begin
    iLen := (dwFlag shr $1 xor $1)*Ctrl.Width + (dwFlag shr $1)*Ctrl.Height;
    repeat
        iStep := iStep + 1;
        iKoeff := (iStep * dwTime)/(iLen * 1000/64);
    until iKoeff >= 1;
    //
    if iRollInfo = 0 then iRollInfo := (dwFlag shl $18) or (iStep shl $10) or iLen else iRollInfo := iRollInfo xor $1000000;
    iTimer := SetTimer(0, 0, Trunc(iKoeff)*1000/64, CallbackAddr('TimerProc'));
end;

procedure HideShow(Sender: TObject);
begin
    //iStartTime := GetTickCount; //debug
    RollControl(SettingPanel, 1000, $2);
    TButton(Sender).Enabled := False;
end;

procedure InitializeWizard();
begin
    SettingPanel := TPanel.Create(WizardForm);
    with SettingPanel do
    begin
        Parent := WizardForm;
        SetBounds(ScaleX(0), ScaleY(-315), ScaleX(497), ScaleY(315));
        ParentBackground := False;
    end;

    hBtn := TButton.Create(WizardForm);
    with hBtn do
    begin
        OnClick := @HideShow;
        SetBounds(ScaleX(40), ScaleY(327), ScaleX(75), ScaleY(25));
        Caption := 'Show';
        Parent := WizardForm;
    end;
end;


Johny777 17-05-2012 18:38 1917804

Цитата:

Цитата El Sanchez
Убил полдня на алгоритм »

опять же "неоценимая помощь"
Спасибо! :blush2:

очень удобно то, что в процедуре настраивать ничего не нужно
записал в "HideShow" "$0"
(у меня ведь выкат слева)

а в закомментированных строках с препиской //debug на конце можно вписать изменение названия кнопки/выпадающего меню (у меня)
(MnuItem.Caption := ExpandConstant('{cm:Console0}'); MnuItem.Caption := ExpandConstant('{cm:Console1}'))
В общем разобрался немного! :
если попытаться закатить панель в процессе выката, то у неё слетают тормоза

bugmenotagain 18-05-2012 22:24 1918529

какой выбрать уровень сжатия
fast
normal
max
ultra
чтобы данные не повредить чрезмерным сжатием

и галочку ставить "уплотненное сжатие файлов"?

Johny777 18-05-2012 23:31 1918557

Цитата:

Цитата bugmenotagain
чтобы данные не повредить чрезмерным сжатием »

а такое бывает?
хз, тк не интересовался особо, но вроде прекомп может повредить и то при условиях...
но, что стоит в справке= одобрено
те сжимай как хош :)
вот например настройка на максимальное сжатие стандартными (встроенными. а инно использует lzma/lzma2 алгоритмы = 7Zip архиватор) средствами
читать дальше »

Compression=lzma2/ultra64
LZMAUseSeparateProcess=yes
LZMAMatchFinder=BT
LZMANumFastBytes=273
LZMADictionarySize=262144
///LZMADictionarySize=131072
InternalCompressLevel=ultra64
///SolidCompression=true
MergeDuplicateFiles=true

только словарь настрой тестами под себя
также если есть "тяжёлые" компоненты, то не используй SolidCompression=true, который может повысить уровень сжатия
и учти, что чем выше сжатие, тем дольше распаковка
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Цитата:

Цитата bugmenotagain
и галочку ставить "уплотненное сжатие файлов"? »

есть классный GUI для создания скриптов "Inno Script Studio"
https://www.kymoto.org/inno-script-studio/download
попробуй

bugmenotagain 19-05-2012 12:22 1918674

Цитата:

Цитата Johny777
только словарь настрой тестами под себя »

что такое словарь и как его настораивать

Johny777 19-05-2012 14:26 1918724

Цитата:

Цитата bugmenotagain
что такое словарь »

в гугл забей "словарь архиватора"

Цитата:

Цитата bugmenotagain
и как его настораивать »

2 строки
используй одну из них
LZMADictionarySize=262144 ///(этот когда много мелких файлов)
LZMADictionarySize=131072
тесты покажут при каком сильнее жмёт

bugmenotagain 19-05-2012 14:35 1918733

все эти программы для inno setup которые Я скачал однотипные и примитивные. нет нормального графического оформления, настройка страниц, отключение деинсталляции для определенных компонентов и еще много чего.

Цитата:

Цитата Johny777
2 строки
используй одну из них
LZMADictionarySize=262144 ///(этот когда много мелких файлов)
LZMADictionarySize=131072
тесты покажут при каком сильнее жмёт »

не проще FreeArc'ом сжать? говорят мощная штука

bugmenotagain 19-05-2012 18:34 1918845


как эту панельку на странице компонентов убрать?

alert30 19-05-2012 18:43 1918852

bugmenotagain, хотите вообще, чтобы страница компонентов не было? Тогда в секцию Components.

R.i.m.s.k.y. 19-05-2012 18:47 1918858

bugmenotagain,
Код:

procedure InitializeWizard();
...
WizardForm.TypesCombo.Hide;
...


bugmenotagain 19-05-2012 18:55 1918864

alert30, Я хочу чтобы там были флажки и чекбоксы.

Johny777 19-05-2012 19:18 1918877

Dark_Delphin,
думаю могу намутячить тебе вызов формы (зачем месседж бокс, ведь форма лучше) при нажатии (OnClick) на картинку, но картинку через бмп.
пнг это ботва а с ней не дружу
но сделаю это позже
ты скажи ,если что, что должно быть на форме (картинки или текст) :)

Dark_Delphin 19-05-2012 19:24 1918880

Johny777, у меня иснатялтор прозрачный внизу. Хотелось бы сделать там png лого с вызовом msgbox...

Dark_Delphin 19-05-2012 19:24 1918882

Johny777, если png не получается, то наврное всё-таки сделаю просто кнопку..

bugmenotagain 19-05-2012 19:25 1918883

Dark_Delphin, как ты сделал прозрачный инсталлятор внизу?

Dark_Delphin 19-05-2012 19:31 1918887

bugmenotagain, iswin7.dll

Dark_Delphin 19-05-2012 20:43 1918911

Подскажите как называются строки см.скриншоты


Johny777 19-05-2012 22:16 1918986

Dark_Delphin,

читать дальше »

давай по порядку
насчёт строк
1. это GroupDescription
Код:

[Tasks]
Name: make_icon; Description: {cm:CreateDesktopIcon}; GroupDescription: Создание ярлыков:

2.
Код:

[Messeges]
WizardSelectComponents=Выбор компонентов

этот лейбл у тебя прозрачный, а значит не родной (родные не могут быть прозрачными). Он кастомный
но константа из стандартного диалога
это делается так: Caption := ExpandConstant(SetupMessage(msgWizardSelectComponents));
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,открываешь например Russian.isl блокнотом и смотришь. В нём весь стандартный диалог инсталла
3.
процедура "Info" вызова месседж бокса
назначь во вкладке события кнопке в событии OnClick эту процедуру
Код:

procedure Info(Sender: TObject);
begin
    MsgBox('Создатель этого инсталла Петя Васькин' + #13#10 + 'Вырезано всё что можно и нельзя' + #13#10 + 'Время установки = вся ночь, но может быть и дольше' + #13#10 + 'Мне пофиг!',mbInformation,MB_OK);
end;

где (+ #13#10 +) это переходы на следующие строки

Ivan_009 19-05-2012 23:12 1919008

Как убрать мерцание картинок при переходе с одной страницы на другую...Я использую на всех странницах bmp вот код...

Johny777 20-05-2012 00:43 1919044

Ваня
пиши координаты не так
WizardForm.GroupBrowseButton.Width :=90
WizardForm.GroupBrowseButton.Height :=23

а вот так
WizardForm.GroupBrowseButton.Width :=ScaleX(90);
WizardForm.GroupBrowseButton.Height :=ScaleY(23);
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
и в твоём куске сплошные координаты
либо я не вижу, либо дело в том, что ты предоставил огрызок да ещё и маленький, но понять почему у тебя мигают картинки не получается! :(
...............................................................
и за что отвечает ImagePanel (панель)?
и почему на ней картинка?

volk1234 20-05-2012 03:29 1919104

Прекращаем флуд!
Пожалуйста сконцентрируйтесь на теме.

товарищ bugmenotagain за словесное недержание отправлен подумать и помолчать на 3 дня.

valyok666 20-05-2012 06:05 1919116

Ivan_009, зачем ты выкладываешь скрипт в формате *txt???

Gnom_aka_Lexander 20-05-2012 13:13 1919205

valyok666, скорей всего потому, что форум не разрешает цеплять *.iss во вложение.
Ivan_009, с файлами залей, судя по коду, весело у тебя все там - перегрузка рюшками я это называю.

Ivan_009 20-05-2012 14:39 1919239

Лександер вот скрипт

Gnom_aka_Lexander 20-05-2012 15:02 1919251

Вложений: 1
Ivan_009, для твоего случая El Sanchez давал както решение. должно помочь, вроде. Я на юникоде компилил, там моргания не обнаружил, но все-же добавил эту строчку. Скрипт во вложении, пробуй.

El Sanchez 20-05-2012 20:32 1919407

Цитата:

Цитата Johny777
если попытаться закатить панель в процессе выката, то у неё слетают тормоза »

Johny777, ок, поправил, кнопка во время анимации неактивна.

Vadikan 22-05-2012 23:16 1920769

Продолжение в http://forum.oszone.net/thread-235078.html


Время: 08:33.

Время: 08:33.
© OSzone.net 2001-