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

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

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

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

Ветеран


Contributor


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


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

Профиль | Отправить 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] - Скачать;


Предыдущие ветки обсуждения по ссылкам ниже и в прикреплённых архивах:

Отправлено: 19:06, 28-03-2013

 

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


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

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


Mailchik, Благодарю!

Только на каждую из
SOFTWARE\Adobe\Adobe ARM\1.0\ARM

SOFTWARE\Adobe\Acrobat Reader\11.0\Installer\Optimization

должно быть своё сообщение.

habib2302,

-------
Login: Crazy Noise; Copyright ©2013, Crazy Noise.


Последний раз редактировалось Crazy Noise, 29-03-2013 в 23:38.

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

Отправлено: 23:31, 29-03-2013 | #21



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

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


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


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

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


saurn, Еще раз спасибо Вам за помощь. Вы были правы, причина была в библиотеке ISSkin (не та версия).

Может быть Вы сможете помочь и по следующему вопросу, буду вам очень признателен: Мне нужна переменная из Inno Setup в которую записывается значение (количество памяти на диске) необходимое для данной программы. Оно выводится в DiskSpaceLabel на странице "SelecDirSpace". Есть такое? Заранее спасибо!

Отправлено: 01:25, 30-03-2013 | #22


Ветеран


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

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


Alloc

Вам нужна функция вычисления объёма диска?
Код: Выделить весь код
function GetSpaceOnDisk(const Path: String; const InMegabytes: Boolean; var Free, Total: Cardinal): Boolean;
Простой пример:
Код: Выделить весь код
[Setup]
AppName=My Application
AppVersion=1.5
DefaultDirName={pf}\My Application

[...Code]
function NextButtonClick(CurPageID:integer): Boolean;
var
  Disk: String;
  FreeMB, TotalMB: Cardinal;
begin
  Result:= True;
  case CurPageID of
    wpSelectDir:
    begin
      Disk := ExtractFileDrive(WizardForm.DirEdit.Text);
      if GetSpaceOnDisk(Disk, True, FreeMB, TotalMB) then
      begin
        MsgBoxEx(0, 'Свободно ' + IntToStr(FreeMB) + ' мегабайт на диске ' + Disk, '', MB_OK or MB_ICONINFORMATION ,0 ,0);
      end
    end;
  end;
end;

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


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


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

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


saurn, спасибо за ответ, но это не совсем то. извиняюсь, может быть не очень понятно объяснил.. мне нужна функция которая отобразит в DiscSpaceLabel точное количество памяти которое программа займет на диске при распаковке... помогите пожалуйста. Есть простой вариант самому прописывать необходимое количество памяти
Код: Выделить весь код
#define NeedSize "5059"
, но хотелось бы что б программа сама определяла.. Заранее спасибо.

Отправлено: 02:40, 30-03-2013 | #24


Ветеран


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

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


Цитата Alloc:
но хотелось бы что б программа сама определяла.. Заранее спасибо. »
Ясно. Вам необходимо сравнить свободное место на диске с фактическим объёмом приложения, который инно вычисляет сама. Как это это сделать, я ,увы ,тоже не знаю. Так же, указываю нужный объём вручную. Где-то у меня был пример от Shegorat'а, там была реализована подобная функция, но насколько я помню, он выплевывал ошибку, если объём файлов был большим.

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Вот пример. Может пригодится:
читать дальше »
Код: Выделить весь код
//;#Define NeedSize 5000
;Если у вас архивы FreeArc, то сдесь укажите сколько необходимо места в Мб
;Иначе просто закоментируйте строку
;Автор: Shegorat
[Setup]
AppName=My Program
AppVerName=My Program v 1.5
DefaultDirName={pf}\My Program
DisableFinishedPage=yes
OutputDir=.
Compression=lzma/ultra
InternalCompressLevel=ultra
SolidCompression=yes

[Languages]
Name: ENG; MessagesFile: "compiler:Default.isl"
Name: RUS; MessagesFile: "compiler:Languages\Russian.isl"

[Files]
Source: {win}\help\*.hlp; DestDir: {app}\Files; Flags: external

[CustomMessages]
RUS.FreeSpace=Доступно места на диске:
RUS.NeedSpace=Требуется места на диске:
ENG.FreeSpace=Free space on disk:
ENG.NeedSpace=Need space on disk:

[...Code]
var
NeedSpaceLabel,FreeSpaceLabel: TLabel;
FreeMB, TotalMB: Cardinal;
SizeStr: String;
SizeInt: Integer;
SymbolNumber: Integer;

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 GetSize(): Integer;
begin
SizeStr:= WizardForm.DiskSpaceLabel.Caption;
for SymbolNumber:= 97 to 122 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1); //Находим все символы нижнего регистра и удаляем
while (Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr) > 0) do Delete(SizeStr, Pos(AnsiUppercase(Chr(SymbolNumber)), SizeStr),1); end; //Находим все символы верхнего регистра и удаляем
for SymbolNumber:= 192 to 255 do begin
while (Pos(Chr(SymbolNumber), SizeStr) > 0) do Delete(SizeStr, Pos(Chr(SymbolNumber), SizeStr),1); end; //Находим все символы нижнего регистра и удаляем
while (Pos('.', SizeStr) > 0) do Delete(SizeStr, Pos('.', SizeStr), 1) //Удаляем точки
Delete(SizeStr, Pos(',', SizeStr), 5) //Удаляем дробную часть
Result:= StrToInt(Trim(SizeStr)); //Переводим в число
end;

function CompareNum(FirstNum, SecondNum: Integer): Boolean;
begin
if FirstNum < SecondNum then Result:= False else Result:= True;
end;

Function MbOrTb(Byte: Extended): String;
begin
if Byte < 1024 then Result:= NumToStr(Byte) + ' Мб' else
if Byte/1024 < 1024 then Result:= NumToStr(round(Byte/1024*100)/100) + ' Гб' else
Result:= NumToStr(round((Byte/(1024*1024))*100)/100) + ' Тб'
end;

procedure GetFreeSpaceCaption(Sender: TObject);
var Path: String;
begin
Path := ExtractFileDrive(WizardForm.DirEdit.Text);
GetSpaceOnDisk(Path, True, FreeMB, TotalMB);
FreeSpaceLabel.Caption:= ExpandConstant('{cm:FreeSpace} ') + MbOrTb(FreeMB)
NeedSpaceLabel.Caption := ExpandConstant('{cm:NeedSpace} ') + MbOrTb(SizeInt)
if WizardForm.CurPageID = wpSelectDir then begin
WizardForm.NextButton.Enabled:= CompareNum(FreeMB, SizeInt)
end;
end;

procedure InitializeWizard();
begin
WizardForm.DiskSpaceLabel.Hide;
#ifdef NeedSize
SizeInt:= {#NeedSize}
#else
SizeInt:= GetSize;
#endif

NeedSpaceLabel := TLabel.Create(WizardForm);
NeedSpaceLabel.SetBounds(ScaleX(0), ScaleY(198), ScaleX(209), ScaleY(13))
NeedSpaceLabel.Parent := WizardForm.SelectDirPage;
NeedSpaceLabel.Transparent:=true;

FreeSpaceLabel := TLabel.Create(WizardForm);
FreeSpaceLabel.SetBounds(ScaleX(0), ScaleY(216), ScaleX(209), ScaleY(13))
FreeSpaceLabel.Parent := WizardForm.SelectDirPage;
FreeSpaceLabel.Transparent:=true;

WizardForm.DirEdit.OnChange:= @GetFreeSpaceCaption;
WizardForm.DirEdit.Text:= WizardForm.DirEdit.Text + #0;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpSelectDir then begin
GetFreeSpaceCaption(nil)
end;
end;

Последний раз редактировалось saurn, 30-03-2013 в 03:33.


Отправлено: 03:22, 30-03-2013 | #25


Аватара для Johny777

Ветеран


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

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


Alloc, saurn, текущее кол-во требуемого места можно выдрать из текста в WizardForm.ComponentsDiskSpaceLabel (да не быть мне извращенцем )

при помощи самопальной function GetFloatFormText(const UndefText: String): String;

тк инсталл даже без секции файлов по дефолту всегда требует минимум 0.9 мб, то можно смело использовать функцию преобразования строки в Extended ( StrToFloat(...) )
для последующего сравнения свободного и требуемого места без боязни получить исключение конвертации нечисел в числа
вот полный пример динамичной(тк во время/в зависимости от выбора компонентов и текущего харда) проверки свободного места:

читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program


[Components]
// пусть этот клмпонент занимает много места для теста :)
Name: A; Description: 1; Flags: disablenouninstallwarning; ExtraDiskSpaceRequired: 564591185599

Name: B; Description: 2; Flags: disablenouninstallwarning; ExtraDiskSpaceRequired: 564591185
Name: C; Description: 2; Flags: disablenouninstallwarning; ExtraDiskSpaceRequired: 564591185
Name: D; Description: 4; Flags: disablenouninstallwarning; ExtraDiskSpaceRequired: 564591185


[Code]
var
  OldCompListOnClickCheckProc: TNotifyEvent;

function GetFloatFormText(const UndefText: String): String;  // число из строки
var
  i: Integer;
begin
  for i := 1 to Length(UndefText) do
  case UndefText[i] of
    '0','1','2','3','4','5','6','7','8','9': Result := Result + UndefText[i];
    ',': Result := Result + '.';
  end;
end;


function GetFreeDriveSpace(const UndefInstallPath: String): Cardinal; // упрощённая функция получения свободного места из входного аргумента (из пути)
var
  TotalMB: Cardinal;
begin
  GetSpaceOnDisk(ExtractFileDrive(UndefInstallPath), True, Result, TotalMB);
end;



function ComapreSpace(): Boolean;   // проверяем свободное место
var
  UndefNeedSize, UndefFreeSize: Extended;
begin
  UndefNeedSize := StrToFloat( GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption) );
  UndefFreeSize := Extended( GetFreeDriveSpace( WizardDirValue() ) );
  Result := UndefFreeSize > UndefNeedSize;
  if not Result then if MsgBox('На выбранном Вами жёстком диске не хватает' + #32 + FloatToStr(UndefNeedSize-UndefFreeSize) + #32 + 'MB' + #13#10 +
  'Изменить директорию установки?', mbError, MB_YESNO) = IDYES then
  begin
    WizardForm.BackButton.OnClick(nil);
    WizardForm.DirBrowseButton.OnClick(nil);
    Result := True;
  end;
end;


procedure ComponentsListOnClickCheck(Sender: TObject);
begin
  OldCompListOnClickCheckProc( TNewCheckListBox(Sender) );
  WizardForm.NextButton.Enabled := ComapreSpace();
  //WizardForm.Caption := GetFloatFormText(WizardForm.ComponentsDiskSpaceLabel.Caption); // debug
end;


procedure InitializeWizard();
begin
  OldCompListOnClickCheckProc := WizardForm.ComponentsList.OnClickCheck; // пишем указатель на старую/родную процедуру в переменную, чтоб делать с чеклистбоксом то что делает инно по умолчению в строке 61
  WizardForm.ComponentsList.OnClickCheck := @ComponentsListOnClickCheck;
end;


procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectComponents then WizardForm.NextButton.Enabled := ComapreSpace();
end;
Это сообщение посчитали полезным следующие участники:

Отправлено: 07:01, 30-03-2013 | #26


Аватара для habib2302

Ветеран


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

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


как в странице лицензии заменить Radio Button на Checkbox

-------
Помог? От "Полезное сообщение" не откажусь!!!


Отправлено: 16:19, 30-03-2013 | #27


Ветеран


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

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


Johny777, спасибо. Как я понял, по этому самому принципу можно извлечь кол-во необходимого места и из WizardForm.DiskSpaceLabel. Если нет компонентов в инстале.

Так верно?
читать дальше »
Код: Выделить весь код
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
DefaultGroupName=My Program

[Files]
Source: {win}\Fonts\*; DestDir: {app}; Flags: external; ExternalSize: 56459118550

[...Code]
function GetFloatFormText(const UndefText: String): String;
var
  i: Integer;
begin
  for i := 1 to Length(UndefText) do
  case UndefText[i] of
    '0','1','2','3','4','5','6','7','8','9': Result := Result + UndefText[i];
    ',': Result := Result + '.';
  end;
end;

function GetFreeDriveSpace(const UndefInstallPath: String): Cardinal;
var
  TotalMB: Cardinal;
begin
  GetSpaceOnDisk(ExtractFileDrive(UndefInstallPath), True, Result, TotalMB);
end;

procedure ComapreSpace(Sender: TObject);
var
  UndefNeedSize, UndefFreeSize: Extended;
begin
  case Sender of
    WizardForm.DirEdit:
    begin
      UndefNeedSize := StrToFloat(GetFloatFormText(WizardForm.DiskSpaceLabel.Caption));
      UndefFreeSize := Extended(GetFreeDriveSpace(WizardDirValue()));
      WizardForm.NextButton.Enabled := UndefFreeSize > UndefNeedSize;
      if WizardForm.NextButton.Enabled then
      WizardForm.DiskSpaceLabel.Font.Color := clBlack else WizardForm.DiskSpaceLabel.Font.Color := clRed;
    end;
  end;
end;

procedure InitializeWizard();
begin
  WizardForm.DirEdit.OnChange := @ComapreSpace;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
  if CurPageID = wpSelectDir then ComapreSpace(WizardForm.DirEdit);
end;


------------------------------------------------------------------------------------------------

habib2302,

читать дальше »
Код: Выделить весь код
[Setup]
AppName=My License
AppVerName=My License v 1.3
CreateAppDir=False
OutputDir=.
licenseFile=compiler:Examples\Readme.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;
Это сообщение посчитали полезным следующие участники:

Отправлено: 16:22, 30-03-2013 | #28


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


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

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


Спасибо за помощь ребята, это именно то, что я искал

Отправлено: 20:57, 30-03-2013 | #29


Аватара для audiofeel

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


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

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


доброй ночи всем, подскажите как мне сделать "DirEdit" и "GroupEdit" = Transparent, ну или может есть другой способ

Последний раз редактировалось audiofeel, 31-03-2013 в 02:43.


Отправлено: 01:55, 31-03-2013 | #30



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Скрипты Inno Setup. Помощь и советы [часть 5] El Sanchez Автоматическая установка приложений 1999 28-03-2013 19:09
Скрипты 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




 
Переход