Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Закрытая тема
Настройки темы
Скрипты Inno Setup. Помощь и советы [часть 5]

Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030


Конфигурация

Профиль | Отправить PM | Цитировать


Изменения
Автор: El Sanchez
Дата: 16-02-2015
Внимание! Данная тема предназначена только для обсуждения написания скриптов !
Остальные вопросы, а также последние версии компилятора в теме
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. Помощь и советы [часть 4]

Отправлено: 03:49, 21-05-2012

 

Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Tco 03, ну ты блин даёшь!"_": Сравниваешь значение из ини с нулём! Вылетает шибка и вызывается процедура создания формы, где ты впервые пишешь кол-во свободного места в переменную FreeMB. После этого она не пустая и соответственно идёт уже нужная проверка и выводится нужный результат!
Пойми ошибку в своём коде. Когда поймёшь вот переписал тебе твой код на свой лад, в полностью рабочем виде
Используется вин апи функция GetDiskFreeSpaceEx, которая пишет во входные переменные свободный и полный размер харда в байтах, что точнее чем округлённые значения в мегабайтах
читать дальше »
Код: Выделить весь код
[Setup]
AppName=MyApp
AppVerName=MyApp
DefaultDirName={pf}\MyApp

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

type
    _LARGE_INTEGER = record
        LowPart: Longint;
        HighPart: DWORD;
    end;
var
  NewCheckBox1: TNewCheckBox;

function GetDiskFreeSpaceEx(lpDirectoryName: String; var lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes, lpTotalNumberOfFreeBytes: _LARGE_INTEGER): BOOL; external 'GetDiskFreeSpaceEx{#A}@kernel32.dll stdcall';

function Size64(QuadPart: _LARGE_INTEGER): Extended;
begin
    Result := (QuadPart.HighPart + integer(QuadPart.LowPart < 0))*4.294967296E9 + QuadPart.LowPart;
end;

function MyFormExec(): Integer;
var
  MyForm: TForm;
begin
  MyForm:= TForm.Create(nil);
  with MyForm do
  begin
    Width:= ScaleX(798);
    Height:= ScaleY(543);
    Position:= poScreenCenter;
    Result := ShowModal;
    Free;
  end;
end;

procedure MyButtonOnClick(Sender: TObject);
var
  FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes: _LARGE_INTEGER;
  uBOOL: Boolean;
  NeedSize: Extended;
begin
  if GetDiskFreeSpaceEx(ExtractFileDrive(WizardDirValue), FreeBytesAvailableToCaller, TotalNumberOfBytes, TotalNumberOfFreeBytes) then
  NeedSize := GetIniInt('Info', 'Size', 0, 0, 0, 'C:\Info.inf')*1024*1024;
  if Size64(TotalNumberOfFreeBytes) < NeedSize then
  begin
    MsgBox(ExpandConstant('NO!!!'), mbCriticalError, mb_Ok);
    MyFormExec;
  end else
  begin
    MsgBox(ExpandConstant('YES!!!'), mbInformation, mb_Ok);
    NewCheckBox1.Checked:= True;
  end;
end;

procedure InitializeWizard();
var
  MyButton: TButton;
begin
  with WizardForm do
  begin
    MyButton := TButton.Create(WizardForm)
    with MyButton do
    begin
      Parent:= DirBrowseButton.Parent;
      SetBounds(DirBrowseButton.Left, ScaleY(DirBrowseButton.Top + 30), DirBrowseButton.Width, DirBrowseButton.Height)
      Caption:= 'Click Me';
      OnClick:= @MyButtonOnClick;
    end;
    NewCheckBox1:= TNewCheckBox.Create(WizardForm);
    with NewCheckBox1 do
    begin
      Parent:= SelectDirPage;
      SetBounds(MyButton.Left + ScaleY(30), MyButton.Top + ScaleY(30), ScaleX(12), ScaleY(12));
    end;
  end;
end;

и как понимать ExpandConstant('NO!!!') ?

Последний раз редактировалось Johny777, 20-02-2013 в 22:45. Причина: исправление кода

Это сообщение посчитали полезным следующие участники:

Отправлено: 15:34, 20-02-2013 | #1691



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

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


Аватара для Tco 03

Пользователь


Сообщения: 90
Благодарности: 24

Профиль | Отправить PM | Цитировать


Johny777
Ну то что я сравниваю значения с ещё несоздавшийся формы - это я догнал
Как сравнить мои FreeMB с TotalMB, тут догнать не могу
Тупо воспользуюсь Вашим кодом, чего голову ломать...
Цитата Johny777:
и как понимать ExpandConstant('NO!!!') ? »
Там просто: MsgBox(ExpandConstant('{cm:Error}'), mbCriticalError, mb_Ok); Ну там rus, eng: compiler:Languages

Отправлено: 16:28, 20-02-2013 | #1692


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата Johny777:
Используется вин апи функция GetDiskFreeSpaceEx, которая пишет во входные переменные свободный и полный размер харда в байтах, что точнее чем округлённые значения в мегабайтах »
Johny777, объяви _LARGE_INTEGER вместо _ULARGE_INTEGER как показано ниже, иначе GetDiskFreeSpaceEx неправильно посчитает при отрицательном LowPart. В Inno для GetDiskFreeSpaceEx нужны знаковые 64-битные числа. , а не то, что в MSDN указано.
Код: Выделить весь код
type
    _ULARGE_INTEGER = record
        LowPart: Longint;
        HighPart: DWORD;
    end;

function Size64(QuadPart: _ULARGE_INTEGER): Extended;
begin
    Result := (QuadPart.HighPart + integer(QuadPart.LowPart < 0))*4.294967296E9 + QuadPart.LowPart;
end;

Последний раз редактировалось El Sanchez, 21-02-2013 в 13:57. Причина: fix

Это сообщение посчитали полезным следующие участники:

Отправлено: 19:34, 20-02-2013 | #1693


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


El Sanchez, Спасибо за правку. Исправил в коде инсталла халфы!
вот только разве не наоборот?
Код: Выделить весь код
typedef union _LARGE_INTEGER {
  struct {
    DWORD LowPart;
    LONG  HighPart;
  };
http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

те HighPart - Longint a LowPart - DWORD

=========================================================================

Tco 03, свой предыдущий пост тоже исправил!

Последний раз редактировалось Johny777, 21-02-2013 в 01:49.

Это сообщение посчитали полезным следующие участники:

Отправлено: 22:44, 20-02-2013 | #1694


Новый участник


Сообщения: 49
Благодарности: 0

Профиль | Отправить PM | Цитировать


Хочу воспользоваться скриптом в Inno Setup для "выделения/снятия выделения" всех компонентов

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

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

[Types]
Name: full; Description: Полная установка
Name: custom; Description: Выборочная установка; Flags: iscustom

[Components]
Name: a; Description: Моя программа™; Types: full custom
Name: a\a; Description: Руководство пользователя; Types: full
Name: a\a\a; Description: Русский; Flags: exclusive
Name: a\a\b; Description: English; Flags: exclusive
Name: a\b; Description: Справка; Types: full

[Files]
Source: compiler:Examples\MyProg.exe; DestDir: {app}; Components: a
Source: compiler:Examples\Readme-ru.txt; DestDir: {app}; Components: a\a\a
Source: compiler:Examples\Readme-en.txt; DestDir: {app}; Components: a\a\b
Source: compiler:Examples\MyProg.chm; DestDir: {app}; Components: a\b

[code]
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 InitializeWizard();
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;
но у меня проблема возникла. у меня в компонентах 6 групп и в каждой по 2-3 радиобутона. я эти группы свернул флагом "Flags: Collapsed". В итоге снимается выделение и ставится только с первых 3-х групп. без этого сворачивания всё работает нормально. подскажите пожалуйста что подредактировать, чтобы скрипт заработал?

Отправлено: 23:43, 20-02-2013 | #1695


Новый участник


Сообщения: 49
Благодарности: 0

Профиль | Отправить PM | Цитировать


И ещё вопрос:
Имеется структура компонентов.

-Компонент 1
--Компонент 1.1
--Компонент 1.2
-Компонент 2
--Компонент 2.1
--Компонент 2.2
--Компонент 2.3
--Компонент 2.4

Как сделать чтобы если выбран 1.1 то доступны для выбора были 2.1 и 2.2, а если выбрано 1.2, то доступны стали 2.3 и 2.4. И соответственно при нажатии на 1.1 или 1.2 происходил выбор 2.1 или 2.3 соответственно?

Отправлено: 12:35, 21-02-2013 | #1696


Аватара для El Sanchez

Ветеран


Contributor


Сообщения: 1274
Благодарности: 1030

Профиль | Отправить PM | Цитировать


Цитата Johny777:
вот только разве не наоборот? »
Johny777, спасибо, все-таки _ULARGE_INTEGER, но LowPart должен быть Longint.
Это сообщение посчитали полезным следующие участники:

Отправлено: 14:01, 21-02-2013 | #1697


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Lex_from_Belarus, либо я не догоняю либо код для выбора всех компонентов не дружит со свёрнутым деревом компонентов
в любом случае оптимизировал процедуру выбора и очиски выбора всех компонентов и ответил на вопрос в твоём последнем сообщении:
читать дальше »

Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
DirExistsWarning=no


[Components]
Name: a; Description: -Компонент 1;
Name: a\a; Description: --Компонент 1.1;
Name: a\b; Description: --Компонент 1.2;
Name: b; Description: -Компонент 2;
Name: b\d; Description: --Компонент 2.1;
Name: b\e; Description: --Компонент 2.2;
Name: b\f; Description: --Компонент 2.3;
Name: b\e; Description: --Компонент 2.4;


[  code]
procedure ComponentsOnClick(Sender: TObject);
begin
  with WizardForm.ComponentsList do
  begin
    // Как сделать чтобы если выбран 1.1 то доступны для выбора были 2.1 и 2.2, а если выбрано 1.2, то доступны стали 2.3 и 2.4
    ItemEnabled[Items.IndexOf('--Компонент 2.1')] := Checked[Items.IndexOf('--Компонент 1.1')];
    ItemEnabled[Items.IndexOf('--Компонент 2.2')] := Checked[Items.IndexOf('--Компонент 1.1')];
    ItemEnabled[Items.IndexOf('--Компонент 2.3')] := Checked[Items.IndexOf('--Компонент 1.2')];
    ItemEnabled[Items.IndexOf('--Компонент 2.4')] := Checked[Items.IndexOf('--Компонент 1.2')];

    // И соответственно при нажатии на 1.1 или 1.2 происходил выбор 2.1 или 2.3 соответственно
    if Checked[Items.IndexOf('--Компонент 1.1')] then Checked[Items.IndexOf('--Компонент 2.1')] := True;
    if Checked[Items.IndexOf('--Компонент 1.2')] then Checked[Items.IndexOf('--Компонент 2.3')] := True;
    Refresh;
  end;
end;

procedure btnClick(Sender: TObject);
var
  i: Byte;
  Check: Boolean;
begin
  Check := TButton(Sender).Caption = 'Все';
  for i := 0 to WizardForm.ComponentsList.Items.Count-1 do WizardForm.ComponentsList.Checked[i] := Check;
  WizardForm.ComponentsList.OnClickCheck(nil);
end;

procedure InitializeWizard();
var
  i, k: Byte;
begin
  for i:= 0 to 1 do with TButton.Create(WizardForm) do
  begin
    Parent:= WizardForm.SelectComponentsPage;
    SetBounds(ScaleX(295+k), ScaleY(210), ScaleX(60), ScaleY(25));
    OnClick := @btnClick;
    case i of
      0: Caption:= 'Все';
      1: Caption:= 'Ничего';
    end;
    k:= 62;
  end;
  WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClick;
  WizardForm.ComponentsList.OnClickCheck(nil);
end;

Последний раз редактировалось Johny777, 21-02-2013 в 15:05.

Это сообщение посчитали полезным следующие участники:

Отправлено: 14:49, 21-02-2013 | #1698


Новый участник


Сообщения: 49
Благодарности: 0

Профиль | Отправить PM | Цитировать


Цитата Johny777:
Lex_from_Belarus, либо я не догоняю либо код для выбора всех компонентов не дружит со свёрнутым деревом компонентов
в любом случае оптимизировал процедуру выбора и очиски выбора всех компонентов и ответил на вопрос в твоём последнем сообщении: »
короче все/ничего решил убрать и использую для этих целей Type (полная установка/очистить список), получается тоже самое, только с Collapsed.

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

Компонент1
Компонент2
-Компонент21 (радиобутон)
-Компонент22 (радиобутон)
-Компонент23

Так вот 21 и 22 работает когда выбран 1, а 23, когда 1 не выбран.
Подскажите как подредактировать ваш код, пожалуйста.

Отправлено: 18:26, 21-02-2013 | #1699


Аватара для Johny777

Ветеран


Сообщения: 649
Благодарности: 444

Профиль | Отправить PM | Цитировать


Цитата Lex_from_Belarus:
все/ничего решил убрать и использую для этих целей Type »
поддерживаю!
Цитата Lex_from_Belarus:
Так вот 21 и 22 работает когда выбран 1, а 23, когда 1 не выбран. »
вот тебе отдельный пример чтоб понятнее было и он по принципу работы не особо отличается от предыдущего! Изучай.
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
OutputDir=.
DirExistsWarning=no

[Components]
Name: a; Description: 1;
Name: b; Description: 2;
Name: b\d; Description: 21; Flags: exclusive;
Name: b\e; Description: 22; Flags: exclusive;
Name: b\f; Description: 23;

[  code]
procedure ComponentsOnClick(Sender: TObject);
begin
  with WizardForm.ComponentsList do
  begin
    ItemEnabled[Items.IndexOf('21')] := not Checked[Items.IndexOf('1')];
    ItemEnabled[Items.IndexOf('22')] := not Checked[Items.IndexOf('1')];
    ItemEnabled[Items.IndexOf('23')] := Checked[Items.IndexOf('1')];
    Refresh;
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.ComponentsList.OnClickCheck := @ComponentsOnClick;
  WizardForm.ComponentsList.OnClickCheck(nil);
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:22, 21-02-2013 | #1700



Компьютерный форум OSzone.net » Автоматическая установка Windows » Автоматическая установка приложений » Скрипты Inno Setup. Помощь и советы [часть 5]

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 4] El Sanchez Автоматическая установка приложений 2099 22-05-2012 23:16
Скрипты Inno Setup. Помощь и советы [часть 3] Serega Автоматическая установка приложений 3755 26-10-2011 17:58
[архив] Скрипты Inno Setup. Помощь и советы [часть 2] Serega Автоматическая установка приложений 2651 08-11-2010 18:34
Скрипты Inno Setup Compiler QAZAK Автоматическая установка приложений 7 15-01-2007 17:59
Inno Setup tradeukraine Вебмастеру 3 13-06-2006 20:39




 
Переход